Получение 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...
rnevius
Все еще работает в WooCommerce 2.4.8 у меня, но вам нужно убедиться, что переменная $order_id определена (иногда она находится в $order->id, в зависимости от контекста).
Ewout
@mevius я добавил правку для версии 3+ с функцией dispatch для проверки нескольких товаров
That Realtor Programmer Guy
смотрите историю изменений для диспетчера, без него это нехорошо, так как он будет бессмысленно загружать ваш сервер
That Realtor Programmer Guy
@GaretClaborn это полностью зависит от того, что вы делаете с этими данными. "как есть", этот пример фрагмента кода никак не расточителен по памяти.
Ewout
Если вы проверяете несколько товаров, то вы повторяете довольно много логики вместо того, чтобы использовать преимущества первого прохода цикла
That Realtor Programmer Guy
Я работал над этим и достиг определенного результата, которым хотел бы поделиться с другими разработчиками. Это не самый предпочтительный способ сделать это, но для общего понимания публикую свой ответ.
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';