Что такое хук woocommerce_checkout_create_order_line_items и когда он нужен
Хук woocommerce_checkout_create_order_line_items вызывается при создании товаров в заказе на этапе оформления. Он позволяет изменить свойства товаров (order items) перед сохранением заказа. Это полезно, если нужно добавить или изменить метаданные товара, изменить цену, количество или внешний вид товара в заказе.
Диагностика задачи: когда применять этот хук
Типичные ситуации, требующие работы с этим хуком:
- Добавление пользовательских метаданных к товарам в заказе, например, гравировка, персонализация.
- Изменение цены товара динамически при оформлении заказа.
- Добавление специальных условий или флагов к товарам заказа для дальнейшей обработки.
- Удаление или замена товаров в заказе программно.
Если вы пытаетесь изменить товар после сохранения заказа, этот хук — правильное место для вмешательства.
Пошаговое решение: как изменить свойства товаров заказа через хук
Пример: добавим к каждому товару в заказе метаданные с уникальным кодом и изменим цену на 90% от изначальной.
add_action('woocommerce_checkout_create_order_line_items', 'custom_modify_order_line_items', 10, 4);
function custom_modify_order_line_items($order, $cart_item_key, $cart_item, $order_item) {
// Добавляем метаданные
$unique_code = 'CODE-' . strtoupper(uniqid());
$order_item->add_meta_data('unique_code', $unique_code, true);
// Изменяем цену товара на 90%
$original_price = $order_item->get_subtotal() / $order_item->get_quantity();
$new_price = $original_price * 0.9;
$order_item->set_subtotal($new_price * $order_item->get_quantity());
$order_item->set_total($new_price * $order_item->get_quantity());
}Обратите внимание, что $order_item — объект WC_Order_Item_Product, с которым можно работать через методы API WooCommerce.
Параметры функции
$order— объект заказаWC_Order.$cart_item_key— ключ товара в корзине.$cart_item— массив с данными товара в корзине.$order_item— объект товара в заказе.
Проверка результата после внедрения кода
Чтобы убедиться, что изменения применились:
- Оформите тестовый заказ с одним или несколькими товарами.
- В административной панели WooCommerce откройте созданный заказ.
- В разделе товаров заказа откройте детали товара и убедитесь, что в метаданных появилась запись
unique_codeс уникальным значением. - Проверьте, что цена товара в заказе уменьшена на 10% от исходной цены.
Также можно проверить программно, например, через консоль или дополнительные фильтры.
Частые ошибки при использовании хука и как их исправить
- Невызов хука: убедитесь, что добавляете функцию с правильным приоритетом и количеством параметров (4).
- Изменение цены не влияет на итог заказа: используйте методы
set_subtotal()иset_total()для изменения стоимости. - Метаданные не отображаются: проверьте, что используете метод
add_meta_data()с третьим параметромtrueдля обновления. - Ошибка при попытке изменить данные вне функции: все изменения нужно делать внутри функции, привязанной к хуку.
Практические советы по безопасности и производительности
- Не добавляйте чрезмерно большие или личные данные в метаданные заказов без необходимости.
- Избегайте тяжелых и долгих операций в этом хуке — он вызывается при каждом оформлении заказа.
- Если изменяете цену, учитывайте налоги и скидки, корректно рассчитывайте итоговые суммы.
- При работе с уникальными кодами используйте
uniqid()или более надежные генераторы, чтобы избежать коллизий.
Сравнение способов кастомизации товаров в заказе WooCommerce
| Метод | Применение | Плюсы | Минусы |
|---|---|---|---|
Хук woocommerce_checkout_create_order_line_items | Изменение товара при оформлении заказа | Гибкость, доступ к объекту заказа и товара | Требует знаний API WooCommerce |
Хук woocommerce_add_order_item_meta | Добавление метаданных после создания заказа | Простота, работает после создания заказа | Менее гибкий, нельзя менять цену |
| Плагины кастомизации | Добавление пользовательских полей | Простота использования | Могут влиять на производительность и иметь ограничения |