WooCommerce 仅显示已购买的商品
WooCommerce Display Purchased Items Only
所以我在网上看了很多,找不到解决办法...
基本上我想做的是显示用户在商店购买的所有产品的产品循环,就像显示普通产品一样。
如果你还是不明白,也许这会帮助你理解我的意思..
这是 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-->
那么,如果我想显示基本相同的完全相同的产品循环,但是将其过滤掉,以便它只显示用户已经购买的产品怎么办。
老实说,我不知道该去哪里,我相信过去还有其他人对此做过研究,所以也许这会对很多人有所帮助!
提前致谢!
不确定这是否对您有帮助,但 WooThemes 开发了一个 plugin 来支持购买历史记录。
您至少可以采用两种不同的方法来解决这个问题。
首先是从每个post中获取产品,然后从每个产品中获取产品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-->
感谢 Appleman1234 提供了两个答案,这两个答案都有效。
ApppleMan1234 提供示例的第一个答案是循环遍历所有产品,然后通过调用 wc_customer_bought_product()
过滤它们。这肯定会奏效。如果您有 n
个产品,那么您将进行 n+1
个数据库查询。
他的第二个建议是 link 到 Brajesh Singh 写的 post,他于 2013 年 6 月 2 日在 fusedpress.com 上发布了一个解决方案。原来的post已经没有了。我在 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-->
所以我在网上看了很多,找不到解决办法...
基本上我想做的是显示用户在商店购买的所有产品的产品循环,就像显示普通产品一样。
如果你还是不明白,也许这会帮助你理解我的意思..
这是 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-->
那么,如果我想显示基本相同的完全相同的产品循环,但是将其过滤掉,以便它只显示用户已经购买的产品怎么办。
老实说,我不知道该去哪里,我相信过去还有其他人对此做过研究,所以也许这会对很多人有所帮助!
提前致谢!
不确定这是否对您有帮助,但 WooThemes 开发了一个 plugin 来支持购买历史记录。
您至少可以采用两种不同的方法来解决这个问题。
首先是从每个post中获取产品,然后从每个产品中获取产品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-->
感谢 Appleman1234 提供了两个答案,这两个答案都有效。
ApppleMan1234 提供示例的第一个答案是循环遍历所有产品,然后通过调用 wc_customer_bought_product()
过滤它们。这肯定会奏效。如果您有 n
个产品,那么您将进行 n+1
个数据库查询。
他的第二个建议是 link 到 Brajesh Singh 写的 post,他于 2013 年 6 月 2 日在 fusedpress.com 上发布了一个解决方案。原来的post已经没有了。我在 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-->