Диагностика проблемы с уведомлениями о неуспешной оплате в WooCommerce
Часто бывает, что после неудачной попытки оплаты покупатель не получает уведомление о статусе заказа, а администратор магазина не получает предупреждение. Это приводит к путанице и увеличению нагрузки на службу поддержки. WooCommerce по умолчанию не отправляет email при статусе заказа "failed" (неуспешно). Для решения этой задачи необходимо добавить кастомную отправку писем на основе хуков WooCommerce.
Почему стандартные уведомления не работают при статусе "failed"?
WooCommerce по умолчанию не активирует email-уведомления на смену статуса заказа в "failed". Это связано с тем, что этот статус рассматривается как "окончательный" отрицательный, и пользователь должен быть уведомлен иным способом. В результате, без кастомной настройки, письма о неуспешной оплате не отправляются.
Пошаговое решение: добавляем отправку email при неуспешной оплате
1. Создаем кастомный класс email-уведомления
Создадим собственный класс, наследующий WC_Email, который будет отправлять письмо при смене статуса заказа на "failed".
if ( ! class_exists( 'WC_Email_Failed_Payment' ) ) :
class WC_Email_Failed_Payment extends WC_Email {
public function __construct() {
$this->id = 'failed_payment';
$this->title = 'Уведомление о неуспешной оплате';
$this->description = 'Отправляет письмо клиенту при неудачной оплате заказа.';
$this->template_html = 'emails/customer-failed-payment.php';
$this->template_plain = 'emails/plain/customer-failed-payment.php';
$this->template_base = WC()->template_path();
// Триггер на смену статуса
add_action( 'woocommerce_order_status_failed_notification', array( $this, 'trigger' ) );
parent::__construct();
$this->recipient = $this->get_option( 'recipient', '' );
if ( ! $this->recipient ) {
$this->recipient = $this->object->get_billing_email();
}
}
public function trigger( $order_id ) {
if ( ! $order_id ) {
return;
}
$this->object = wc_get_order( $order_id );
$this->recipient = $this->object->get_billing_email();
if ( ! $this->is_enabled() || ! $this->get_recipient() ) {
return;
}
$this->send( $this->get_recipient(), $this->get_subject(), $this->get_content(), $this->get_headers(), $this->get_attachments() );
}
public function get_content_html() {
ob_start();
wc_get_template( $this->template_html, array(
'order' => $this->object,
'email_heading' => $this->get_heading(),
'sent_to_admin' => false,
'plain_text' => false,
'email' => $this,
), '', $this->template_base );
return ob_get_clean();
}
public function get_content_plain() {
ob_start();
wc_get_template( $this->template_plain, array(
'order' => $this->object,
'email_heading' => $this->get_heading(),
'sent_to_admin' => false,
'plain_text' => true,
'email' => $this,
), '', $this->template_base );
return ob_get_clean();
}
}
endif;2. Регистрируем новый email в WooCommerce
Добавим фильтр на список email-уведомлений, чтобы WooCommerce распознал наш новый класс:
add_filter( 'woocommerce_email_classes', function( $emails ) {
require_once 'path/to/class-wc-email-failed-payment.php'; // Укажите путь к классу
$emails['WC_Email_Failed_Payment'] = new WC_Email_Failed_Payment();
return $emails;
} );3. Создаем шаблоны писем
Скопируйте шаблоны из woocommerce/templates/emails/customer-processing-order.php и адаптируйте их под уведомление о неуспешной оплате, например:
<?php
/**
* Email шаблон уведомления о неуспешной оплате
*/
?>
<h1><?php echo esc_html( $email_heading ); ?></h1>
<p>Ваш заказ №<?php echo $order->get_order_number(); ?> не был оплачен.</p>
<p>Пожалуйста, проверьте способ оплаты и повторите попытку.</p>
<?php do_action( 'woocommerce_email_order_details', $order, false, false, $email ); ?>
<?php do_action( 'woocommerce_email_footer', $email ); ?>Проверка результата после внедрения
Для проверки корректной работы:
- Создайте тестовый заказ и искусственно переведите его в статус
failedчерез админку или код:
$order = wc_get_order( $order_id );
$order->update_status( 'failed', 'Тестовое уведомление о неудачной оплате' );- Проверьте, что письмо пришло на email покупателя.
- В админке WooCommerce перейдите в WooCommerce > Настройки > Email и найдите ваше новое уведомление — можно отправить тестовое письмо.
Частые ошибки и как их исправить
- Класс email не подключен или путь указан неверно. Проверьте, что файл с классом подключается корректно и не содержит синтаксических ошибок.
- Письмо не отправляется из-за отключенного уведомления. В настройках email убедитесь, что ваше уведомление включено.
- Отсутствует корректный шаблон письма. Если шаблон не найден, письмо будет пустым. Создайте базовые шаблоны по примеру стандартных WooCommerce.
- Проблемы с почтовой системой WordPress. Проверьте отправку почты через
wp_mail()отдельно, используйте плагины типа WP Mail Logging для диагностики.
Практические советы по безопасности и производительности
- Не используйте тяжелый PHP-код внутри email-шаблонов, чтобы не замедлять генерацию почты.
- Обязательно фильтруйте и экранируйте все данные, выводимые в письмах, чтобы избежать XSS-уязвимостей.
- Для массовых уведомлений используйте очереди отправки (например, WP Mail SMTP с очередями или сторонние сервисы) для снижения нагрузки на сервер.
- Регулярно проверяйте логи отправки почты и статус доставки, чтобы вовремя обнаружить проблемы с SMTP или API.
Чек-лист по настройке отправки писем при неуспешной оплате в WooCommerce
- Создать кастомный класс email с наследованием от
WC_Email. - Зарегистрировать класс в фильтре
woocommerce_email_classes. - Создать и адаптировать шаблоны писем для HTML и plain text.
- Включить уведомление в WooCommerce настройках email.
- Проверить отправку тестового письма и при смене статуса заказа на
failed. - Использовать логирование для отладки и мониторинга отправки.
Сравнение вариантов реализации
| Метод | Преимущества | Недостатки | Когда использовать |
|---|---|---|---|
| Кастомный класс WC_Email | Полная интеграция с WooCommerce, кастомизация шаблонов, управление из админки | Сложнее в реализации, требует поддержки | Для стабильных и профессиональных решений по уведомлениям |
Отправка письма через wp_mail() в хуке смены статуса | Простота реализации, быстрое решение | Отсутствие интеграции с email-системой WooCommerce, нет шаблонов | Для простых и временных уведомлений |