2015-02-06 17 views
6

Vì vậy, tôi đã làm một loạt các tìm kiếm khắp nơi trên web và không thể tìm thấy một giải pháp cho điều này ...WooCommerce Display Mua Items Chỉ

Về cơ bản những gì tôi đang cố gắng làm là hiển thị một vòng lặp sản phẩm của tất cả các các sản phẩm mà người dùng đã mua trong cửa hàng giống như hiển thị các sản phẩm thông thường.

Nếu bạn vẫn không hiểu có lẽ đây sẽ giúp bạn có được những gì tôi muốn nói ..

Dưới đây là ví dụ sản phẩm vòng lặp trên các tài liệu 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--> 

Vì vậy, những gì nếu tôi muốn hiển thị về cơ bản vòng lặp sản phẩm chính xác này, tuy nhiên lọc nó ra để nó chỉ hiển thị các sản phẩm mà người dùng đã mua.

Tôi thành thật không biết đi đâu với điều này và tôi chắc chắn có những người khác đã nghiên cứu về điều này trong quá khứ vì vậy có lẽ điều này sẽ giúp một nhóm người!

Cảm ơn trước!

Trả lời

9

Có ít nhất hai cách tiếp cận khác nhau mà bạn có thể thực hiện để giải quyết vấn đề này.

Đầu tiên là lấy sản phẩm từ mỗi bài đăng, sau đó lấy ID sản phẩm từ mỗi sản phẩm và sau đó sử dụng câu lệnh if để lọc bằng cách sử dụng wc_customer_bought_product hoặc woocommerce_customer_bought_product (nếu bạn đang sử dụng WooCommerece cũ).

Thứ hai là chuyển các đối số chính xác để lọc WP_Query chỉ bao gồm các đơn đặt hàng do người dùng mua và sau đó chỉ lọc các sản phẩm trong các đơn đặt hàng đó. Thông tin thêm về phương pháp thứ hai có sẵn tại Get All User Orders and Products bought by user in WooCommerce based shop (archive.org).

Một ví dụ về cách tiếp cận đầu tiên là một cái gì đó giống như

<!-- 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

Điều gì sẽ xảy ra nếu tôi chỉ muốn hiển thị các sản phẩm trong một danh mục nhất định? – kevingilbert100

+0

Được rồi, tôi đã tự tìm ra thể loại, nhưng một câu hỏi khác nếu tôi muốn làm cho nó kiểm tra một biến meta. Ví dụ: nếu người dùng có đăng ký liên tục, đăng ký đang diễn ra này sẽ được xác định trong từng sản phẩm meta trong "payment_plan_subscription_id_text_field" và plugin im sử dụng các kiểm tra có chức năng sau "woocommerce_members_only (array())" vì vậy nếu tôi muốn nói khách hàng đã mua sản phẩm đó HOẶC || nếu khách hàng nằm trong nhóm thành viên đó trong meta sản phẩm. – kevingilbert100

+0

@ kmgilbert100 bạn có thể đạt được điều đó bằng cách sử dụng mã từ liên kết đã cho .. hãy đọc điều đó;) – Reigel

-2

Bạn không chắc chắn điều này có giúp ích gì cho bạn hay không, nhưng có một số plugin do WooThemes phát triển để hỗ trợ lịch sử mua hàng.

+0

Tôi nghĩ rằng các poster ban đầu là yêu cầu cho một trang để hiển thị cho các người dùng tất cả các sản phẩm được mua bởi người dùng đó trong khi Plugin lịch sử khách hàng WooCommerce cung cấp phân tích phụ trợ cho chủ cửa hàng – Kirby

8

Kudos để Appleman1234 cho việc cung cấp hai câu trả lời, cả hai đều sẽ làm việc.

Câu trả lời đầu tiên của ApppleMan1234 mà ông đã cung cấp ví dụ là lặp qua tất cả các sản phẩm và sau đó lọc chúng bằng cách gọi wc_customer_bought_product(). Điều này chắc chắn sẽ làm việc. Nếu bạn có n sản phẩm thì bạn sẽ thực hiện các truy vấn cơ sở dữ liệu n+1.

Đề xuất thứ hai của ông là liên kết tới một bài đăng được viết bởi Brajesh Singh, vào ngày 2 tháng 6 năm 2013, đã xuất bản giải pháp trên fusedpress.com. Bài đăng gốc không còn nữa. Tôi đã tìm thấy một số cached copy tại Google.

Giải pháp của Brajesh Singh truy vấn các đơn đặt hàng của người dùng, sau đó truy vấn chi tiết đơn hàng và truy vấn cuối cùng id sản phẩm trong siêu dữ liệu của mục hàng. Giải pháp này sau đó luôn luôn chỉ có 3 truy vấn. Trừ khi cửa hàng của bạn chỉ có 1 hoặc 2 sản phẩm, giải pháp này là tốt hơn nhiều.

Đây là phiên bản được chỉnh sửa hơi của mã 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'); 
} 

Kết hợp điều đó với một vòng lặp sản phẩm từ các câu hỏi, cộng với một tổ chức phi bị phản đối wc_get_template_part() và một sự bổ sung của posts_per_page=-1 cho chúng ta

<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

Tôi sợ liên kết đã lưu trong bộ nhớ cache của bạn cũng bị lỗi :(Cảm ơn bạn đã giải thích. sẽ thử với giải pháp thứ hai của AppleMan1234 (cảm ơn các bạn rất nhiều). –

Các vấn đề liên quan