2017-08-23 184 views
2

在Woocommerce API我看到一个方法wc_get_ordersWoocommerce:获取所有订单产品

WooCommerce Order Functions

在提到ARGS我没有看到一个论点,我可以提供一个产品ID或对象限制订单仅针对该特定产品。

有没有一种方法可以过滤仅针对特定产品的订单?

我需要使用此方法,因为有些参数是必要的

+0

此得到真正WC_Order对象的https:// WWW .rfmeier.net/get-all-order-for-product-in-woocommerce/ –

回答

1

编辑 此功能不存在,但它可以建造的。所以,下面的函数将返回所有订单ID数组对于给定的产品ID,做出正确的SQL查询:

/** 
* Get All orders IDs for a given product ID. 
* 
* @param integer $product_id (required) 
* @param array $order_status (optional) Default is 'wc-completed' 
* 
* @return array 
*/ 
function get_orders_ids_by_product_id($product_id, $order_status = array('wc-completed')){ 
    global $wpdb; 

    $results = $wpdb->get_col(" 
     SELECT order_items.order_id 
     FROM {$wpdb->prefix}woocommerce_order_items as order_items 
     LEFT JOIN {$wpdb->prefix}woocommerce_order_itemmeta as order_item_meta ON order_items.order_item_id = order_item_meta.order_item_id 
     LEFT JOIN {$wpdb->posts} AS posts ON order_items.order_id = posts.ID 
     WHERE posts.post_type = 'shop_order' 
     AND posts.post_status IN ('" . implode("','", $order_status) . "') 
     AND order_items.order_item_type = 'line_item' 
     AND order_item_meta.meta_key = '_product_id' 
     AND order_item_meta.meta_value = '$product_id' 
    "); 

    return $results; 
} 

用途1(给定产品ID 37和默认完成的订单状态) :

$orders_ids = get_orders_ids_by_product_id(37); 

// The output (for testing) 
print_r($orders_ids); 

USAGE 2(对于给定的产品ID 37一些定义ö rders状态):

// Set the orders statuses 
$statuses = array('wc-completed', 'wc-processing', 'wc-on-hold'); 

$orders_ids = get_orders_ids_by_product_id(37, $statuses); 

// The output (for testing) 
print_r($orders_ids); 

代码放在您的活动子主题(或主题的function.php文件),或者也可以任何插件文件。

此代码已经过测试并可正常工作。

+0

Hello LoicTheAztec,如果我有多个元键值,我该如何修改sql。例如颜色>红色?谢谢! – somtam

+0

@somtam您需要再添加一个:'LEFT JOIN {$ wpdb-> prefix} woocommerce_order_itemmeta as order_item_meta2 ON order_items.order_item_id = order_item_meta2.order_item_id' ...然后您将可以使用新的'order_item_meta2.meta_key'或/和'order_item_meta2.meta_value' ... – LoicTheAztec

+0

它完美的作品,谢谢!还有一件事。通常与get_col()我转义sql,如$结果= $ wpdb-> get_col($ wpdb->准备($ sql,$ id));.我必须这样做,否则get_col自行逃脱?谢谢。 – somtam

1

所以我想获取特定产品和人的订单。我使用@LoicTheActec提供的解决方案和wc_get_orders woocommerce方法来获得我想要的结果。

这里的功能是:

/** 
* Get All orders IDs for a given product ID. 
* 
* @param integer $product_id (required) 
* @param array $order_status (optional) Default is 'wc-completed' 
* 
* @return array 
*/ 
public function get_orders_ids_by_product_id($product_id, $order_status = array('wc-completed')) { 
    global $wpdb; 

    $results = $wpdb->get_col(" 
     SELECT order_items.order_id 
     FROM {$wpdb->prefix}woocommerce_order_items as order_items 
     LEFT JOIN {$wpdb->prefix}woocommerce_order_itemmeta as order_item_meta ON order_items.order_item_id = order_item_meta.order_item_id 
     LEFT JOIN {$wpdb->posts} AS posts ON order_items.order_id = posts.ID 
     WHERE posts.post_type = 'shop_order' 
     AND posts.post_status IN ('" . implode("','", $order_status) . "') 
     AND order_items.order_item_type = 'line_item' 
     AND order_item_meta.meta_key = '_product_id' 
     AND order_item_meta.meta_value = '$product_id' 
    "); 

    return $results; 
} 

要筛选出我想要的结果。由于该方法不提供包括说法我不得不抓住所有的订单,然后删除订单对于给定的产品ID,并排除所有来自wc_get_orders剩余:

/** 
* Check if current user has more than 3 orders 
* 
* @return void 
* @author 
**/ 
public function woocommerce_check_order_count($product_id, $customer_email) 
{ 


    $statuses = array( 'wc-processing'); 

    $orders_ids_for_product = $this->get_orders_ids_by_product_id($product_id, $statuses); 


    // Get All Orders 
    $allorders = wc_get_orders(array(
     'status'  => 'processing', 
     'type'  => 'shop_order', 
     'email'  => '', 
     'limit'  => -1, 
     'return'  => 'ids', 
    )); 

    // Remove the $orders_ids_for_product array from the $allorders array 
    $orderstoexclude = array_diff($allorders, $orders_ids_for_product); 

    $orders = wc_get_orders(array(
     'status'  => 'processing', 
     'type'  => 'shop_order', 
     'customer' => $customer_email, 
     'email'  => '', 
     'limit'  => 3, 
     'exclude'  => $orderstoexclude, 
     'return'  => 'ids', 
    )); 

    return $orders; 

} 
相关问题