榮譽給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-->
如果我只希望在某個類別中展示產品,該怎麼辦? – kevingilbert100 2015-02-10 04:57:45
好吧我自己想出了類別,但是另一個問題是如果我想讓它檢查元變量。例如,如果用戶有持續的訂閱,這個正在進行的訂閱將在每個產品元中在「payment_plan_subscription_id_text_field」下定義,並且插件im使用具有以下函數「woocommerce_members_only(array())」的檢查,那麼如果我想說如果客戶已購買該產品或||如果客戶在產品元內的該會員組內。 – kevingilbert100 2015-02-10 05:42:47
@ kmgilbert100你可以使用給定鏈接中的代碼來實現該目的..請閱讀;) – Reigel 2015-02-12 03:37:21