2017-03-13 56 views
1

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

回答

5

您的代码不工作,因为在默认情况下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 
) 

代码进行测试和作品。

希望这会有所帮助!

+0

非常感谢你的解释。这是非常彻底的。我已经连接了我的实用程序插件中的函数,但是当我在查询后打印$ order时,它是一个空的Array()。我再次检查了优惠券代码和日期范围,以确保此输入的订单存在。我打印了$查询,并在那里看起来正确。我是PHP和Wordpress开发新手,但你的代码是有道理的,所以我想知道如果我做错了什么? – capsid

+0

我可以使用phpMyAdmin中的部分查询来选择优惠券,所以我知道他们在那里。我也加倍检查以确保前缀是正确的。当我在phpMyAdmin中运行整个打印的查询时,我得到了同样的空集。谢谢你的想法。 – capsid

+0

我可以在phpMyAdmin中一直选择正确的订单,直到零件和日期(p。post_date)在'11/01/2016'和'12/31/2016''之间' 当我在订单中添加该位时,即使我手动验证了适用订单的日期,也不再正确选择。 – capsid

相关问题