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-->
Đ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
Đượ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
@ 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