2017-03-01 250 views
4

如何根據特定產品變化列出訂單商品?獲取WooCommerce訂單變更商品ID

給定變化ID,我想生成包含特定的變化都訂單項目的列表。

在我的情況下,我使用變化來表示日期,產品本身是一個反覆發生的事件,所以這樣做的目的是列出參加該特定日期的人員。

如果這可以通過簡單的get_posts或使用meta_keys或其他方式來完成,那將是了不起的,但除此之外,我猜測一個自定義查詢將是方式。

我似乎無法弄清楚在這種情況下這些表是如何關聯的,或者這是以可搜索的方式存儲的。

非常感謝任何幫助。

謝謝!

回答

2

有很多方法可以做到這一點。在這裏,我在自定義函數中使用一個SQL查詢和$variation_id(變化ID來設置)作爲參數吧:

function get_all_orders_items_from_a_product_variation($variation_id){ 

    global $wpdb; 

    // Getting all Order Items with that variation ID 
    $item_ids_arr = $wpdb->get_col($wpdb->prepare(" 
     SELECT `order_item_id` 
     FROM {$wpdb->prefix}woocommerce_order_itemmeta 
     WHERE meta_key LIKE '_variation_id' 
     AND meta_value = %s 
    ", $variation_id)); 

    return $item_ids_arr; // return the array of orders items ids 

} 

代碼放在您的活動子function.php文件主題(或主題)或任何插件文件。

USAGE(這裏例如變化ID 41)

這將顯示的訂單項目ID的列表與一些數據該變型ID(例如)。

$items_ids = get_all_orders_items_from_a_product_variation(41); 

// Iterating through each order item 
foreach($items_ids as $item_id){ 

    // Getting some data (the color value here) 
    $item_color = wc_get_order_item_meta($item_id, 'pa_color', true); 

    // Displaying some data related to the current order item 
    echo 'Item ID: '. $item_id . ' with color "' . $item_color .'"<br>'; 
} 

此代碼已經過測試並可正常工作。


拿到訂單ID(修訂版)

現在,如果你需要把所有的訂單ID,而不是,您可以使用該函數內部另一個查詢是這樣的:

function get_all_orders_that_have_a_product_variation($variation_id){ 

    global $wpdb; 

    // Getting all Order IDs with that variation ID 
    $order_ids_arr = $wpdb->get_col($wpdb->prepare(" 
     SELECT DISTINCT items.order_id 
     FROM {$wpdb->prefix}woocommerce_order_items AS items 
     LEFT JOIN {$wpdb->prefix}woocommerce_order_itemmeta AS itemmeta ON items.order_item_id = itemmeta.order_item_id 
     WHERE meta_key LIKE '_variation_id' 
     AND meta_value = %s 
    ", $variation_id)); 

    return $orders_ids; // return the array of orders ids 

} 

代碼發送到你活動的function.php文件中兒童主題(或主題)或任何插件文件。

USAGE(具有例如變化ID 41這裏總是)

這將顯示訂單ID的列表與他們的狀態(例如)此變化ID。

$orders_ids = get_all_orders_that_have_a_product_variation(41); 

// Iterating through each order item 
foreach($orders_ids as $order_id){ 

    // Getting an instance of the order object 
    $order = wc_get_order($order_id); 

    // Displaying some data related to the current order 
    echo 'Order #'. $order_id . ' has status "' . $order->get_status() .'"<br>'; 
} 

此代碼已經過測試並可正常工作。

您也可以結合在更復雜的陣列,訂單ID與它的這種方式相關物項的ID在一個多維數組:

function get_all_orders_and_item_ids_that_have_a_product_variation($variation_id){ 

    global $wpdb; 

    // Getting all Order IDs and item ids with that variation ID 
    $results = $wpdb->get_results($wpdb->prepare(" 
     SELECT items.order_id, items.order_item_id AS item_id 
     FROM {$wpdb->prefix}woocommerce_order_items AS items 
     LEFT JOIN {$wpdb->prefix}woocommerce_order_itemmeta AS itemmeta ON items.order_item_id = itemmeta.order_item_id 
     WHERE meta_key LIKE '_variation_id' 
     AND meta_value = %s 
    ", $variation_id), ARRAY_A); 

    return $results; // return a multi-dimensional array of orders Ids/items Ids 

} 
+0

非常感謝您的詳細解答!我最終使用了第二個函數和WC函數的組合來充實數據,但會調查我是否可以進行優化,但從查詢中獲得全部。 – Simon

+0

不適用於我,可能是版本問題?僅獲得空白數組。 –

+0

我試圖添加獲取訂單ID,使用第二個功能與自定義前綴只,但沒有運氣。它只是顯示空白數組。即使試圖檢查功能,然後發現'item_ids_arr'顯示空白數組。 –

0

我試圖做同樣的,後看着db我得到0'_variation_id'前面。但是,對於正在尋找相同問題的未來人員,使用我的自定義攻擊獲得了訂單項目。我們需要使用product_namevariaion_name如大小等而variation_value LIKE「S」,「L」等比較考慮一下這個功能:

function get_all_orders_that_have_a_product_variation($product_name, $variation_name, $variation_value){ 

global $wpdb; 
// Getting all Order IDs with that variation ID 

$order_ids_arr = $wpdb->get_col($wpdb->prepare (" 
     SELECT * FROM wpcc_woocommerce_order_items items 
     LEFT JOIN wpcc_woocommerce_order_itemmeta itemmeta ON items.order_item_id = itemmeta.order_item_id 
     WHERE items.order_item_name LIKE %s 
     AND itemmeta.meta_key LIKE %s 
     AND itemmeta.meta_value = %s", $product_name, $variation_name, $variation_value)); 


return $order_ids_arr; // return the array of orders ids 

} 

現在叫它,說我們的產品名稱爲Raleigh sport,變異的名字是size,值爲s。在簡單的形式,我們希望得到他的名字是Raleigh sport產品的訂單項目的ID,我們希望只獲取其sizeS

簡單的調用由函數:

print_r(get_all_orders_that_have_a_product_variation("Raleigh Sport", "Size", "S"));

感謝。

相關問題