首先,我是初学者和php的新手,所以请原谅我的无知。今天我问了关于stackoverflow的第一个问题,有人提供了一个很好的解决方案,所以我再试一次。
我正在尝试使用一个函数来检查客户是否在登录时在帐户页面中的产品ID数组中购买了产品如果他从阵列A购买产品或从阵列购买产品,则需要显示不同的菜单B,阵列C,你明白了。我想为每个产品ID数组创建一个不同的函数,并将其与不同的短代码相关联。
我在woocommerce函数参考中找到了wc_customer_bought_product_function,其编写如下:
/**
* Checks if a user (by email) has bought an item
*
* @access public
* @param string $customer_email
* @param int $user_id
* @param int $product_id
* @return bool
*/
function wc_customer_bought_product( $customer_email, $user_id, $product_id ) {
global $wpdb;
$emails = array();
if ( $user_id ) {
$user = get_user_by( 'id', $user_id );
$emails[] = $user->user_email;
}
if ( is_email( $customer_email ) ) {
$emails[] = $customer_email;
}
if ( sizeof( $emails ) == 0 ) {
return false;
}
return $wpdb->get_var(
$wpdb->prepare( "
FROM {$wpdb->prefix}woocommerce_order_items as order_items
LEFT JOIN {$wpdb->prefix}woocommerce_order_itemmeta AS itemmeta ON order_items.order_item_id
= itemmeta.order_item_id
LEFT JOIN {$wpdb->postmeta} AS postmeta ON order_items.order_id = postmeta.post_id
LEFT JOIN {$wpdb->posts} AS posts ON order_items.order_id = posts.ID
WHERE
posts.post_status IN ( 'wc-completed', 'wc-processing' ) AND
itemmeta.meta_value = %s AND
itemmeta.meta_key IN ( '_variation_id', '_product_id' ) AND
postmeta.meta_key IN ( '_billing_email', '_customer_user' ) AND
(
postmeta.meta_value IN ( '" . implode( "','", array_unique( $emails ) ) . "' ) OR
(
postmeta.meta_value = %s AND
postmeta.meta_value > 0
)
)
", $product_id, $user_id
)
);
}
所以我尝试通过转换最后一个参数来实现我想要的目标:
// Create function to check if client bought a product from array A
function check_is_category_A_customer()
{
global $woocommerce;
$user_id = get_current_user_id();
$customer_email = $current_user->email;
if (wc_customer_bought_product( $customer_email, $user_id, $product_id=array ('2258', '2253',
'2242')))
return true;
return false;
}
// Create shortcode to display menu for customers cat A
add_shortcode('CATA','check_cat_bought_A');
function check_cat_bought_A($atts,$content=""){
if( check_is_category_A_customer() ){
return do_shortcode($content);
}
}
但它没有用。当我使用短代码时,菜单不再出现,但是一旦我购买了ID在阵列中的产品,它就不会显示。
我根据另一个例子尝试了这个版本的功能:
function check_is_category_A_customer()
{
global $woocommerce;
$user_id = get_current_user_id();
$customer_email = $current_user->email;
if ( '' !=wc_customer_bought_product( $customer_email, $user_id, $product_id=array ('2258',
'2253', '2242'), true))
return true;
return false;
}
但这也不起作用。短代码不再有效,菜单出现在所有情况下。
我用不同的功能写了这个作为我偶然发现的模型和信息,我可能犯了很多错误,因为它不起作用。如果有人知道我做错了什么或如何以不同的方式实现这个目标,那将是一个巨大的帮助!谢谢。
答案 0 :(得分:1)
function check_is_category_A_customer(array $product_ids)
{
$product_ids= array ('2258','2253','2242');//for testing
global $woocommerce;
$user_id = get_current_user_id();
$current_user= wp_get_current_user();
$customer_email = $current_user->email;
foreach($product_ids as $item):
if ( wc_customer_bought_product( $customer_email, $user_id, $item) )
return true;
endforeach;
return false;
}
您没有设置$ current_user对象,请参阅上面的更正。
答案 1 :(得分:0)
所以大卫帮助我走上了正确的轨道,我应该知道如何在同一个功能中同时传递1个产品ID,但我没有。
经过一些研究和研究,我使用else if语句为每个产品id编写了一个新函数,对其进行了测试,并且到目前为止它正在运行。
所以,即使使用数组或类别ID也会更实用(但我不知道该怎么做),我正在为其他可能想达到同一目标的人分享这个解决方案: / p>
// Create function to check if client bought a product from array A
function check_is_category_A_customer()
{
global $woocommerce;
$user_id = get_current_user_id();
$current_user= wp_get_current_user();
$customer_email = $current_user->email;
if ( wc_customer_bought_product( $customer_email, $user_id,'2258')) {
return true;
} else if ( wc_customer_bought_product( $customer_email, $user_id,'2253')) {
return true;
} else if ( wc_customer_bought_product( $customer_email, $user_id,'2242')) {
return true;
}
return false;
}
// Create shortcode to display menu for customers cat A
add_shortcode('CATA','check_cat_bought_A');
function check_cat_bought_A($atts,$content=""){
if( check_is_category_A_customer() ){
return do_shortcode($content);
}
}
再次感谢大卫指出方向:)当然,如果有人有更好的解决方案,或者看到任何错误,请说出来。