Автоматизация отправки email уведомлений в WordPress – частая задача для разработчиков, администраторов и владельцев сайтов. В этой статье подробно разберём, как создать автоматическую рассылку писем на основе событий и расписания с использованием встроенной системы WP-Cron. Это позволит, например, отправлять регулярные отчёты, уведомления о новых публикациях или напоминания без необходимости устанавливать сторонние плагины.
Что такое WP-Cron и почему он важен для автоматизации email
WP-Cron – это встроенный планировщик задач WordPress, который имитирует системный cron, но работает только при посещении сайта. Он позволяет запускать запланированные функции в определённое время или с определённым интервалом. Использование WP-Cron для отправки email удобно, так как не требует доступа к серверным cron, подходит для большинства хостингов и легко настраивается через код.
Однако, у WP-Cron есть особенности: он срабатывает только при заходе пользователей на сайт, поэтому если посещаемость низкая, задачи могут запускаться с задержками. Для решения этой проблемы можно настроить системный cron для вызова wp-cron.php, но в простых случаях этого не требуется.
Создание функции отправки email в WordPress
Для начала необходимо написать функцию, которая будет отправлять письмо. В WordPress для этого используется функция wp_mail(). Она позволяет отправлять email с темой, содержимым и заголовками.
function wpteam_send_scheduled_email() {
$to = 'user@example.com'; // адрес получателя
$subject = 'Автоматическое уведомление с wpteam.ru';
$message = 'Это письмо отправлено автоматически с использованием WP-Cron в WordPress.';
$headers = array('Content-Type: text/html; charset=UTF-8');
wp_mail($to, $subject, $message, $headers);
}
Эту функцию мы будем запускать автоматически по расписанию.
Регистрация и планирование задачи WP-Cron
Чтобы запускать функцию wpteam_send_scheduled_email автоматически, надо зарегистрировать событие в WP-Cron и задать интервал с помощью функции wp_schedule_event(). Рассмотрим пример, где письмо отправляется ежедневно в определённое время.
add_action('wpteam_daily_email_event', 'wpteam_send_scheduled_email');
function wpteam_activate_cron() {
if (!wp_next_scheduled('wpteam_daily_email_event')) {
wp_schedule_event(strtotime('08:00:00'), 'daily', 'wpteam_daily_email_event');
}
}
add_action('wp', 'wpteam_activate_cron');
Объяснение:
wpteam_daily_email_event– уникальное название события.wp_schedule_event– функция, которая планирует событие. В данном случае первый запуск запланирован на 8:00 утра, затем событие повторяется ежедневно.add_action('wpteam_daily_email_event', 'wpteam_send_scheduled_email')– привязывает функцию отправки письма к событию.add_action('wp', 'wpteam_activate_cron')– при каждом загрузке сайта проверяется, запланировано ли событие, и если нет – создаётся.
Добавление кастомного интервала для WP-Cron
WordPress по умолчанию поддерживает только стандартные интервалы: hourly, twicedaily и daily. Для более точного расписания можно добавить собственный интервал, например, раз в 15 минут или раз в 3 дня.
function wpteam_add_custom_cron_intervals($schedules) {
$schedules['every_fifteen_minutes'] = array(
'interval' => 900, // 900 секунд = 15 минут
'display' => 'Каждые 15 минут'
);
return $schedules;
}
add_filter('cron_schedules', 'wpteam_add_custom_cron_intervals');
После этого можно использовать новый интервал при планировании события:
if (!wp_next_scheduled('wpteam_fifteen_min_event')) {
wp_schedule_event(time(), 'every_fifteen_minutes', 'wpteam_fifteen_min_event');
}
add_action('wpteam_fifteen_min_event', 'wpteam_send_scheduled_email');
Практические советы и рекомендации
1. Очистка планировщика. Если при тестировании нужно удалить старые события, используйте wp_clear_scheduled_hook('wpteam_daily_email_event').
2. Отладка email. Для отладки отправки писем полезно использовать плагин WPCommunity или плагин WP Mail Logging, чтобы видеть, какие письма уходят.
3. Использование HTML в письмах. Чтобы отправлять красивое HTML-сообщение, укажите заголовок Content-Type, как в примере выше, и формируйте тело письма с HTML-тегами.
4. Интеграция с плагинами. Если вы используете плагин WPRemark для управления комментариями, можно отправлять уведомления о новых комментариях автоматом, связав их с WP-Cron.
Пример расширенного сценария: еженедельный отчет с данными из базы
Допустим, нужно раз в неделю отправлять отчет с количеством новых пользователей и публикаций. Можно написать функцию так:
function wpteam_send_weekly_report() {
global $wpdb;
$users_count = $wpdb->get_var("SELECT COUNT(ID) FROM {$wpdb->users} WHERE user_registered >= DATE_SUB(NOW(), INTERVAL 7 DAY)");
$posts_count = $wpdb->get_var("SELECT COUNT(ID) FROM {$wpdb->posts} WHERE post_date >= DATE_SUB(NOW(), INTERVAL 7 DAY) AND post_status = 'publish'");
$to = 'admin@wpteam.ru';
$subject = 'Еженедельный отчет сайта wpteam.ru';
$message = "<h2>Отчет за последнюю неделю</h2>";
$message .= "<p>Новых пользователей: {$users_count}</p>";
$message .= "<p>Новых публикаций: {$posts_count}</p>";
$headers = array('Content-Type: text/html; charset=UTF-8');
wp_mail($to, $subject, $message, $headers);
}
add_action('wpteam_weekly_report_event', 'wpteam_send_weekly_report');
function wpteam_schedule_weekly_report() {
if (!wp_next_scheduled('wpteam_weekly_report_event')) {
wp_schedule_event(strtotime('Monday 09:00:00'), 'weekly', 'wpteam_weekly_report_event');
}
}
add_action('wp', 'wpteam_schedule_weekly_report');
Этот код отправит отчет каждое понедельник в 9 утра с актуальными данными сайта.