2016-07-09 6 views
1

Я пытаюсь получить связанный заказ (идентификатор заказа) с одного из идентификаторов позиций.Woocommerce Получите order_id из одного из item_id?

Один случай, например: При редактировании заказа, а также удаление элемента строки (проделанном Ajax) WooCommerce только обеспечивает крючок "woocommerce_before_delete_order_item" и передает только $item_id. (Функция woo выполняет sql, а не WP enviroment). Мне нужно идентификатор «принадлежности», чтобы сделать какое-то действие!

Мое решение до сих пор заключается в том, чтобы прокручивать все заказы и сравнивать идентификатор элементов, а также разрывать и возвращать идентификатор заказа при совпадении.

Это способ замедлить или «громоздкий неуклюжий» при сохранении 10000 заказов и более живых в текущем магазине.

Это не работает:

wp_get_post_parent_id ($item_id)

Но Im надеясь есть подобный вызов, или мне нужно сделать DB SQL поиска? Любой ответ, связанный с mySQL, пожалуйста, сделайте его «скопируйте и вставьте в готовом виде». Im отлично на PHP, но не обрабатывать или никогда не писать собственный SQL.

Спасибо за помощь! Ниже мое решение до сих пор:

$order_id = my_wc_get_order_from_item_id($item_id); 

function my_wc_get_order_from_item_id($id) { 

    $orders = get_posts('post_type=shop_order&numberposts=-1&post_status=publish'); 
    foreach($orders as $obj) { 
     $order = new WC_Order($obj->ID); 
     if (count($order->get_items('line_item')) > 0) { 
      foreach($order->get_items('line_item') as $item_id => $item) { 
       if($item_id == $id) $return_value = $obj->ID; 
       if(isset($return_value)) break; 
      } 
     } 
     unset($order); 
     if(isset($return_value)) break; 
    } 

    if(isset($return_value)) return $return_value; 
     else return 0; 
} 

ответ

1

Ваш подход не работает, потому что элементы порядка не являются должностями в wp_posts таблицы, поэтому они не могут иметь post_parent.

Однако все не потеряно, и это было легче, чем я ожидал, учитывая, что мой SQL не настолько силен. Глядя на woocommerce_order_item таблиц в базе данных вы можете увидеть, что order_id и order_item_id оба там: woocommerce_order_item table

поэтому я одолжил немного о SQL из WooCommerce и изменить его, чтобы найти order_id данного конкретную order_item_id строки. Дайте мне знать, как это работает.

function so_38286531_get_order_item_order_id($item_id) { 
    global $wpdb; 

    $order_id = $wpdb->get_var($wpdb->prepare(
     "SELECT order_id FROM {$wpdb->prefix}woocommerce_order_items 
     WHERE order_item_id = %d", 
     $item_id 
    )); 

    return $order_id; 
} 
+0

Отлично: https://docs.woothemes.com/wc-apidocs/source-class-WC_Abstract_Order.html#1239 – LoicTheAztec

+0

Спасибо! Какая связь? Номер строки указывает на '' line_tax'', который, похоже, не связан с этим вопросом/ответом. – helgatheviking

+0

По-видимому, у них есть проблема с номерами строк в WC API DOCS. Потому что если вы посмотрите на мой URL-адрес, укажете строку 1239, но она отобразит строку 1277 ... Строка 1239 очень похожа на ваш код и связана с функцией get_items() – LoicTheAztec