Woocommerce Получить order_id из одного из item_id?

Я пытаюсь получить соответствующий заказ (идентификатор заказа) из одного из идентификаторов позиций.

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

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

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

Это НЕ работает:

wp_get_post_parent_id ( $item_id )

Но я надеюсь, что есть аналогичный вызов, или мне нужно выполнить поиск по БД SQL? Любой ответ, связанный с mySQL, сделайте его "готовым к копированию и вставке". Я отлично разбираюсь в 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;
}

person Jonas Lundman    schedule 09.07.2016    source источник


Ответы (1)


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

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

поэтому я позаимствовал небольшой оператор 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;
}
person helgatheviking    schedule 09.07.2016