Как использовать фильтры для автоматического изменения заказов WooCommerce

Диагностика задачи: зачем автоматизировать изменения заказов WooCommerce

В проектах на WooCommerce часто требуется модифицировать данные заказов на лету — например, автоматически менять цену, добавлять метаданные или корректировать статус заказа после определённых событий. Встроенные хуки WooCommerce позволяют встраиваться в процесс обработки заказа, но для изменения данных лучше использовать фильтры. Важно понять, когда и как применять фильтры, чтобы избежать ошибок и не нарушить логику работы магазина.

Какие фильтры WooCommerce подходят для изменения заказа

Основные фильтры, с которыми стоит работать для изменения заказа:

  • woocommerce_order_get_items — изменяет список товаров в заказе перед выводом или сохранением.
  • woocommerce_order_item_get_meta — позволяет фильтровать метаданные отдельных позиций заказа.
  • woocommerce_order_get_total — фильтрует итоговую сумму заказа.
  • woocommerce_checkout_create_order (действие, но важно для изменения заказа при создании).

Пример: изменим цену товара в заказе на 10% скидку при сохранении заказа.

Пример кода — автоматическое изменение цены товаров в заказе

add_filter('woocommerce_order_get_items', 'custom_discount_order_items', 10, 2);
function custom_discount_order_items($items, $order) {
    foreach ($items as $item_id => $item) {
        $product = $item->get_product();
        if ($product) {
            $original_price = $product->get_price();
            $discounted_price = $original_price * 0.9; // скидка 10%
            $item->set_subtotal($discounted_price * $item->get_quantity());
            $item->set_total($discounted_price * $item->get_quantity());
        }
    }
    return $items;
}

Пошаговое решение: изменение метаданных и статуса заказа

Рассмотрим пример, где нужно добавить мета-данные к заказу и автоматически менять статус на «в обработке» после успешной оплаты:

  1. Используйте хук woocommerce_checkout_create_order для добавления метаданных:
add_action('woocommerce_checkout_create_order', 'add_custom_meta_to_order', 20, 2);
function add_custom_meta_to_order($order, $data) {
    $order->update_meta_data('_custom_note', 'Заказ обработан автоматически');
}
  1. Для изменения статуса после оплаты — используйте хук woocommerce_payment_complete:
add_action('woocommerce_payment_complete', 'set_order_status_processing');
function set_order_status_processing($order_id) {
    $order = wc_get_order($order_id);
    if ($order && $order->get_status() !== 'processing') {
        $order->update_status('processing', 'Статус изменён автоматически после оплаты.');
    }
}

Проверка результата после внедрения

Чтобы убедиться, что фильтры и действия работают корректно, выполните следующие шаги:

  • Создайте тестовый заказ с товарами, к которым применяется скидка.
  • Проверьте, что итоговая сумма и стоимость товаров в заказе изменилась согласно логике.
  • Убедитесь, что в метаданных заказа появилась кастомная заметка.
  • После оплаты заказа проверьте, что статус изменился на «в обработке».

Для просмотра метаданных и изменений используйте панель администратора WooCommerce или запросы к базе (таблица wp_postmeta для заказов).

Частые ошибки и как их исправить

  • Ошибка: Изменения не сохраняются — причина часто в неправильном использовании методов или отсутствии вызова save() для объекта заказа.
    Решение: При изменении метаданных вызывайте $order->save(); после обновлений.
  • Ошибка: Изменения видны в админке, но не на фронтенде — часто это связано с кэшированием.
    Решение: Очистите кэш сайта и браузера, проверьте работу без кэша.
  • Ошибка: Сумма заказа не меняется после изменения цен в woocommerce_order_get_items.
    Решение: Для изменения цены лучше использовать хук woocommerce_before_calculate_totals на объект корзины, так как woocommerce_order_get_items влияет только на вывод, а не на расчёт итогов.

Практические советы по безопасности и производительности

  • Всегда проверяйте, что объекты и данные существуют перед их изменением, чтобы избежать фатальных ошибок.
  • Используйте кеширование только после полной проверки логики, чтобы избежать рассинхронизации данных.
  • Для массовых изменений заказов используйте WP-CLI скрипты, чтобы не нагружать сервер при загрузке страниц.
  • Минимизируйте количество тяжелых операций в хуках, особенно в woocommerce_before_calculate_totals, чтобы не замедлять процесс оформления заказа.

Сравнение вариантов изменения цен в заказе

МетодГде применяетсяПлюсыМинусы
woocommerce_before_calculate_totalsКорзина, оформление заказаИзменяет цены до расчета итоговой суммыНужно аккуратно работать с объектом корзины
woocommerce_order_get_itemsЗаказы после сохраненияМеняет данные для вывода, не влияет на итогНе подходит для корректировки итоговой суммы
Прямое обновление метаданных заказаПосле создания заказаПолный контроль над даннымиТребует сохранения объекта и может вызвать рассинхронизацию

Скачать WP с оф. сайта Магазин проверенных платных тем