Как получить доступ к пользовательским мета-данным элемента заказа по мета-ключу в WooCommerce?
Я пытаюсь отобразить некоторые пользовательские мета-данные, связанные с доставкой заказа в WooCommerce. Вот полная история того, что я делаю (чтобы это могло помочь кому-то еще, и чтобы вы полностью понимали, что я пытаюсь сделать)...
Когда создается заказ, я прикрепляю время выполнения как мета-данные к элементу доставки заказа. Вот код для справки:
add_action( 'woocommerce_checkout_create_order_shipping_item', 'add_leadtime_meta', 20, 4 );
function add_leadtime_meta( &$item, $package_key, $package, $order ) {
$lt = get_current_lead_time();
$item->add_meta_data( 'Lead Time', $lt, true );
}
Когда я смотрю в базу данных, она создается, и order_item_id соответствует order_item_id для доставки этого заказа, так что все работает нормально (и я могу видеть это в представлении заказа в административной панели).
Я пытаюсь понять, как вручную получить эти данные, чтобы отобразить их в нескольких местах на сайте (и в электронной почте). Я начинаю со страницы заказов в учетной записи пользователя (/my-account/orders/). Я добавил столбец для отображения этого значения и пытаюсь понять, как получить данные. Вот код того, как я добавил столбец, если кому-то интересно:
add_filter( 'woocommerce_account_orders_columns', 'new_orders_columns' );
function new_orders_columns( $columns = array() ) {
// Скрыть столбцы
if( isset($columns['order-total']) ) {
// Удаляем столбцы, которые хотим скрыть
unset( $columns['order-number'] );
unset( $columns['order-date'] );
unset( $columns['order-status'] );
unset( $columns['order-total'] );
unset( $columns['order-actions'] );
}
// Добавляем столбцы обратно с новым, чтобы мы могли установить порядок
$columns['order-number'] = __( 'Invoice', 'Text Domain' );
$columns['order-date'] = __( 'Order Date', 'Text Domain' );
$columns['order-lead-time'] = __( 'Lead Time', 'Text Domain' );
$columns['order-status'] = __( 'Status', 'Text Domain' );
$columns['order-total'] = __( 'Total', 'Text Domain' );
$columns['order-actions'] = __( 'Action', 'Text Domain' );
return $columns;
}
Я испытываю трудности с получением значения времени выполнения, которое я сохранил выше, в таблицу. Я пробовал все, что мог придумать и найти в интернете, но безуспешно. Я могу успешно получить доступ к массивам, так что я знаю, что близок, но что-то я делаю неправильно при поиске мета-данных 'Lead Time'. Вот пример того, что я пробовал:
add_action( 'woocommerce_my_account_my_orders_column_order-lead-time', 'bs_order_lead_time_data' );
function bs_order_lead_time_data( $order ) {
foreach( $order->get_items( 'shipping' ) as $item_id => $shipping_item_obj ){
$shipping_method_id = $shipping_item_obj->get_method_id(); // ID метода
$shipping_method_instance_id = $shipping_item_obj->get_instance_id(); // ID экземпляра
$lt1 = wc_get_order_item_meta( $shipping_method_id , 'Lead Time', $single = true );
$lt2 = wc_get_order_item_meta( $shipping_method_instance_id , 'Lead Time', $single = true );
$lt3 = get_post_meta( $shipping_item_obj, 'Lead Time', true );
//echo $shipping_method_id; //это отображает 'free_shipping' для информации
//echo $shipping_method_instance_id; //это отображает '2' для информации
//echo $lt1; //это ничего не отображает...
//echo $lt2; //это ничего не отображает...
//echo $lt3; //это ничего не отображает...
echo $shipping_item_obj; //это показывает объект данных, и нужный контент там есть.
}
}
Используя последний пример echo, вот массив данных, который я получаю:
{"id":39,"order_id":2050,"name":"Free shipping","method_title":"Free shipping","method_id":"free_shipping","instance_id":"2","total":"0.00","total_tax":"0","taxes":{"total":[]},"meta_data":[{"id":573,"key":"Items","value":"Test Part × 1"},{"id":574,"key":"Lead Time","value":"2 to 3 weeks"}]}
Я уверен, что упускаю что-то простое, но не могу найти это. Буду признателен за любую помощь.
Спасибо,
Danny

Существует как минимум 2 способа получить метаданные пользовательских элементов заказа по определенному мета-ключу:
1) Начиная с WooCommerce 3 - Использование метода WC_Data
get_meta()
2) Старый способ - Использование функции WooCommerce wc_get_order_item_meta()
Таким образом, ваш код функции с хуком bs_order_lead_time_data()
будет выглядеть так:
add_action( 'woocommerce_my_account_my_orders_column_order-lead-time', 'bs_order_lead_time_data' );
function bs_order_lead_time_data( $order ) {
foreach ( $order->get_items('shipping') as $item_id => $item ) {
// Использование метода WC_Data get_meta() начиная с WooCommerce 3
echo $item->get_meta('Lead Time');
// Или старый способ (всегда используя ID элемента)
// echo wc_get_order_item_meta( $item_id , 'Lead Time', true );
}
}
Код следует поместить в файл functions.php вашей активной дочерней темы (или активной темы). Должно работать корректно.
