WooCommerce: добавление разных метаданных для каждого товара в заказе

23 февр. 2019 г., 11:11:38
Просмотры: 13.5K
Голосов: 3

Сейчас с этой функцией я могу добавить новые пользовательские метаданные заказа ко всем товарам в заказе.

add_action( 'woocommerce_add_order_item_meta', 'add_order_item_meta', 10, 2 );
function add_order_item_meta($item_id, $values) {
    $key = '_key'; // Ключ метаданных
    $value = '_value'; // Значение метаданных
    wc_update_order_item_meta($item_id, $key, $value);
}

Но как я могу добавить разные метаданные заказа для каждого товара в заказе? Например, мне нужно добавить цену каждого продукта как order_itemmeta.

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

Попробуйте использовать хук woocommerce_checkout_create_order_line_item. Он принимает 4 аргумента и доступен начиная с WooCommerce версии 3.3+.

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

В этом хуке мы заменим старые рабочие функции wc_add_order_item_meta() на новый метод WC_Data update_meta_data(), который используется с аргументом $item.

Пример:

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 ) {
    // Получаем значение произвольного поля товара
    $custom_field_value = get_post_meta( $item->get_product_id(), '_meta_key', true );
    // Обновляем метаданные элемента заказа
    if ( ! empty( $custom_field_value ) ){
        $item->update_meta_data( 'meta_key1', $custom_field_value );
    }
    // … … Или … …

    // Получаем пользовательские данные из корзины и обновляем метаданные элемента заказа
    if( isset( $values['custom_data'] ) ) {
        $item->update_meta_data( 'meta_key2', $values['custom_data'] );
    }
}
23 февр. 2019 г. 14:26:24