2015-02-06 62 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

至少有兩種不同的方法可以解決這個問題。

首先是從每個帖子獲取產品,然後從每個產品獲取產品ID,然後使用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 2015-02-10 04:57:45

+0

好吧我自己想出了類別,但是另一個問題是如果我想讓它檢查元變量。例如,如果用戶有持續的訂閱,這個正在進行的訂閱將在每個產品元中在「payment_plan_subscription_id_text_field」下定義,並且插件im使用具有以下函數「woocommerce_members_only(array())」的檢查,那麼如果我想說如果客戶已購買該產品或||如果客戶在產品元內的該會員組內。 – kevingilbert100 2015-02-10 05:42:47

+0

@ kmgilbert100你可以使用給定鏈接中的代碼來實現該目的..請閱讀;) – Reigel 2015-02-12 03:37:21

-2

不知道這是否可以幫助你,但有一個由WooThemes開發的plugin支持購買歷史記錄。

+0

我認爲樓主是要求一個頁面展現給用戶所購買的所有產品,而WooCommerce客戶歷史記錄插件爲店主提供後端分析 – Kirby 2015-04-29 18:59:33

8

榮譽給Appleman1234提供兩個答案,兩者都將正常工作。

ApppleMan1234的第一個答案,他提供了一個例子,是循環遍歷所有產品,然後通過調用wc_customer_bought_product()來過濾它們。這當然會起作用。如果您有n產品,那麼您將製作n+1數據庫查詢。

他的第二個建議是鏈接到Brajesh Singh撰寫的帖子,他在2013年6月2日發佈了fusedpress.com上的解決方案。原始帖子不再可用。我在Google上找到cached copy

Brajesh Singh的解決方案查詢用戶的訂單,然後查詢訂單詳細信息,並在訂單商品的元數據中查詢產品ID。這個解決方案總是隻有3個查詢。除非你的店鋪只有1或2種產品,否則這種解決方案要好得多。

以下是Brajesh Singh的代碼的稍微編輯版本。

/** 
* 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的第二個解決方案(非常感謝你)。 – 2016-05-31 08:49:50

相關問題