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
, поскольку он имеет почти те же полезные аргументы:
## --- 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.
person
LoicTheAztec
schedule
22.03.2018