Woocommerce: какой крючок заменить устаревшим " woocommerce добавить мета-элемент заказа"

необходимо добавить пользовательский мета для заказа элементов. Googled его и большинство статей говорит, чтобы использовать "woocommerce_add_order_item_meta" крюк. Этот крюк устарел в новейшей версии 2.3.7. Кто-нибудь, пожалуйста, скажите мне, какой крюк использовать вместо этого.

http://docs.woothemes.com/wc-apidocs/function-woocommerce_add_order_item_meta.html

8 ответов


если вы посмотрите на wc-deprecated-functions.php вы увидите

/**
 * @deprecated
 */
function woocommerce_add_order_item_meta( $item_id, $meta_key, $meta_value, $unique = false ) {
    return wc_add_order_item_meta( $item_id, $meta_key, $meta_value, $unique );
}

в основном функции была переименована в wc_add_order_item_meta(), поэтому, если вам нужна функция, используйте ее. The крюк действий не был переименован и остается в class-wc-checkout.php as:

// Allow plugins to add order item meta
do_action( 'woocommerce_add_order_item_meta', $item_id, $values, $cart_item_key );

2017/2018 ПРАВИЛЬНЫЙ ПУТЬ (используя новые методы CRUD-сеттеров и геттеров)

по теме: заменить крючок woocommerce_add_order_item_meta в Woocommerce 3.4

С woocommerce 3, который улучшил многие вещи, внося радикальные изменения, крючок действия woocommerce_add_order_item_meta по-прежнему отлично работает даже в woocommerce версии 3.3+.

этот крюк включен WC_Checkout методы класса и связанные с ними функции в процесс проверки и не в WC_Order класс, где данные корзины больше не доступны.

теперь Woocommmerce 3 представила новые методы CRUD сеттеров и геттеров аналогичная замена крюка используется woocommerce_checkout_create_order_line_item который имеет аналогичные полезные аргументы, как данные корзины.

на woocommerce_new_order_item действительно не удобно as данные по тележки нет доступный.

давайте посмотрим, как работать с woocommerce_checkout_create_order_line_item. Он имеет 4 аргумента:

  • $item пример WC_Order_Item_Product ввел новый класс
  • $cart_item_key является уникальным хэш-ключом элемента корзины
  • $values находится в корзине
  • $order экземпляр объекта WC_Order (это очень полезно дополнительный аргумент в некоторых конкретных случаях)

в этом крючке мы заменим старые рабочие функции wc_add_order_item_meta () на новые WC_Data update_meta_data() метод с


Кажется, что крюк теперь также устарел с версии 3.0.4. Я получаю это уведомление:

The The "woocommerce_add_order_item_meta" hook uses out of date data structures and function is deprecated since version 3.0.4. Replace with woocommerce_new_order_item.

Я заменил имя действия "woocommerce_add_order_item_meta" на "woocommerce_new_order_item" в инструкции add_action в оскорбительном плагине, и уведомление об устаревании исчезает, проблема в том, что некоторые параметры теперь появляются внутри legacy_values массив. Я использую плагин Yith WooCommerce Product Add Ons и метаданные продукта, которые должны быть прикрепленный к заказу не подбирается плагином и, следовательно, не хранится вместе с заказом. Поэтому, пока это не будет исправлено в плагине, вы должны жить с уведомлением об устаревании.


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

add_action('woocommerce_new_order_item', 'saveMetaData', 10, 3); // or use just 2 instead of 3; if you don't need order id

/**
 * Add meta to order item
 *
 * @param int $itemId
 * @param WC_Order_Item_Product|WC_Order_Item_Shipping $item
 * @param int @orderId
*/
function saveMetaData($itemId, $item, $orderId)
{
    if (!isItemValid($item))
    {
        return;
    }

    wc_add_order_item_meta($itemId, 'my_custom_data', $item->legacy_values['my_custom_data']);
}

/**
 * @param WC_Order_Item_Product|WC_Order_Item_Shipping $item
 *
 * @return bool
*/
function isItemValid($item)
{
    return (
        $item instanceof WC_Order_Item_Product &&
        isset($item->legacy_values) &&
        isset($item->legacy_values['my_custom_data']) &&
        !empty($item->legacy_values['my_custom_data'])
    );
}

ваш конкретный вариант использования не очень ясен (вы не указали, когда и где вам нужно добавить эту мета-информацию), но вы можете использовать woocommerce_checkout_update_order_meta во время оформления заказа.

подробнее в настройка полей оформления заказа.


Я хотел добавить к ответу Ilgıt Yıldırım: в моем случае мои пользовательские значения не существовали в массиве item - >legacy_values. Чтобы исправить это, я использовал крючок woocommerce_checkout_create_order_line_item, чтобы добавить пользовательские значения в элемент перед вызовом крючка woocommerce_new_order_item. Вот пример этого:

add_action ('woocommerce_checkout_create_order_line_item', 'save_values_in_item', PHP_INT_MAX, 4);

функция save_values_in_item( $ item, $cart_item_key, $values, $order) {

                $item->myCustomValues = $values;

}

/ / затем вызовите новый крюк: add_action ('woocommerce_new_order_item', 'add_product_input_fields_to_order_item_meta_wc3', PHP_INT_MAX, 3);

функция add_product_input_fields_to_order_item_meta_wc3 ($item_id, $item, $order_id ) {

            if ( isset( $item->myCustomValues ) ) 
            {
                  //iterate through array and place desired values into the meta data using the wc_add_order_item_meta function
            }

}


чтобы прояснить ситуацию, эта функция была устаревшей, но крючок все еще в порядке


нет похоже, что крюк также устарел: ошибка PHP: Крючок "woocommerce_add_order_item_meta" использует устаревшие структуры данных, а функция устарела с версии 3.1.2. Заменить woocommerce_new_order_item.

Я тоже не могу найти его здесь: https://docs.woocommerce.com/wc-apidocs/hook-docs.html