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


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

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

Author: LoicTheAztec, 2015-04-16

8 answers

Если вы посмотрите на 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(), поэтому, если вам нужна функция, используйте ее. Крючок действия не был переименован и остается в class-wc-checkout.php как:

// Allow plugins to add order item meta
do_action( 'woocommerce_add_order_item_meta', $item_id, $values, $cart_item_key );
 17
Author: helgatheviking, 2015-04-16 09:02:07

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, где данные корзины больше недоступны.

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

В woocommerce_new_order_item действительно НЕУДОБНО , так как данные о корзине недоступны.

Давайте посмотрим, как работать с 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() метод, который будет использоваться с аргументом $item.

Пример:

## --- New way --- ##
add_action( 'woocommerce_checkout_create_order_line_item', 'custom_checkout_create_order_line_item', 20, 4 );
function custom_checkout_create_order_line_item( $item, $cart_item_key, $values, $order ) {
    // Get a product custom field value
    $custom_field_value = get_post_meta( $item->get_product_id(), '_meta_key', true );
    // Update order item meta
    if ( ! empty( $custom_field_value ) ){
        $item->update_meta_data( 'meta_key1', $custom_field_value );
    }
    // … … Or … …

    // Get cart item custom data and update order item meta
    if( isset( $values['custom_data'] ) ) {
        $item->update_meta_data( 'meta_key2', $values['custom_data'] );
    }
}

Наконец, мы можем сделать то же самое со старым способом, используя woocommerce_add_order_item_meta крюк, поскольку он имеет почти те же полезные аргументы:

## --- Old way --- ##
add_action( 'woocommerce_add_order_item_meta', 'custom_add_order_item_meta', 20, 3 );
function custom_add_order_item_meta( $item_id, $values, $cart_item_key ) {
    // Get a product custom field value
    $custom_field_value = get_post_meta( $values['data']->get_id(), '_meta_key', true );
    // Update order item meta
    if ( ! empty( $custom_field_value ) ){
        wc_add_order_item_meta( $item_id, 'meta_key1', $custom_field_value );
    }
    // … … Or … …

    // Get cart item custom data and update order item meta
    if( isset( $values['custom_data'] ) ) {
        wc_add_order_item_meta( $item_id, 'meta_key2', $values['custom_data'] );
    }
}

Заключение: woocommerce_checkout_create_order_line_item является подходящей заменой крючка, который будет использоваться с WooCommerce 3+, и это новые методы установки и получения CRUD.

 8
Author: LoicTheAztec, 2018-05-29 09:05:11

Похоже, что хук теперь также устарел с версии 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. Я использую плагин для надстроек продуктов WooCommerce и метаданные продукта, которые должны быть прикреплены к заказ не принимается плагином и, следовательно, не сохраняется вместе с заказом. Поэтому, пока это не будет исправлено в плагине, вам придется смириться с уведомлением об устаревании.

 5
Author: Christer Fernstrom, 2017-05-02 07:05:34

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

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'])
    );
}
 3
Author: Ilgıt Yıldırım, 2017-06-11 12:53:13

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

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

 1
Author: rnevius, 2015-04-16 06:34:38

Я хотел добавить к ответу Илгита Йылдырыма: в моем случае мои пользовательские значения не существовали в массиве 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($элемент, $cart_item_key, $значения, $порядок) {

                $item->myCustomValues = $values;

}

//ЗАТЕМ вызовите новый хук: add_action('woocommerce_new_order_item', 'add_product_input_fields_to_order_item_meta_wc3', PHP_INT_MAX, 3);

добавить действие ('woocommerce_new_order_item', 'добавить_продукт_инпут_ полей_для_заказа_мета_wc3', PHP_INT_MAX, 3);

Функция add_product_input_fields_to_order_item_meta_wc3($идентификатор элемента, $элемент, $идентификатор заказа) {

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

}

 1
Author: sc8704, 2018-03-20 16:38:49

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

 0
Author: Pablo S G Pacheco, 2015-07-03 19:30:38

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

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

 0
Author: tperschon, 2017-10-10 11:39:21