Таким образом, я сделал кучу поиска по сети и не смог найти решение для этого …
В основном то, что я пытаюсь сделать, это отобразить цикл продуктов всех продуктов, которые пользователь приобрел в магазине, так же, как отображение обычных продуктов.
Если вы все еще не понимаете, возможно, это поможет вам понять, что я имею в виду.
Вот пример цикла продукта в документации WooCommerce …
<ul class="products"> <?php $args = array( 'post_type' => 'product', 'posts_per_page' => 12 ); $loop = new WP_Query( $args ); if ( $loop->have_posts() ) { while ( $loop->have_posts() ) : $loop->the_post(); woocommerce_get_template_part( 'content', 'product' ); endwhile; } else { echo __( 'No products found' ); } wp_reset_postdata(); ?> </ul><!--/.products-->
Итак, что, если бы я хотел отобразить в основном этот точный точный цикл продуктов, но отфильтруйте его так, чтобы он отображал только те продукты, которые пользователь уже приобрел.
Я честно не знаю, где пойти с этим, и я уверен, что есть и другие, которые уже проводили исследования в прошлом, поэтому, возможно, это поможет собрать людей!
Заранее спасибо!
Для решения этой проблемы вы можете принять по крайней мере два разных подхода.
Во-первых, чтобы получить продукт из каждого сообщения, а затем получить идентификатор продукта из каждого продукта, а затем использовать оператор if для фильтрации с использованием wc_customer_bought_product или woocommerce_customer_bought_product (если вы используете старый WooCommerece).
Второй – передать правильные аргументы для фильтрации WP_Query, чтобы включать только заказы, приобретенные пользователем, и затем фильтровать продукты только в этих заказах. Более подробную информацию о втором подходе можно найти в разделе « Получить все пользовательские заказы и продукты», приобретенные пользователем в магазине WooCommerce (archive.org) .
Примером первого подхода является нечто вроде
<!-- code started --> <ul class="products"> <?php $user_id = get_current_user_id(); $current_user= wp_get_current_user(); $customer_email = $current_user->email; $args = array( 'post_type' => 'product', 'posts_per_page' => 12 ); $loop = new WP_Query( $args ); if ( $loop->have_posts() ) { while ( $loop->have_posts() ) : $loop->the_post(); $_product = get_product( $loop->post->ID ); if (wc_customer_bought_product($customer_email, $user_id,$_product->id)){ woocommerce_get_template_part( 'content', 'product' ); } endwhile; } else { echo __( 'No products found' ); } wp_reset_postdata(); ?> </ul><!--/.products-->
Престижность Appleman1234 за предоставление двух ответов, оба из которых будут работать.
Первый ответ ApppleMan1234, на который он привел пример, – это wc_customer_bought_product()
все продукты, а затем отфильтровать их, вызвав wc_customer_bought_product()
. Это, безусловно, сработает. Если у вас есть n
продуктов, вы будете делать n+1
запросов к базе данных.
Его второе предложение – это ссылка на сообщение, написанное Браджешем Сингхом, которое 2 июня 2013 года опубликовало решение на fusedpress.com. Оригинальный пост больше не доступен. Я нашел кешированную копию в Google.
Решение Брайеша Сингха запрашивает заказы пользователя, затем запрашивает детали заказа и последний запрашивает идентификатор продукта в метаданных элемента заказа. Это решение всегда будет только 3-мя запросами. Если ваш магазин имеет только 1 или 2 продукта, это решение намного лучше.
Вот немного отредактированная версия кода Браджеша Сингха.
/** * Get all Products Successfully Ordered by the user * @return bool|array false if no products otherwise array of product ids */ function so28362162_get_all_products_ordered_by_user() { $orders = so28362162_get_all_user_orders(get_current_user_id(), 'completed'); if(empty($orders)) { return false; } $order_list = '(' . join(',', $orders) . ')';//let us make a list for query //so, we have all the orders made by this user that were completed. //we need to find the products in these orders and make sure they are downloadable. global $wpdb; $query_select_order_items = "SELECT order_item_id as id FROM {$wpdb->prefix}woocommerce_order_items WHERE order_id IN {$order_list}"; $query_select_product_ids = "SELECT meta_value as product_id FROM {$wpdb->prefix}woocommerce_order_itemmeta WHERE meta_key=%s AND order_item_id IN ($query_select_order_items)"; $products = $wpdb->get_col($wpdb->prepare($query_select_product_ids, '_product_id')); return $products; } /** * Returns all the orders made by the user * @param int $user_id * @param string $status (completed|processing|canceled|on-hold etc) * @return array of order ids */ function so28362162_get_all_user_orders($user_id, $status = 'completed') { if(!$user_id) { return false; } $args = array( 'numberposts' => -1, 'meta_key' => '_customer_user', 'meta_value' => $user_id, 'post_type' => 'shop_order', 'post_status' => 'publish', 'tax_query' => array( array( 'taxonomy' => 'shop_order_status', 'field' => 'slug', 'terms' => $status ) ) ); $posts = get_posts($args); //get the post ids as order ids return wp_list_pluck($posts, 'ID'); }
Объединяя это с петлей продукта из вопроса, плюс не устаревший wc_get_template_part()
и добавление posts_per_page=-1
дает нам
<ul class="products"> <?php $args = array( 'post_type' => 'product', 'post__in' => so28362162_get_all_products_ordered_by_user(), 'posts_per_page' => -1 ); $loop = new WP_Query($args); if($loop->have_posts()) { while($loop->have_posts()) : $loop->the_post(); wc_get_template_part('content', 'product'); endwhile; } else { echo __('No products found'); } wp_reset_postdata(); ?> </ul><!--/.products-->
Не уверен, что это поможет вам вообще, но есть плагин, разработанный WooThemes для поддержки истории покупок.