Хук wp_mail_failed
в WordPress срабатывает, если функция wp_mail()
не смогла успешно отправить письмо. Это позволяет разработчикам реагировать на ошибки при отправке, ведя лог или выполняя другие действия для диагностики.
do_action( 'wp_mail_failed', WP_Error $error );
Хук wp_mail_failed
активируется, когда происходит ошибка в процессе отправки email с использованием библиотеки PHPMailer. Он предоставляет объект WP_Error
, содержащий сообщение об ошибке и массив с данными отправленного письма, что позволяет отслеживать детали и источники ошибок.
Параметры
- $error (
WP_Error
): ОбъектWP_Error
, содержащий сообщение об ошибке из PHPMailer и массив с данными отправки:to
(string[]): Адреса получателей.subject
(string): Тема письма.message
(string): Содержимое письма.headers
(string[]): Дополнительные заголовки.attachments
(string[]): Пути к прикрепленным файлам.
Пример 1: Запись ошибок отправки email в лог
Этот пример записывает подробную информацию об ошибках отправки письма в лог WordPress, что может помочь в отладке проблем.
add_action( 'wp_mail_failed', 'log_mail_error' );
function log_mail_error( $wp_error ) {
$error_message = "Mail sending failed:\n";
$error_message .= "Error message: " . $wp_error->get_error_message() . "\n";
$error_message .= "Error data:\n" . print_r( $wp_error->get_error_data(), true ) . "\n";
// Записываем ошибку в лог
error_log( $error_message );
}
При ошибке отправки письмо с деталями ошибки будет записано в лог-файл /wp-content/debug.log
, что позволяет отследить параметры неудачной отправки.
Пример 2: Уведомление администратора о неудачной отправке
В этом примере, если письмо не было отправлено, администратору отправляется уведомление с деталями ошибки:
function notify_admin_on_mail_failure( $wp_error ) {
$admin_email = get_option( 'admin_email' );
$subject = "Ошибка отправки email";
$message = "Не удалось отправить письмо:\n";
$message .= "Ошибка: " . $wp_error->get_error_message() . "\n";
$message .= "Данные ошибки:\n" . print_r( $wp_error->get_error_data(), true );
wp_mail( $admin_email, $subject, $message );
}
add_action( 'wp_mail_failed', 'notify_admin_on_mail_failure' );
Этот код отправляет администратору информацию о неудачной отправке, что помогает оперативно узнавать о проблемах.
Пример 3: Сохранение ошибки отправки в базе данных
В этом примере ошибка записывается в базу данных для последующего анализа:
function save_mail_error_to_db( $wp_error ) {
global $wpdb;
$table_name = $wpdb->prefix . 'mail_errors';
$wpdb->insert(
$table_name,
array(
'error_message' => $wp_error->get_error_message(),
'error_data' => json_encode( $wp_error->get_error_data(), JSON_UNESCAPED_UNICODE ),
'date' => current_time( 'mysql' ),
)
);
}
add_action( 'wp_mail_failed', 'save_mail_error_to_db' );
Этот код записывает данные об ошибке в таблицу базы данных wp_mail_errors
, что полезно для создания статистики по ошибкам отправки.
Пример 4: Подробное логирование с использованием информации PHPMailer
Для более детальной отладки можно воспользоваться информацией об ошибке из PHPMailer. Этот код добавляет данные об ошибке из PHPMailer:
add_action( 'wp_mail_failed', 'detailed_mail_error_log' );
function detailed_mail_error_log( WP_Error $wp_error ) {
global $phpmailer;
$error_data = json_encode( $wp_error->get_error_data(), JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE );
$log_message = <<<LOG
Ошибка wp_mail():
- Сообщение об ошибке PHPMailer: {$phpmailer->ErrorInfo}
- Сообщение WP_Error: {$wp_error->get_error_message()}
- Данные WP_Error: {$error_data}
LOG;
error_log( $log_message );
}
Здесь мы добавляем дополнительную информацию об ошибке, включая ErrorInfo
от PHPMailer, что может быть полезно для более глубокой отладки.
Заключение
Хук wp_mail_failed
предоставляет гибкий способ управления ошибками отправки email в WordPress. С его помощью можно логировать ошибки, отправлять уведомления администратору, сохранять ошибки в базе данных и получать дополнительную информацию для отладки. Это значительно упрощает отслеживание и устранение проблем с отправкой писем.