Диагностика проблемы: автоматические письма WooCommerce при сборках заказа
WooCommerce по умолчанию отправляет уведомления клиентам и администраторам при изменении статуса заказа, включая сборку заказа и переход к следующему этапу. Иногда это нежелательно — например, если вы собираете заказ поэтапно и хотите отправлять письма только после полной готовности. Чтобы правильно отключить автоматическую отправку писем, нужно понять, какие именно уведомления вызывают проблему.
Как выявить нежелательные письма
- Перейдите в WooCommerce → Настройки → Электронные письма и посмотрите, какие письма активированы.
- Обратите внимание на письма с триггерами на смену статуса заказа, например «Заказ находится в обработке» или «Заказ завершён».
- Включите логирование почты (например, плагином WP Mail Logging), чтобы видеть, когда и какие письма отправляются.
Пошаговое решение: отключение писем при сборках заказа
Чтобы отключить автоматическую отправку писем для определённых статусов заказа, используйте следующий код. Он убирает отправку писем при смене статуса на "в обработке" (processing) и "завершён" (completed), если заказ ещё в процессе поэтапной сборки.
add_filter('woocommerce_email_enabled_customer_processing_order', 'disable_processing_email_for_build', 10, 2);
add_filter('woocommerce_email_enabled_customer_completed_order', 'disable_completed_email_for_build', 10, 2);
function disable_processing_email_for_build($enabled, $order) {
// Проверяем на флаг поэтапной сборки в метаданных заказа
if ($order->get_meta('is_build_in_progress') === 'yes') {
return false; // Отключаем письмо
}
return $enabled;
}
function disable_completed_email_for_build($enabled, $order) {
if ($order->get_meta('is_build_in_progress') === 'yes') {
return false;
}
return $enabled;
}Чтобы этот код работал, при создании или обновлении заказа нужно ставить метаданные is_build_in_progress в значение yes, пока сборка не завершена.
Добавление мета для заказа в процессе сборки
add_action('woocommerce_new_order', 'set_order_build_flag');
function set_order_build_flag($order_id) {
$order = wc_get_order($order_id);
// Устанавливаем флаг, что сборка началась
$order->update_meta_data('is_build_in_progress', 'yes');
$order->save();
}Проверка результата после внедрения
- Создайте тестовый заказ и убедитесь, что статус меняется на "в обработке" или "завершён", но письма не уходят, если мета
is_build_in_progressустановлена вyes. - Уберите или измените значение метаданных на
no— письма должны отправляться как обычно. - Проверьте логи почты — письма не должны дублироваться или уходить при смене статусов, если сборка в процессе.
Частые ошибки и как исправить
- Письма продолжают отправляться, несмотря на фильтр: Проверьте, правильно ли передаётся объект
$orderв фильтре. В некоторых версиях WooCommerce аргументы могут отличаться. Используйтеvar_dump($order)для отладки. - Метаданные не устанавливаются: Убедитесь, что у вас есть права на изменение заказа, и что метод
update_meta_dataвызывается доsave(). - Письма отключены для всех заказов: Проверьте логику в функциях, чтобы условие отключения писем срабатывало только при нужном флаге.
Практические советы по безопасности и производительности
- Храните флаги сборки заказа в метаданных (postmeta) — это не нагрузит базу и удобно для кастомных фильтров.
- Не отключайте глобально все уведомления — это может привести к пропущенным важным сообщениям и ухудшению UX.
- Для массового обновления статусов и метаданных используйте WP-CLI или собственный скрипт с пакетной обработкой, чтобы избежать таймаутов.
Сравнение способов отключения писем WooCommerce
| Метод | Описание | Плюсы | Минусы |
|---|---|---|---|
Использование фильтров woocommerce_email_enabled_* | Отключение письма по условию в PHP | Гибко, без плагинов, точечное | Требует PHP навыков, нужно правильно передавать параметры |
| Отключение писем через админку WooCommerce | Выключение всех писем определённого типа | Просто, не требует кода | Нет гибкости, отключает письма всем заказам |
| Использование плагинов для управления письмами | Плагины с UI для настройки условий отправки | Удобство, расширенные настройки | Нагрузка на сайт, зависит от плагина |