2015-02-06 7 views
6

Так что я сделал кучу озираясь в Интернете и не смогли найти решение для этого ...WooCommerce Показать купленные товары Только

В основном то, что я пытаюсь сделать, это показать цикл произведения всех продукты, приобретенные пользователем в магазине, так же, как отображение обычных продуктов.

Если вы до сих пор не понимаю, может быть, это поможет вам получить то, что я имею в виду ..

Вот петля пример продукта на документации 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--> 

Так что, если я хотел отобразить в основном этот же точный цикл продуктов, но отфильтровать его так, чтобы он отображал только те продукты, которые пользователь уже приобрел.

Я честно не знаю, куда идти с этим, и я уверен, что есть и другие, которые проводили исследования по этому поводу в прошлом, поэтому, возможно, это поможет собрать людей!

Заранее благодарен!

ответ

9

Для решения этой проблемы существует, по крайней мере, два разных подхода.

Первый заключается в том, чтобы получить продукт с каждого сообщения, а затем получить идентификатор продукта из каждого продукта, а затем использовать оператор if для фильтрации с использованием wc_customer_bought_product или woocommerce_customer_bought_product (если вы используете старый WooCommerece).

Второе - передать правильные аргументы, чтобы фильтровать WP_Query, чтобы включать только заказы, приобретенные пользователем, а затем фильтровать продукты только в этих заказах. Более подробную информацию о втором подходе можно получить по телефону Get All User Orders and Products bought by user in WooCommerce based shop (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--> 
+0

Что делать, если я хотел показывать только продукты в определенной категории? – kevingilbert100

+0

Хорошо, я выяснил категорию самостоятельно, но еще один вопрос: что, если я хочу, чтобы он проверял мета-переменную. Например, если пользователь имеет постоянную подписку, эта текущая подписка будет определена в каждой метатеме продуктов в разделе «payment_plan_subscription_id_text_field», а плагин im использует проверки со следующей функцией «woocommerce_members_only (array())», так что, если бы я хотел сказать, клиент купил этот товар ИЛИ || если клиент входит в эту группу членства в метате. – kevingilbert100

+0

@ kmgilbert100 вы можете достичь этого, используя код из данной ссылки .. пожалуйста, прочтите это;) – Reigel

-2

Не уверен, что это поможет вам вообще, но есть plugin, разработанный WooThemes, чтобы поддерживать историю покупок.

+0

Я думаю, что оригинальный плакат просит страницу, чтобы показать на пользователь все продукты, приобретенные этим пользователем, тогда как плагин History History WooCommerce предоставляет бэкэнд-аналитику владельцам магазинов – Kirby

8

Престижность Appleman1234 для обеспечения двух ответов, оба из которых будут работать.

Первый ответ ApppleMan1234, который он привел в качестве примера, - это перебрать все продукты, а затем отфильтровать их, вызвав wc_customer_bought_product(). Это, безусловно, сработает. Если у вас есть n продуктов, тогда вы будете делать n+1 запросов к базе данных.

Его второе предложение - это ссылка на сообщение, написанное Brajesh Singh, которое 2 июня 2013 года опубликовало решение на fusedpress.com. Оригинальный пост больше не доступен. Я нашел cached copy в Google.

Решение Brajesh Singh запрашивает заказы пользователя, затем запрашивает данные заказа и последний запрашивает идентификатор продукта в метаданных элемента заказа. Это решение всегда будет только 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--> 
+0

Боюсь, что ваша кеш-ссылка тоже недоступна :(Спасибо за ваше объяснение. Попробуй второе решение AppleMan1234 (большое вам спасибо). –

Смежные вопросы