В WordPress нередко возникает необходимость запускать определённые действия по расписанию: например, очищать кеш, отправлять письма, обновлять данные или выполнять другие рутинные задачи. Для этого используется встроенная система WP-Cron, которая позволяет создавать автоматические задачи (cron jobs) без доступа к системному cron сервера.
Что такое WP-Cron и как он работает в WordPress
WP-Cron — это виртуальный планировщик задач, встроенный в ядро WordPress. В отличие от системного cron, который запускается по расписанию в серверной ОС, WP-Cron запускается при каждом запросе к сайту (например, при загрузке страницы посетителем). Если в WP-Cron запланированы задачи, то они выполняются в этот момент.
Такой подход не требует настройки дополнительных сервисов на хостинге, что удобно для большинства пользователей. Но есть и минусы: если на сайте низкий трафик, задачи могут запускаться с задержкой, а при высоком — нагрузка на сайт возрастает.
WP-Cron позволяет создавать задачи с разной периодичностью: от секунд до дней, а также запускать их один раз в будущем.
Основные функции WP-Cron
wp_schedule_event()— создает повторяющееся событие в определённый интервал.wp_schedule_single_event()— создает однократное событие.wp_clear_scheduled_hook()— удаляет запланированное событие.add_action()— назначает функцию-обработчик на событие.
Как создать автоматическую задачу с помощью WP-Cron
Рассмотрим пример: нужно каждый час удалять устаревшие записи из пользовательской таблицы. Для этого создадим задачу, которая будет запускаться автоматически.
Сначала регистрируем событие при активации плагина или темы:
function wpengine_schedule_hourly_cleanup() {
if ( ! wp_next_scheduled( 'wpengine_hourly_cleanup_hook' ) ) {
wp_schedule_event( time(), 'hourly', 'wpengine_hourly_cleanup_hook' );
}
}
register_activation_hook( __FILE__, 'wpengine_schedule_hourly_cleanup' );
Здесь мы проверяем, не запланировано ли уже событие wpengine_hourly_cleanup_hook, и если нет — создаём его с интервалом hourly (каждый час).
Далее создаём функцию-обработчик, которая будет выполнять нужные действия:
function wpengine_hourly_cleanup_function() {
global $wpdb;
$table = $wpdb->prefix . 'my_custom_table';
$wpdb->query( "DELETE FROM $table WHERE created_at < NOW() - INTERVAL 30 DAY" );
}
add_action( 'wpengine_hourly_cleanup_hook', 'wpengine_hourly_cleanup_function' );
Функция удаляет записи старше 30 дней из таблицы my_custom_table. Она привязана к нашему хук-событию.
Важно также очистить запланированные задачи при деактивации плагина:
function wpengine_deactivate_cleanup() {
wp_clear_scheduled_hook( 'wpengine_hourly_cleanup_hook' );
}
register_deactivation_hook( __FILE__, 'wpengine_deactivate_cleanup' );
Добавление собственных интервалов запуска задач
По умолчанию WP-Cron поддерживает стандартные интервалы: каждые 1, 2, 3, 6, 12 часов и сутки. Если нужно задать свой интервал — можно добавить его через фильтр cron_schedules.
Например, добавим интервал в 10 минут:
function wpengine_custom_cron_intervals( $schedules ) {
if ( ! isset( $schedules['every_ten_minutes'] ) ) {
$schedules['every_ten_minutes'] = array(
'interval' => 600, // 600 секунд = 10 минут
'display' => 'Каждые 10 минут'
);
}
return $schedules;
}
add_filter( 'cron_schedules', 'wpengine_custom_cron_intervals' );
Теперь можно использовать этот интервал в функции wp_schedule_event():
wp_schedule_event( time(), 'every_ten_minutes', 'wpengine_custom_hook' );Практические советы по работе с WP-Cron
1. Диагностика и отладка задач WP-Cron
Для проверки запланированных задач удобно использовать плагин WP Crontrol. Он позволяет просматривать, запускать и удалять задачи через админку.
Если задачи не выполняются, стоит проверить, отключён ли стандартный запуск WP-Cron. В файле wp-config.php не должно быть строки define('DISABLE_WP_CRON', true); или её нужно временно отключить.
2. Настройка системного cron для надежности
WP-Cron зависит от посещаемости сайта. Для высоконагруженных или малопосещаемых проектов рекомендуется отключить WP-Cron и настроить системный cron. Для этого в wp-config.php добавьте:
define('DISABLE_WP_CRON', true);А на сервере создайте задачу, например, на выполнение каждые 15 минут:
wget -q -O - https://example.ru/wp-cron.php?doing_wp_cron >/dev/null 2>&13. Оптимизация количества и времени выполнения задач
Не стоит создавать слишком частые задачи без необходимости — это повысит нагрузку на сервер. Объединяйте похожие задачи и старайтесь выполнять тяжелые операции в периоды низкой нагрузки.
Если вы используете плагины вроде Clearfy Pro, они могут помочь оптимизировать работу WP-Cron и отключить ненужные задачи.
Пример создания плагина с WP-Cron на wpengine.ru
Для наглядности приведём минимальный пример плагина, который раз в сутки отправляет письмо администратору.
<?php
/**
* Plugin Name: WPengine Daily Mailer
* Description: Отправляет ежедневное письмо администратору с напоминанием.
* Version: 1.0
* Author: wpengine.ru
*/
function wpengine_schedule_daily_mail() {
if ( ! wp_next_scheduled( 'wpengine_daily_mail_hook' ) ) {
wp_schedule_event( time(), 'daily', 'wpengine_daily_mail_hook' );
}
}
register_activation_hook( __FILE__, 'wpengine_schedule_daily_mail' );
function wpengine_send_daily_mail() {
$admin_email = get_option( 'admin_email' );
wp_mail( $admin_email, 'Ежедневное напоминание', 'Это письмо отправлено автоматически с помощью WP-Cron.' );
}
add_action( 'wpengine_daily_mail_hook', 'wpengine_send_daily_mail' );
function wpengine_deactivate_daily_mail() {
wp_clear_scheduled_hook( 'wpengine_daily_mail_hook' );
}
register_deactivation_hook( __FILE__, 'wpengine_deactivate_daily_mail' );
Этот плагин показывает, как просто создавать и удалять задачи через WP-Cron.
Заключение
WP-Cron — мощный инструмент для автоматизации в WordPress, позволяющий запускать задачи без дополнительной настройки сервера. Понимание его работы и правильная настройка помогут оптимизировать сайт, выполнять регулярные операции и улучшить производительность. Используйте приведённые примеры и советы для создания собственных автоматических задач на вашем сайте wpengine.ru.