2017-03-13 7 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_queryget_posts() 쿼리의 일환으로 날짜 필터링을 수행하는 데 사용할 수 있다고 생각합니까? 맞습니까?

답변

5

코드는 기본 WooCommerce 스토어 이 wp_postmeta 테이블에 쿠폰 코드를 사용 does't 때문으로 작동하지 않습니다. order_item_type => couponorder_item_name => YOUR_CODE 아래에 wp_woocommerce_order_items 테이블을 저장합니다.

먼저 모든 주문 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 파일에서.

USAGE

$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

설명해 주셔서 감사합니다. 그것은 매우 철저합니다. 나는 내 유틸리티 플러그인 안에 함수를 연결했지만 쿼리 후 $ orders를 출력하면 빈 Array()가됩니다. 나는이 입력에 대한 주문이 존재하는지 확인하기 위해 쿠폰 코드와 날짜 범위를 두 번 확인했습니다. 그리고 나는 $ query를 출력했고 모든 것이 올바르게 보였다. 나는 PHP와 Wordpress 개발에 익숙하지 만 코드가 의미가있어 뭔가 잘못하고 있는지 궁금해하고 있니? – capsid

+0

phpMyAdmin에서 검색어의 일부를 사용하여 쿠폰을 선택할 수 있으므로 그곳에 있다는 것을 알고 있습니다. 또한 접두사가 올바른지 두 번 확인했습니다. phpMyAdmin에서 전체 인쇄 된 쿼리를 실행할 때 동일한 빈 집합을 얻습니다. 당신의 생각에 감사드립니다. – capsid

+0

필자는 phpMyAdmin에서 'AND DATE'부분까지 주문을 올바르게 선택할 수 있습니다 (p.post_date) BETWEEN '11/01/2016 'AND '12/31/2016'' 해당 주문의 날짜를 수동으로 확인한 경우에도 해당 주문의 비트를 더 이상 올바르게 선택하지 않습니다. – capsid