Диагностика задачи: зачем автоматизировать изменения в заказах WooCommerce
В интернет-магазинах на WooCommerce часто требуется автоматически изменять данные заказа — например, добавлять заметки, менять статус, корректировать стоимость или отправлять уведомления при определённых условиях. Ручная обработка таких задач снижает скорость работы и увеличивает вероятность ошибок. Для решения этой задачи нужны надёжные хуки WooCommerce, которые срабатывают в нужные моменты жизненного цикла заказа.
Пошаговое решение: как настроить автоматические изменения заказа через хуки WooCommerce
1. Определяем необходимые хуки
WooCommerce предоставляет несколько хуков, связанных с заказами. Основные из них:
woocommerce_order_status_changed— срабатывает при смене статуса заказа;woocommerce_checkout_update_order_meta— для изменения метаданных заказа после оформления;woocommerce_order_edit_status— при редактировании заказа в админке;woocommerce_thankyou— после успешного оформления заказа.
Для автоматизации изменений лучше всего подходит woocommerce_order_status_changed, который позволяет реагировать на переход между статусами.
2. Пример добавления автоматической заметки при смене статуса заказа на "выполнен"
add_action('woocommerce_order_status_changed', 'add_note_on_completed', 10, 4);
function add_note_on_completed($order_id, $old_status, $new_status, $order) {
if ($new_status === 'completed') {
$order->add_order_note('Автоматическая заметка: заказ завершён и готов к отправке.');
}
}
3. Пример изменения стоимости товара в заказе при смене статуса
Иногда нужно автоматически корректировать цены — например, применять скидку, если заказ перешёл в особый статус.
add_action('woocommerce_order_status_changed', 'apply_discount_on_processing', 10, 4);
function apply_discount_on_processing($order_id, $old_status, $new_status, $order) {
if ($new_status === 'processing') {
foreach ($order->get_items() as $item_id => $item) {
$price = $item->get_subtotal();
$discounted_price = $price * 0.9; // скидка 10%
$item->set_subtotal($discounted_price);
$item->set_total($discounted_price);
$item->save();
}
$order->calculate_totals(true);
}
}
Проверка результата после внедрения
Чтобы убедиться, что хуки работают:
- Создайте тестовый заказ на сайте;
- Измените статус заказа в админке (например, на "выполнен" или "обрабатывается");
- Проверьте, появилась ли автоматическая заметка в разделе заметок заказа;
- Проверьте итоговую сумму заказа, если применялась корректировка цен.
Также можно добавить временный лог через error_log() или использовать плагин типа Query Monitor, чтобы отслеживать исполнение кода.
Частые ошибки и как их исправить
- Хук не срабатывает: проверьте правильность названия хука и количество аргументов в функции. Для
woocommerce_order_status_changedнужно 4 аргумента. - Изменения не сохраняются: при изменении позиций заказа обязательно вызывайте
$item->save()и$order->calculate_totals(true)для перерасчёта стоимости. - Ошибка при попытке изменить заказ, который уже завершён: некоторые методы доступны только для заказов в определённых статусах. Проверяйте статус перед изменениями.
- Конфликты с другими плагинами: отключите плагины, которые могут перезаписывать заказ, и проверьте работу хука заново.
Практические советы по безопасности и производительности
- Не выполняйте дорогостоящие операции внутри хуков — например, сетевые запросы без кеширования.
- Используйте проверку nonce и capability, если хук будет менять данные по пользовательскому действию.
- Для сложных изменений заказов лучше создавать отдельные сервисы или команды WP-CLI, вызываемые по крону, чтобы не тормозить оформление заказа.
- Сохраняйте резервные копии базы перед изменениями, особенно при массовой автоматизации.
Сравнение вариантов автоматизации изменений заказов
| Метод | Пример | Плюсы | Минусы |
|---|---|---|---|
| Хуки WooCommerce | woocommerce_order_status_changed | Простая интеграция, мгновенный отклик на события | Не всегда подходит для сложных логик, возможны конфликты |
| Планировщик WP-Cron | Отложенные задачи для проверки и изменения заказов | Можно выполнять сложную обработку вне основного потока | Задержки в исполнении, зависимость от посещаемости сайта |
| Плагины автоматизации | Например, AutomateWoo или подобные | Готовые решения с GUI, меньше кода | Платные, могут нагружать сайт |