В WordPress встроена система планировщика задач — WP-Cron, которая позволяет запускать определённые функции в заданное время или с определённым интервалом. Это удобно для автоматизации рутинных процессов, например, очистки кэша, отправки писем, обновления данных или публикации запланированных постов.
Что такое WP-Cron и как он работает
WP-Cron — это имитация системного cron, встроенная в ядро WordPress. В отличие от системного cron, WP-Cron запускается не по системному расписанию, а при каждом посещении сайта пользователем. При первом же посещении после наступления времени запланированной задачи WP-Cron запускает эту задачу.
Такой подход прост, но имеет свои недостатки: если на сайт долго никто не заходит, задачи не запускаются вовремя. Для сайтов с низкой посещаемостью это может привести к задержкам в выполнении важных процессов.
Типы задач в WP-Cron
В WP-Cron можно создавать одноразовые задачи и повторяющиеся. Повторяющиеся задачи требуют регистрации интервалов времени. По умолчанию в WordPress есть несколько интервалов: hourly (часовой), twicedaily (два раза в день), daily (ежедневный).
Для более гибкого расписания можно добавить собственные интервалы.
Как добавить кастомный интервал для WP-Cron
Чтобы добавить, например, интервал в 10 минут, нужно использовать фильтр wp-kit_custom_cron_schedules, который мы создадим так:
function wpkit_add_custom_cron_interval($schedules) {
if (!isset($schedules['every_ten_minutes'])) {
$schedules['every_ten_minutes'] = array(
'interval' => 600, // 600 секунд = 10 минут
'display' => __('Каждые 10 минут')
);
}
return $schedules;
}
add_filter('cron_schedules', 'wpkit_add_custom_cron_interval');После этого в списке интервалов можно будет использовать every_ten_minutes.
Как зарегистрировать и запланировать задачу в WP-Cron
Для регистрации задачи нужно использовать функцию wp_schedule_event(). Пример регистрации задачи, которая запускается каждые 10 минут:
function wpkit_schedule_custom_task() {
if (!wp_next_scheduled('wpkit_custom_cron_hook')) {
wp_schedule_event(time(), 'every_ten_minutes', 'wpkit_custom_cron_hook');
}
}
add_action('wp', 'wpkit_schedule_custom_task');Здесь wpkit_custom_cron_hook — уникальный хук, на который нужно повесить функцию-обработчик.
Создание обработчика задачи
Теперь нужно определить функцию, которая будет выполняться по расписанию:
function wpkit_custom_cron_function() {
// Пример: очистка временных данных или отправка писем
error_log('WP-Kit: Запуск отложенной задачи в '.date('Y-m-d H:i:s'));
// Здесь пишем ваш код обработки
}
add_action('wpkit_custom_cron_hook', 'wpkit_custom_cron_function');Как удалить задачу из планировщика
Если нужно отменить задачу, используется wp_clear_scheduled_hook():
function wpkit_clear_custom_task() {
wp_clear_scheduled_hook('wpkit_custom_cron_hook');
}
// Для выполнения вызовите функцию один раз или через админку
// wpkit_clear_custom_task();Оптимизация работы WP-Cron с использованием системного cron
Поскольку WP-Cron запускается только при посещениях, для сайтов с малой посещаемостью рекомендуется отключить стандартный WP-Cron и настроить системный cron, который будет вызывать файл wp-cron.php с нужной периодичностью.
Отключение WP-Cron делается в wp-config.php:
define('DISABLE_WP_CRON', true);После этого добавьте в системный cron задачу:
*/10 * * * * wget -q -O - https://yourdomain.ru/wp-cron.php?doing_wp_cron >/dev/null 2>&1Замените yourdomain.ru на адрес вашего сайта. Это обеспечит запуск задач WP-Cron каждые 10 минут независимо от посещаемости.
Практическое применение: отправка рассылки с помощью WP-Cron
Рассмотрим пример автоматической рассылки писем подписчикам каждые сутки. Сначала зарегистрируем задачу:
function wpkit_schedule_daily_newsletter() {
if (!wp_next_scheduled('wpkit_daily_newsletter_hook')) {
wp_schedule_event(time(), 'daily', 'wpkit_daily_newsletter_hook');
}
}
add_action('wp', 'wpkit_schedule_daily_newsletter');Теперь создадим обработчик, который соберёт подписчиков и отправит письма:
function wpkit_send_daily_newsletter() {
$subscribers = get_users(array('role' => 'subscriber'));
foreach ($subscribers as $user) {
wp_mail($user->user_email, 'Ежедневная рассылка', 'Здравствуйте, это ваша ежедневная новость!');
}
}
add_action('wpkit_daily_newsletter_hook', 'wpkit_send_daily_newsletter');<Этот простой пример можно расширить, интегрируя с плагинами рассылок или сервисами SMTP для надежной доставки.
Полезные плагины для управления WP-Cron
Если не хочется вручную писать код, можно использовать плагины, например:
- Clearfy Pro — содержит функции для очистки и оптимизации WP-Cron;
- WPRemark — позволяет управлять запланированными задачами через админку;
- Expert Review — инструмент для оценки производительности, в том числе связанных с WP-Cron процессов.
Эти решения пригодятся для контроля и диагностики работы планировщика на вашем сайте.