WP-Cron — это встроенная в WordPress система планирования задач, которая позволяет запускать определённые действия по расписанию. В отличие от классического cron на сервере, WP-Cron срабатывает при посещении сайта, что делает его удобным и в то же время накладывает свои ограничения. В этой статье мы подробно рассмотрим, как правильно использовать WP-Cron для автоматизации задач, какие бывают типы cron-задач, как создавать свои события, а также приведём практические примеры с кодом.
Что такое WP-Cron и как он работает
WP-Cron — это имитация системы планировщика cron, встроенная в ядро WordPress. Она позволяет запускать задачи в определённое время или с определённым интервалом. Но в отличие от системного cron, WP-Cron не запускается автоматически по времени, а срабатывает при посещении сайта, то есть когда кто-то открывает страницу. Это важно понимать, потому что если у сайта мало посетителей, задачи могут запускаться с задержками.
Основные особенности WP-Cron:
- Запускается при загрузке страницы (frontend или backend);
- Позволяет планировать повторяющиеся и одноразовые задачи;
- Все задачи хранятся в базе данных в таблице
wp_options(опцияcron); - Можно создавать и удалять задачи программно;
- Имеет ограничения по времени запуска и задержкам, если нет посещений.
WP-Cron подходит для большинства задач, связанных с автоматизацией в WordPress, например, отправка писем, обновление данных, синхронизация и т.д.
Как создавать и планировать задачи с помощью WP-Cron
Для работы с WP-Cron есть несколько основных функций:
wpmail_schedule_event()— планирует событие;wpmail_unschedule_event()— отменяет запланированное событие;wpmail_cron_hook_callback()— функция-обработчик, которая выполнится при срабатывании события.
Рассмотрим пример создания повторяющейся задачи, которая будет выполняться каждые 10 минут и выводить лог в файл.
Шаг 1. Регистрируем событие при активации плагина или темы
function wpmail_activate_cron_job() {
if (! wp_next_scheduled('wpmail_custom_cron_hook')) {
wp_schedule_event(time(), 'ten_minutes', 'wpmail_custom_cron_hook');
}
}
register_activation_hook(__FILE__, 'wpmail_activate_cron_job');Здесь мы проверяем, не запланировано ли событие с хуком wpmail_custom_cron_hook, и если нет — создаём его с интервалом ten_minutes.
Шаг 2. Регистрируем интервал в десять минут
function wpmail_add_cron_interval($schedules) {
$schedules['ten_minutes'] = [
'interval' => 600, // 600 секунд = 10 минут
'display' => __('Каждые 10 минут')
];
return $schedules;
}
add_filter('cron_schedules', 'wpmail_add_cron_interval');По умолчанию в WordPress нет интервала 10 минут, поэтому добавляем его через фильтр cron_schedules.
Шаг 3. Создаём функцию-обработчик задачи
function wpmail_custom_cron_hook_callback() {
$log_file = WP_CONTENT_DIR . '/wpmail-cron.log';
$message = date('Y-m-d H:i:s') . " - WP-Cron сработал\n";
file_put_contents($log_file, $message, FILE_APPEND);
}
add_action('wpmail_custom_cron_hook', 'wpmail_custom_cron_hook_callback');Эта функция будет записывать в файл лог о срабатывании задачи.
Как отменить планирование и очистить задачи
Чтобы удалить запланированное событие, например, при деактивации плагина, нужно использовать функцию wp_clear_scheduled_hook():
function wpmail_deactivate_cron_job() {
wp_clear_scheduled_hook('wpmail_custom_cron_hook');
}
register_deactivation_hook(__FILE__, 'wpmail_deactivate_cron_job');Это гарантирует, что при удалении плагина не останется висящих cron-задач, которые могут вызывать ошибки или нагрузку.
Практические советы по работе с WP-Cron
1. Используйте системный cron для вызова WP-Cron
Если вы хотите, чтобы задачи запускались точно по времени, вместо запуска WP-Cron при каждом посещении, настройте системный cron на сервере, который будет обращаться к специальному URL WordPress:
wget -q -O - https://ваш_сайт.ru/wp-cron.php?doing_wp_cron >/dev/null 2>&1Выключите стандартный WP-Cron, добавив в wp-config.php:
define('DISABLE_WP_CRON', true);Так задачи будут запускаться стабильно без зависимости от посетителей.
2. Не создавайте слишком частые задачи
Интервалы менее 5 минут не рекомендуются, чтобы не нагружать сервер. Если нужна высокая частота, лучше использовать системный cron и оптимизировать логику задач.
3. Следите за ошибками и логами
Записывайте в логи результаты выполнения задач, чтобы отслеживать их корректность. Можно использовать плагины для мониторинга cron, например, WP Crontrol.
Полезные плагины для работы с WP-Cron
- WP Crontrol — позволяет просматривать, редактировать и удалять запланированные задачи через админку.
- Cron Manager — удобный интерфейс для управления cron-задачами и их логами.
- Advanced Cron Manager — расширенный набор инструментов для контроля и отладки cron.
Эти плагины полезны для отладки и контроля, особенно если вы создаёте свои задачи.
Пример: автоматическая очистка устаревших записей через WP-Cron
Допустим, нам нужно регулярно удалять записи из кастомной таблицы старше 30 дней. Вот пример реализации:
function wpmail_cleanup_old_records() {
global $wpdb;
$table = $wpdb->prefix . 'wpmail_custom_data';
$date = date('Y-m-d H:i:s', strtotime('-30 days'));
$wpdb->query($wpdb->prepare("DELETE FROM $table WHERE created_at < %s", $date));
}
function wpmail_schedule_cleanup() {
if (! wp_next_scheduled('wpmail_cleanup_hook')) {
wp_schedule_event(time(), 'daily', 'wpmail_cleanup_hook');
}
}
add_action('wpmail_cleanup_hook', 'wpmail_cleanup_old_records');
add_action('init', 'wpmail_schedule_cleanup');Этот код добавляет ежедневную задачу, которая удаляет устаревшие данные из таблицы. Очень полезно для автоматической поддержки чистоты базы данных.