【问题标题】:How to retrieve a list of WooCommerce orders which use a particular coupon?如何检索使用特定优惠券的 WooCommerce 订单列表?
【发布时间】:2017-08-03 19:17:48
【问题描述】:

我正在尝试编写一个函数来检索使用指定优惠券代码并在指定日期范围内的 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() 查询的一部分,对吗?

【问题讨论】:

    标签: php wordpress woocommerce orders coupon


    【解决方案1】:

    您的代码不起作用,因为默认情况下 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;
    }
    

    代码进入您的活动子主题(或主题)的 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
    )
    

    代码已经过测试并且可以工作。

    希望这会有所帮助!

    【讨论】:

    • 非常感谢您的解释。这是非常彻底的。我已经在我的实用程序插件中连接了该函数,但是当我在查询后打印 $orders 时,它是一个空的 Array()。我仔细检查了优惠券代码和日期范围,以确保此输入存在订单。我打印了 $query ,那里的一切看起来都是正确的。我是 PHP 和 Wordpress 开发的新手,但你的代码很有意义,所以我想知道我是否做错了什么?
    • 我可以使用您在 phpMyAdmin 中的部分查询来选择优惠券,所以我知道它们在那里。我还仔细检查了前缀是否正确。当我在 phpMyAdmin 中运行整个打印查询时,我得到了相同的空集。感谢您的想法。
    • 我可以在 phpMyAdmin 中正确选择订单,一直到 AND DATE(p.post_date) BETWEEN '11/01/2016' AND '12/31/2016' 部分当我在订单中添加该位时,即使我手动验证了适用订单的日期,也无法正确选择。
    • 好的,我想我没有以正确的 YYYY-MM-DD 格式向函数提供日期。我会解决这个问题,然后再回来查看。谢谢!
    • 就是这样!在将日期传递给您的函数之前,我需要做的就是:$d1 = date('Y-m-d', strtotime($start_date)); 再次感谢 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-09
    • 2017-09-24
    • 1970-01-01
    • 2021-04-07
    • 2018-05-11
    • 2017-12-12
    • 2017-05-02
    相关资源
    最近更新 更多