Проблема: нежелательные уведомления по неоплаченным заказам
В стандартной работе WooCommerce отправляет уведомления клиентам и администратору о статусах заказов, в том числе и по заказам с неоплаченным статусом (например, "ожидает оплаты" или "в обработке"). Это может привести к путанице, когда клиент получает письмо о заказе, который еще не оплачен, или администратор получает лишние уведомления.
Как диагностировать проблему
- Проверьте список отправленных писем в WooCommerce (WooCommerce > Статус > Журнал почты).
- Убедитесь, что письма о новых заказах приходят даже для заказов со статусом, который подразумевает неоплату.
- Проверьте, какие хуки вызывают отправку уведомлений по умолчанию, например,
woocommerce_order_status_processing_notificationиwoocommerce_order_status_on-hold_notification.
Пошаговое решение: отключение уведомлений для неоплаченных заказов
Для решения задачи необходимо перехватить стандартную логику отправки писем и отключить их для заказов со статусом, который указывает на неоплату (например, "on-hold", "pending").
1. Определяем статусы, при которых нужно отключать письма
Чаще всего это pending и on-hold. Можно расширять список при необходимости.
2. Отключаем отправку писем через фильтр
WooCommerce позволяет отключать определённые письма с помощью фильтра woocommerce_email_enabled_{email_id}.
function disable_emails_for_unpaid_orders( $enabled, $order ) {
if ( ! is_a( $order, 'WC_Order' ) ) {
return $enabled;
}
$unpaid_statuses = array( 'pending', 'on-hold' );
if ( in_array( $order->get_status(), $unpaid_statuses, true ) ) {
return false; // Отключаем email
}
return $enabled;
}
add_filter( 'woocommerce_email_enabled_new_order', 'disable_emails_for_unpaid_orders', 10, 2 );
add_filter( 'woocommerce_email_enabled_customer_processing_order', 'disable_emails_for_unpaid_orders', 10, 2 );
add_filter( 'woocommerce_email_enabled_customer_on_hold_order', 'disable_emails_for_unpaid_orders', 10, 2 );В этом примере отключаются следующие письма:
- новый заказ (администратору) —
new_order - обработка заказа (клиенту) —
customer_processing_order - ожидает оплаты (клиенту) —
customer_on_hold_order
3. Размещение кода
Добавьте код в файл functions.php вашей дочерней темы или в отдельный плагин для кастомных функций.
Проверка результата
- Создайте заказ в WooCommerce со статусом
pendingилиon-hold. - Проверьте журнал почты WooCommerce (WooCommerce > Статус > Журнал почты) — письма с указанными статусами не должны отправляться.
- Измените статус заказа на
processingилиcompleted— письма должны отправляться как обычно.
Частые ошибки и как их исправить
- Письма все еще отправляются: Возможно, код добавлен в неподходящее место или кэш сайта мешает обновлению. Очистите кэш и убедитесь, что код активен.
- Функция не получает объект заказа: Проверьте тип параметра
$orderв фильтре, иногда приходит ID заказа или другой объект. - Неправильные ID писем: Используйте правильные email ID из WooCommerce. Чтобы их найти, можно посмотреть исходники плагина в папке
woocommerce/includes/emails/.
Практические советы по безопасности и производительности
- Не используйте отключение писем для заказов со статусами, которые требуют подтверждения — это может привести к потере важных уведомлений.
- Перед внесением изменений сделайте резервную копию
functions.phpили используйте дочернюю тему. - Тестируйте изменения в тестовой среде, чтобы не нарушить бизнес-процессы.
Сравнение способов отключения уведомлений
| Метод | Плюсы | Минусы | Пример использования |
|---|---|---|---|
Фильтры woocommerce_email_enabled_{email_id} | Простой, гибкий, не требует отключения всего письма | Нужно знать email ID, ограничен стандартными письмами | Приведён в статье код |
| Отключение писем в настройках WooCommerce | Простота настройки без кода | Отключает письма полностью для всех заказов | Настройки WooCommerce - Emails |
| Переопределение классов писем | Максимальная гибкость | Сложнее в реализации, требует PHP навыков | Создание собственного класса письма |