Получение ID товара из ID заказа в Woocommerce
У меня возникли проблемы с взаимосвязью деталей товара и заказа в Woocommerce. Я не могу найти ID товара, связанного с ID заказа на странице Просмотр заказов темы Woocommerce. Мне просто нужно получить содержимое товара и постоянную ссылку на странице Просмотр заказов.
Я пытался искать в wp_postmeta
, но безуспешно.

WooCommerce 3.0+
Вы можете получить товары заказа следующим образом:
$order = wc_get_order( $order_id );
$items = $order->get_items();
Затем, если пройтись в цикле по товарам, можно получить все необходимые данные:
foreach ( $items as $item ) {
$product_name = $item->get_name();
$product_id = $item->get_product_id();
$product_variation_id = $item->get_variation_id();
}
Хороший совет — посмотреть, как данные получаются на страницах заказов в админке, там можно найти много ответов!
До WooCommerce 3.0
$order = new WC_Order( $order_id );
$items = $order->get_items();
foreach ( $items as $item ) {
$product_name = $item['name'];
$product_id = $item['product_id'];
$product_variation_id = $item['variation_id'];
}

Если я ничего не упустил, это, кажется, не работает в последней версии WooCommerce...

Все еще работает в WooCommerce 2.4.8 у меня, но вам нужно убедиться, что переменная $order_id определена (иногда она находится в $order->id, в зависимости от контекста).

@mevius я добавил правку для версии 3+ с функцией dispatch для проверки нескольких товаров

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

@GaretClaborn это полностью зависит от того, что вы делаете с этими данными. "как есть", этот пример фрагмента кода никак не расточителен по памяти.

Если вы проверяете несколько товаров, то вы повторяете довольно много логики вместо того, чтобы использовать преимущества первого прохода цикла

Я работал над этим и достиг определенного результата, которым хотел бы поделиться с другими разработчиками. Это не самый предпочтительный способ сделать это, но для общего понимания публикую свой ответ.
global $wpdb;
$result = $wpdb->get_results('select t1.order_item_id, t2.* FROM
wp_woocommerce_order_items as t1 JOIN wp_woocommerce_order_itemmeta as t2 ON t1.order_item_id = t2.order_item_id
where t1.order_id='.$order->ID);
echo '<pre>';
print_r($result);
echo '</pre>';
Надеюсь, это поможет кому-то.
Дополнительно:
Лучше использовать префикс таблиц WordPress, чтобы избежать проблем на мультисайтах или при переносе данных.
global $wpdb;
$table_name = $wpdb->prefix . 'table_name';
