Часто владельцы сайтов на WordPress сталкиваются с задачей автоматической рассылки писем пользователям или администраторам по расписанию. Это может быть напоминание о событиях, рассылка новостей, уведомления о заказах или результаты опросов. В данной статье разберём, как добавить такую функциональность без использования громоздких плагинов, а также с примерами кода и рекомендациями по популярным плагинам.
Почему стандартные функции WordPress не подходят для точного расписания email
В WordPress есть встроенный механизм WP-Cron, который позволяет запускать задачи по расписанию. Однако WP-Cron запускается только при заходе посетителя на сайт, что не гарантирует точность выполнения задач, особенно для сайтов с низкой посещаемостью.
Чтобы выполнять задачи по расписанию с высокой точностью, рекомендуется настроить системный cron на сервере, который будет запускать wp-cron.php с нужной периодичностью. В противном случае ваши письма могут уходить не вовремя или с задержкой.
Кроме того, важно грамотно организовать логику отправки email внутри callback-функций, чтобы избежать дублирования и ошибок.
Пример добавления кастомного планировщика для отправки email
Для начала создадим функцию, которая будет отправлять письма, и зарегистрируем для неё расписание через WP-Cron.
function wpweb_send_scheduled_email() {
$to = 'user@example.com';
$subject = 'Автоматическое письмо от WPWeb';
$message = 'Это тестовое письмо, отправленное по расписанию.';
$headers = array('Content-Type: text/html; charset=UTF-8');
wp_mail($to, $subject, $message, $headers);
}
// Регистрация события
if (!wp_next_scheduled('wpweb_hourly_email_event')) {
wp_schedule_event(time(), 'hourly', 'wpweb_hourly_email_event');
}
// Хук для выполнения функции
add_action('wpweb_hourly_email_event', 'wpweb_send_scheduled_email');
В этом коде мы создали задачу, которая будет запускаться ежечасно и отправлять письмо на указанный адрес. Обратите внимание, что для реального сайта адрес лучше брать из настроек или базы данных.
Как настроить системный cron для надежного запуска wp-cron.php
Чтобы cron запускался независимо от посещаемости сайта, нужно отключить WP-Cron от обычного запуска и добавить вызов wp-cron.php в системный cron.
# Отключаем WP-Cron в wp-config.php
define('DISABLE_WP_CRON', true);
Далее добавляем в crontab сервера:
*/15 * * * * wget -q -O - https://ваш-сайт.ru/wp-cron.php?doing_wp_cron >/dev/null 2>&1
Это запустит задачи WP-Cron каждые 15 минут. Можно настроить и чаще, если необходимо.
Использование плагинов для автоматической рассылки email по расписанию
Если хочется использовать готовые решения, обратите внимание на следующие плагины:
- WP Crontrol – позволяет управлять и отслеживать задачи WP-Cron через админку.
- WP Mail SMTP – гарантирует надежную отправку писем через SMTP-серверы.
- Newsletter – полноценный плагин для email-рассылок с расписанием и сегментацией.
Для интеграции с WPShop можно рассмотреть плагин WPRemark, который позволяет автоматически модераировать и отправлять уведомления, что удобно для сайтов с комментариями и отзывами.
Практические советы по отправке email в WordPress по расписанию
Чтобы избежать проблем с отправкой:
- Используйте надежный SMTP-сервер или сервисы типа SendGrid, Mailgun, чтобы письма не попадали в спам.
- Добавьте логирование отправленных писем – это поможет отследить ошибки.
- Используйте nonce и проверку прав в функциях, если планируете запускать отправку из фронтенда.
- Оптимизируйте тело письма, чтобы оно было информативным и лаконичным.
Пример расширения функции отправки с логированием
function wpweb_send_scheduled_email_with_log() {
$to = get_option('admin_email');
$subject = 'Ежечасное уведомление WPWeb';
$message = 'Привет! Это письмо отправлено автоматически по расписанию.';
$headers = array('Content-Type: text/html; charset=UTF-8');
$sent = wp_mail($to, $subject, $message, $headers);
if ($sent) {
error_log('WPWeb: Email успешно отправлен в ' . current_time('mysql'));
} else {
error_log('WPWeb: Ошибка при отправке email в ' . current_time('mysql'));
}
}
add_action('wpweb_hourly_email_event', 'wpweb_send_scheduled_email_with_log');
Этот код отправляет письмо и записывает результат в лог ошибок PHP, что удобно для мониторинга.