WooCommerce: настройка отправки писем при массовом изменении статуса заказов

|

Проблема: письма не отправляются при массовом обновлении заказов в WooCommerce

При массовом изменении статусов заказов в WooCommerce стандартная отправка уведомлений часто не срабатывает. Это связано с тем, что массовые действия в админке используют WP_Query без вызова стандартных хуков, отвечающих за триггер писем. В результате клиенты и администраторы не получают уведомления о смене статуса.

Диагностика проблемы

Если при одиночном изменении письма уходят, а при массовом — нет, значит WooCommerce не запускает стандартные хуки для массового обновления.

Пошаговое решение: как заставить WooCommerce отправлять письма при массовом изменении статуса

1. Создайте кастомный плагин или добавьте код в functions.php вашей темы (желательно дочерней) для перехвата массового обновления статуса заказов.

2. Используйте хук woocommerce_order_status_changed, который срабатывает при смене статуса заказа, чтобы вручную запускать отправку писем.

3. В массовом изменении заказов WooCommerce не вызывает этот хук корректно, поэтому нужно вручную перебрать заказы и вызвать отправку уведомлений.

add_action('load-edit.php', function() {
    if (!isset($_GET['post_type']) || $_GET['post_type'] !== 'shop_order') return;
    if (!isset($_POST['action']) || ($_POST['action'] !== 'edit' && $_POST['action2'] !== 'edit')) return;
    if (!isset($_POST['post']) || !is_array($_POST['post'])) return;

    $new_status = isset($_POST['order_status']) ? sanitize_text_field($_POST['order_status']) : '';
    if (!$new_status) return;

    foreach ($_POST['post'] as $order_id) {
        $order = wc_get_order($order_id);
        if (!$order) continue;

        $old_status = $order->get_status();
        if ($old_status !== $new_status) {
            $order->update_status($new_status, 'Статус изменен массово через админку', true);
        }
    }

    // Перенаправление чтобы избежать повторного выполнения
    wp_redirect(remove_query_arg(array('action', 'action2', 'post', 'order_status')));
    exit;
});

Объяснение кода:

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

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

Пример добавления статуса в bulk actions:

add_filter('bulk_actions-edit-shop_order', function($bulk_actions) {
    $bulk_actions['edit'] = __('Изменить статус', 'woocommerce');
    return $bulk_actions;
});

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

Проверка результата

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

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

Сравнение вариантов решения массового обновления статусов с отправкой писем

ПодходПлюсыМинусыПример
Стандартный WooCommerce Простота использования Письма не отправляются при массовом обновлении Отсутствует
Кастомный код с update_status() Гарантированная отправка писем, полный контроль Требует доработки интерфейса массовых действий Код из статьи
Плагины для массового изменения статусов Готовые решения, удобный UI Могут быть платными, не всегда гибкие WooCommerce Bulk Edit Plugins
Как удалить пустые категории в WordPress без плагинов
30.01.2026
Как решить проблему нерабочих пересылок в WooCommerce после обновлений
29.07.2026
WooCommerce: установка ограничений по срокам доставки и способам оплаты для конкретных товаров
02.07.2026
WooCommerce: как изменить цену товара в зависимости от роли пользователя
25.06.2026
WooCommerce: как убрать последние товары в корзине при отключении сессий
08.06.2026
×

AI-плагин

WPGPT
Сам создает статьи для вашего сайта WordPress

SEO и мета-теги

Парсинг конкурентов

Изображения

Комментарии

Подробнее