Прежде всего, я новичок и новичок в php, поэтому, пожалуйста, простите мое невежество. Сегодня я задал свой первый вопрос о stackoverflow, и кто-то был достаточно любезен, чтобы предоставить отличное решение, поэтому я даю ему еще одну попытку.
Я пытаюсь использовать функцию, чтобы проверить, покупает ли клиент продукт внутри массива идентификаторов продуктов, как на его страницах учетной записи при входе в систему. Мне нужно отобразить другое меню, если он купил продукт из массива A или продукт из массива B, массив C, вы его получите. Я хотел бы создать другую функцию для каждого массива идентификаторов продуктов и связать ее с другим коротким кодом.
Я нашел wc_customer_bought_product_function в ссылке на функции woocommerce, которая написана следующим образом:
/** * 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); } }
Но это не сработало. Когда я использую короткий код, меню больше не появляется, но оно не отображается, как только я купил продукт, идентификатор которого находится в массиве.
Я пробовал эту версию функции, основанную на другом примере:
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; }
Но это тоже не сработало. Штрих-код больше не действует, меню появляется во всех ситуациях.
Я написал это, используя различные функции, которые я использовал в качестве моделей и информации, на которые я наткнулся, и я, вероятно, сделал ужасные ошибки, потому что он не работает. Если у кого-то есть представление о том, что я сделал неправильно или как достичь этой цели по-другому, это будет огромной помощью! Спасибо.
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, см. Выше для коррекции.
Поэтому Дэвид помог мне подняться на правильный путь, и я должен был знать, как передать один идентификатор продукта за один раз внутри одной и той же функции, но я этого не сделал.
После некоторых исследований и исследований я написал новую функцию, используя команды else if для каждого идентификатора продукта, протестировал его и пока он работает.
Таким образом, даже если использование массива или идентификатора категории было бы более практичным (но я не знаю, как это сделать, пока), я использую это решение для других людей, которые могли бы достичь той же цели:
// 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); } }
Еще раз спасибо Дэвиду за указание направления 🙂 Конечно, если у кого-то есть лучшее решение или какие-либо ошибки в этом, пожалуйста, говорите.