WooCommerce - 检查用户是否在过去 60 天内购买了产品
WooCommerce - Check if user purchased a product in the past 60 days
我是 WooCommerce 的新手,想检查用户是否在过去 60 天内购买了特定产品(产品 ID # 514)。这是我让人们按月购买的产品,所以它会重复出现很多次。我只想看看他们是否购买了最近的(我认为是活跃的)
我现在想的方法是:
- 获取用户的所有订单
- 对于每个订单,检查它是否发生在过去 60 天内
并获取此订单的所有产品
- 对于每个产品,查看id是否为x
虽然我确信这会起作用,但我有一种有趣的感觉,有一个非常简洁的 get_posts(apply_filters( 查询将节省我有一些循环时间。
是否有人愿意分享一些想法或解决方案?
谢谢!
这里是部分基于woocommerce内置函数wc_customer_bought_product
的条件函数wc_customer_bought_product
源码查询:
有 3 个可选参数 $user_id
、$product_ids
和 $days
:
$user_id
将允许您指定定义的用户 ID(当当前登录用户未使用时);
$product_ids
(字符串或数组)将允许指定要检查的已定义产品 ID
$days
将允许您指定要搜索的天数 (如果您愿意,也可以指定时间段)…
代码功能:
function has_bought_multi( $user_id = 0, $product_ids = 0, $days = 0 ) {
global $wpdb;
$customer_id = $user_id == 0 || $user_id == '' ? get_current_user_id() : $user_id;
$statuses = array_map( 'esc_sql', wc_get_is_paid_statuses() );
$date = date('Y-m-d H:i:s', strtotime("-$days day") );
if ( is_array( $product_ids ) )
$product_ids = implode(',', $product_ids);
if ( $product_ids != ( 0 || '' ) )
$query_line = "AND woim.meta_value IN ($product_ids)";
else
$query_line = "AND woim.meta_value != 0";
// Count the number of products
$product_count_query = $wpdb->get_col( "
SELECT COUNT(woim.meta_value) FROM {$wpdb->prefix}posts AS p
INNER JOIN {$wpdb->prefix}postmeta AS pm ON p.ID = pm.post_id
INNER JOIN {$wpdb->prefix}woocommerce_order_items AS woi ON p.ID = woi.order_id
INNER JOIN {$wpdb->prefix}woocommerce_order_itemmeta AS woim ON woi.order_item_id = woim.order_item_id
WHERE p.post_status IN ( 'wc-" . implode( "','wc-", $statuses ) . "' )
AND p.post_date > '$date'
AND pm.meta_key = '_customer_user'
AND pm.meta_value = $customer_id
AND woim.meta_key IN ( '_product_id', '_variation_id' )
$query_line
" );
// Set the count in a string
$count = reset($product_count_query);
// Return a boolean value if count is higher than 0
return $count > 0 ? true : false;
}
代码进入您的活动子主题(或主题)的 function.php 文件或任何插件文件。
此代码已在 Woocommerce 3+ 上测试并有效。
相似答案:
使用示例(客户已登录):
正在检测当前用户是否在过去 60 天内购买了您的产品 ID #514:
if( has_bought_multi( '', 514, 60 ) ){
echo "<p>Customer has bought product id # 514 in past 60 days</p>";
// do something
} else {
echo "<p>Customer <strong>HAS NOT</strong> bought product id # 514 in past 60 days</p>";
// do something else
}
我是 WooCommerce 的新手,想检查用户是否在过去 60 天内购买了特定产品(产品 ID # 514)。这是我让人们按月购买的产品,所以它会重复出现很多次。我只想看看他们是否购买了最近的(我认为是活跃的)
我现在想的方法是:
- 获取用户的所有订单
- 对于每个订单,检查它是否发生在过去 60 天内 并获取此订单的所有产品
- 对于每个产品,查看id是否为x
虽然我确信这会起作用,但我有一种有趣的感觉,有一个非常简洁的 get_posts(apply_filters( 查询将节省我有一些循环时间。
是否有人愿意分享一些想法或解决方案?
谢谢!
这里是部分基于woocommerce内置函数wc_customer_bought_product
的条件函数wc_customer_bought_product
源码查询:
有 3 个可选参数 $user_id
、$product_ids
和 $days
:
$user_id
将允许您指定定义的用户 ID(当当前登录用户未使用时);$product_ids
(字符串或数组)将允许指定要检查的已定义产品 ID$days
将允许您指定要搜索的天数 (如果您愿意,也可以指定时间段)…
代码功能:
function has_bought_multi( $user_id = 0, $product_ids = 0, $days = 0 ) {
global $wpdb;
$customer_id = $user_id == 0 || $user_id == '' ? get_current_user_id() : $user_id;
$statuses = array_map( 'esc_sql', wc_get_is_paid_statuses() );
$date = date('Y-m-d H:i:s', strtotime("-$days day") );
if ( is_array( $product_ids ) )
$product_ids = implode(',', $product_ids);
if ( $product_ids != ( 0 || '' ) )
$query_line = "AND woim.meta_value IN ($product_ids)";
else
$query_line = "AND woim.meta_value != 0";
// Count the number of products
$product_count_query = $wpdb->get_col( "
SELECT COUNT(woim.meta_value) FROM {$wpdb->prefix}posts AS p
INNER JOIN {$wpdb->prefix}postmeta AS pm ON p.ID = pm.post_id
INNER JOIN {$wpdb->prefix}woocommerce_order_items AS woi ON p.ID = woi.order_id
INNER JOIN {$wpdb->prefix}woocommerce_order_itemmeta AS woim ON woi.order_item_id = woim.order_item_id
WHERE p.post_status IN ( 'wc-" . implode( "','wc-", $statuses ) . "' )
AND p.post_date > '$date'
AND pm.meta_key = '_customer_user'
AND pm.meta_value = $customer_id
AND woim.meta_key IN ( '_product_id', '_variation_id' )
$query_line
" );
// Set the count in a string
$count = reset($product_count_query);
// Return a boolean value if count is higher than 0
return $count > 0 ? true : false;
}
代码进入您的活动子主题(或主题)的 function.php 文件或任何插件文件。
此代码已在 Woocommerce 3+ 上测试并有效。
相似答案:
使用示例(客户已登录):
正在检测当前用户是否在过去 60 天内购买了您的产品 ID #514:
if( has_bought_multi( '', 514, 60 ) ){
echo "<p>Customer has bought product id # 514 in past 60 days</p>";
// do something
} else {
echo "<p>Customer <strong>HAS NOT</strong> bought product id # 514 in past 60 days</p>";
// do something else
}