Диагностика проблемы: зачем отключать email для отдельных заказов
WooCommerce по умолчанию отправляет уведомления при изменении статуса любого заказа. Однако в ряде случаев требуется отключить автоматическую отправку email для определённых типов или статусов заказов, например, для тестовых заказов, внутренних заказов или заказов с определённым метаполем. Стандартные настройки WooCommerce этого не предусматривают, поэтому приходится искать кастомные решения.
Пошаговое решение: отключение email по условию
1. Определение типа заказа или условия отключения
Сначала нужно понять, по какому признаку отключать email: по статусу заказа, по кастомному метаполю или по продуктам в заказе. Например, отключим уведомления для заказов, в которых есть продукт с ID 123 (тестовый товар).
2. Использование фильтра woocommerce_email_enabled_<email_id>
WooCommerce позволяет контролировать отправку email через фильтры вида woocommerce_email_enabled_customer_processing_order, woocommerce_email_enabled_new_order и т.д. Нужно добавить фильтр, который проверит заказ и вернёт false для отключения отправки.
3. Пример кода в functions.php темы или в кастомном плагине
add_filter('woocommerce_email_enabled_customer_processing_order', 'disable_email_for_specific_products', 10, 2);
add_filter('woocommerce_email_enabled_customer_completed_order', 'disable_email_for_specific_products', 10, 2);
function disable_email_for_specific_products($enabled, $order) {
// Проверяем, что передан объект WC_Order
if (!is_a($order, 'WC_Order')) {
return $enabled;
}
// Получаем все товары из заказа
foreach ($order->get_items() as $item) {
$product_id = $item->get_product_id();
// Если в заказе есть продукт с ID 123, отключаем email
if ($product_id === 123) {
return false;
}
}
return $enabled;
}Проверка результата после внедрения
- Создайте тестовый заказ с продуктом ID 123 и измените его статус на "Обработка" или "Завершён".
- Проверьте, что клиент не получил уведомление по email.
- Создайте заказ без продукта 123, убедитесь, что уведомления отправляются как обычно.
Частые ошибки и как их исправить
- Неправильный ID продукта: Проверьте, что используете правильный ID товара. В админке WooCommerce можно посмотреть ID в списке продуктов.
- Фильтр применён не к тому email: Для разных email-уведомлений есть свои фильтры. Убедитесь, что вы фильтруете именно нужные, например,
woocommerce_email_enabled_customer_processing_orderдля уведомлений о статусе "Обработка". - Код добавлен не в правильное место: Рекомендуется добавлять код в functions.php дочерней темы или в отдельный плагин, чтобы не потерять изменения при обновлении.
- Объект $order не передаётся: Убедитесь, что в хук передается объект WC_Order. В старых версиях WooCommerce могут быть отличия.
Практические советы по безопасности и производительности
- Не отключайте уведомления полностью без веской причины — это может привести к пропущенным важным сообщениям.
- Для сложных условий фильтрации используйте метаполя заказов, а не жестко прописанные ID товаров.
- Кэширование email-уведомлений может влиять на работу фильтров — тестируйте на чистой среде.
- Логируйте отключение уведомлений, чтобы видеть, когда и почему email не отправляется, например, через error_log или WPCheck.
Сравнение вариантов реализации
| Метод | Плюсы | Минусы | Пример |
|---|---|---|---|
Фильтр woocommerce_email_enabled_<email_id> |
Гибкий, работает на уровне WooCommerce, не отключает все email сразу | Нужно знать ID email, для каждого email фильтр добавлять отдельно | Пример в статье |
| Отключение email через плагин (например, Disable Emails) | Простая настройка, быстро | Отключает все email, не подходит для выборочного отключения | Плагин Disable Emails |
| Переопределение класса WC_Email | Максимальный контроль | Сложно в поддержке, требует глубоких знаний | Кастомный плагин |