如何检索使用特定优惠券的WooCommerce订单列表?
问题描述:
我正在尝试编写一个函数,用于检索使用指定优惠券代码并处于指定日期范围内的WooCommerce订单列表,然后总结应用于这些订单的总折扣。如何检索使用特定优惠券的WooCommerce订单列表?
一点谷歌搜索我觉得我应该用类似
$customer_orders = get_posts(array(
'numberposts' => -1,
'meta_key' => ???,
'meta_value' => $CouponToSearchFor,
'post_type' => wc_get_order_types(),
'post_status' => array_keys(wc_get_order_statuses()),
));
之后,我已经试过:
'meta_key' => 'coupon'
'meta_key' => 'shop_coupon'
'meta_key' => '_coupon'
但这些都不工作。我怎样才能找出哪些条件会给我我需要哪些meta_key
/meta_value
条款?
此外,我认为meta_query
可用于执行日期筛选作为此get_posts()
查询的一部分,是否正确?
答
您的代码不工作,因为在默认情况下WooCommerce简化版,商店 使用优惠券代码
wp_postmeta
表。它存储在wp_woocommerce_order_items
表,order_item_type => coupon
和order_item_name => YOUR_CODE
。
您必须首先获得所有订单ID,然后您必须循环才能获得所需的总计或税金或折扣。
下面是代码:
function wh_getOrderbyCouponCode($coupon_code, $start_date, $end_date) {
global $wpdb;
$return_array = [];
$total_discount = 0;
$query = "SELECT
p.ID AS order_id
FROM
{$wpdb->prefix}posts AS p
INNER JOIN {$wpdb->prefix}woocommerce_order_items AS woi ON p.ID = woi.order_id
WHERE
p.post_type = 'shop_order' AND
p.post_status IN ('" . implode("','", array_keys(wc_get_order_statuses())) . "') AND
woi.order_item_type = 'coupon' AND
woi.order_item_name = '" . $coupon_code . "' AND
DATE(p.post_date) BETWEEN '" . $start_date . "' AND '" . $end_date . "';";
$orders = $wpdb->get_results($query);
if (!empty($orders)) {
$dp = (isset($filter['dp']) ? intval($filter['dp']) : 2);
//looping throught all the order_id
foreach ($orders as $key => $order) {
$order_id = $order->order_id;
//getting order object
$objOrder = wc_get_order($order_id);
$return_array[$key]['order_id'] = $order_id;
$return_array[$key]['total'] = wc_format_decimal($objOrder->get_total(), $dp);
$return_array[$key]['total_discount'] = wc_format_decimal($objOrder->get_total_discount(), $dp);
$total_discount += $return_array[$key]['total_discount'];
}
// echo '<pre>';
// print_r($return_array);
}
$return_array['full_discount'] = $total_discount;
return $return_array;
}
代码放在您的活动子主题(或主题)的function.php文件。或者也可以在任何插件php文件中使用。
用法
$orders = wh_getOrderbyCouponCode('my_code', '2016-09-17', '2016-10-07');
echo 'Total Discount : ' . $orders['full_discount'];
//print_r($orders);
请注意:
所有日期为YYYY-MM-DD
格式。 print_r(array_keys(wc_get_order_statuses()));
将输出是这样的:
Array
(
[0] => wc-pending
[1] => wc-processing
[4] => wc-on-hold
[5] => wc-completed
[6] => wc-cancelled
[7] => wc-refunded
[8] => wc-failed
)
代码进行测试和作品。
希望这会有所帮助!
非常感谢你的解释。这是非常彻底的。我已经连接了我的实用程序插件中的函数,但是当我在查询后打印$ order时,它是一个空的Array()。我再次检查了优惠券代码和日期范围,以确保此输入的订单存在。我打印了$查询,并在那里看起来正确。我是PHP和Wordpress开发新手,但你的代码是有道理的,所以我想知道如果我做错了什么? – capsid
我可以使用phpMyAdmin中的部分查询来选择优惠券,所以我知道他们在那里。我也加倍检查以确保前缀是正确的。当我在phpMyAdmin中运行整个打印的查询时,我得到了同样的空集。谢谢你的想法。 – capsid
我可以在phpMyAdmin中一直选择正确的订单,直到零件和日期(p。post_date)在'11/01/2016'和'12/31/2016''之间' 当我在订单中添加该位时,即使我手动验证了适用订单的日期,也不再正确选择。 – capsid