2017-03-13 53 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

相關問題