Woocommerce: какой хук заменить устаревшим & quot; woocommerce_add_order_item_meta & quot;

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

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

9

Решение

Если вы посмотрите на 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

Другие решения

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

Давайте посмотрим, как работать с 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 Hook, поскольку он имеет почти такие же полезные аргументы:

## --- 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.

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

5

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

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

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

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

1

Я хотел добавить к ответу 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
}

}

1

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

0

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

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

0
По вопросам рекламы [email protected]