Как получить доступ к пользовательским мета-данным элемента заказа по мета-ключу в WooCommerce?

23 сент. 2019 г., 08:18:32
Просмотры: 60K
Голосов: 8

Я пытаюсь отобразить некоторые пользовательские мета-данные, связанные с доставкой заказа в 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

0
Все ответы на вопрос 1
2

Существует как минимум 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 вашей активной дочерней темы (или активной темы). Должно работать корректно.

23 сент. 2019 г. 11:55:38
Комментарии

Работает отлично. Спасибо!!

Danny Danny
24 сент. 2019 г. 00:28:18

Стоит отметить, что $item->get_meta() работает так же, как и обычная WP функция get_post_meta(); если вам нужно только одно значение (а не массив), используйте $item->get_meta('Lead Time', true);

indextwo indextwo
23 апр. 2023 г. 15:52:50