如何检索使用特定优惠券的WooCommerce订单列表?

cap*_*sid 3 php wordpress orders coupon 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() ),
) ); 
Run Code Online (Sandbox Code Playgroud)

我试过了:

'meta_key' => 'coupon'
'meta_key' => 'shop_coupon'
'meta_key' => '_coupon'
Run Code Online (Sandbox Code Playgroud)

但这些都不起作用.我怎样才能找出哪些meta_key/ meta_value条款会给我我需要的东西?

另外我认为meta_query可以用来执行日期过滤作为此get_posts()查询的一部分,这是正确的吗?

Rau*_*pta 10

您的代码无效,因为默认情况下,WooCommerce不会在wp_postmeta表格中存储使用过的优惠券代码.它存储在 wp_woocommerce_order_items表格中,下面order_item_type => couponorder_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;
}
Run Code Online (Sandbox Code Playgroud)

代码位于活动子主题(或主题)的function.php文件中.或者也可以在任何插件php文件中.

用法

$orders = wh_getOrderbyCouponCode('my_code', '2016-09-17', '2016-10-07');
echo 'Total Discount : ' . $orders['full_discount'];
//print_r($orders);
Run Code Online (Sandbox Code Playgroud)

请注意:

所有日期均为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
)
Run Code Online (Sandbox Code Playgroud)

代码经过测试和运行.

希望这可以帮助!