В WordPress часто возникает необходимость выполнить какую-то задачу с задержкой или периодически: например, отправлять уведомления, обновлять данные, очищать кэш или импортировать контент. Для этого идеально подходит механизм отложенного запуска задач — Cron. В этой статье разберём, как правильно настроить отложенный запуск функций в WordPress, используя как встроенный WP-Cron, так и системные cron-задачи и плагины для удобства.
Что такое WP-Cron и почему он не всегда надёжен
WP-Cron — это встроенный в WordPress механизм для планирования отложенных и периодических задач. Его особенность — он запускается при первом посещении сайта после наступления времени следующей задачи. Это значит, что если на сайт никто не заходит, задачи не выполняются.
Из-за этого WP-Cron подходит для малонагруженных сайтов, но для серьёзных проектов лучше использовать системные cron-задачи, которые запускаются по расписанию независимо от посещаемости.
Давайте разберём, как работать с WP-Cron, а затем рассмотрим, как переключиться на системный cron для надёжности.
Как добавить отложенную задачу в WP-Cron
Для планирования задачи в WP-Cron используется функция wp_schedule_event. Вот пример, как запланировать запуск функции wp_course_send_reminder через час и затем повторять её каждый час.
function wp_course_send_reminder() {
// Логика отправки напоминания
error_log('Отправлено напоминание пользователям');
}
// Регистрируем наш хук
add_action('wp_course_hourly_event', 'wp_course_send_reminder');
// Функция для планирования события
function wp_course_schedule_event() {
if (!wp_next_scheduled('wp_course_hourly_event')) {
wp_schedule_event(time() + 3600, 'hourly', 'wp_course_hourly_event');
}
}
add_action('wp', 'wp_course_schedule_event');
Обратите внимание, что мы используем префикс wp_course_ для уникальности. Это важно, чтобы избежать конфликтов с другими плагинами.
Здесь мы планируем событие с именем wp_course_hourly_event, которое будет срабатывать каждый час и вызывать функцию wp_course_send_reminder.
Удаление задачи
Если требуется отменить запланированное событие, используйте:
function wp_course_clear_scheduled_event() {
$timestamp = wp_next_scheduled('wp_course_hourly_event');
if ($timestamp) {
wp_unschedule_event($timestamp, 'wp_course_hourly_event');
}
}
Создание пользовательского интервала для WP-Cron
По умолчанию WP-Cron поддерживает интервалы 'hourly', 'twicedaily' и 'daily'. Если нужна своя периодичность, например каждые 10 минут, можно добавить свой интервал:
function wp_course_custom_cron_schedules($schedules) {
if (!isset($schedules['every_ten_minutes'])) {
$schedules['every_ten_minutes'] = array(
'interval' => 600, // 600 секунд = 10 минут
'display' => 'Каждые 10 минут'
);
}
return $schedules;
}
add_filter('cron_schedules', 'wp_course_custom_cron_schedules');
Теперь можно использовать этот интервал при планировании:
wp_schedule_event(time(), 'every_ten_minutes', 'wp_course_hourly_event');
Отладка WP-Cron: как проверить, работает ли отложенный запуск
WP-Cron не всегда запускается из-за отсутствия посетителей. Для проверки можно использовать плагин WP Crontrol. Он позволяет:
- Просматривать запланированные задачи;
- Редактировать или удалять задачи;
- Запускать задачи вручную для тестирования;
- Добавлять свои cron-события.
Установка и использование очень просты — просто найдите плагин в репозитории WordPress и активируйте.
Переключение на системный Cron для надёжности
Чтобы WP-Cron не зависел от посещаемости сайта, можно отключить его и использовать системный cron. Для этого в wp-config.php добавьте:
define('DISABLE_WP_CRON', true);
Далее на сервере создайте cron-задачу, которая будет запускать WP-Cron скрипт раз в 5 минут (пример для Linux):
*/5 * * * * wget -q -O - https://ваш-сайт.ru/wp-cron.php?doing_wp_cron >/dev/null 2>&1
Или с помощью curl:
*/5 * * * * curl -s https://ваш-сайт.ru/wp-cron.php?doing_wp_cron >/dev/null 2>&1
Это гарантирует, что задачи будут выполняться регулярно без зависимости от посещений.
Использование плагина Clearfy Pro для управления Cron задачами
Если вы используете Clearfy Pro, то можете легко управлять WP-Cron задачами через удобный интерфейс. Плагин позволяет отключать ненужные задачи, оптимизировать частоту запуска и устранять конфликты между плагинами.
Это особенно полезно на больших сайтах, где много плагинов создают свои cron-события.
Пример: создание отложенной очистки кэша с помощью WP-Cron
Допустим, у вас есть плагин кэширования, и нужно очищать кэш каждые 30 минут. Вот пример кода:
function wp_course_clear_cache() {
if (function_exists('wp_cache_clear_cache')) {
wp_cache_clear_cache();
error_log('Кэш очищен');
}
}
add_action('wp_course_clear_cache_event', 'wp_course_clear_cache');
function wp_course_schedule_cache_clear() {
if (!wp_next_scheduled('wp_course_clear_cache_event')) {
wp_schedule_event(time(), 'thirty_minutes', 'wp_course_clear_cache_event');
}
}
add_action('wp', 'wp_course_schedule_cache_clear');
// Добавим интервал 30 минут
function wp_course_add_thirty_minutes_interval($schedules) {
$schedules['thirty_minutes'] = array(
'interval' => 1800, // 30 минут
'display' => 'Каждые 30 минут'
);
return $schedules;
}
add_filter('cron_schedules', 'wp_course_add_thirty_minutes_interval');
Резюме и рекомендации по работе с отложенным запуском функций в WordPress
Отложенный запуск функций через WP-Cron — мощный инструмент, но требует понимания его работы и ограничений. Если сайт небольшой — WP-Cron подойдёт, но для серьёзных проектов лучше настроить системный cron.
Используйте уникальные имена событий, не забывайте планировать и удалять задачи корректно, добавляйте пользовательские интервалы при необходимости. Для удобства и контроля применяйте плагины вроде WP Crontrol и Clearfy Pro.
Так вы обеспечите стабильную работу отложенных процессов и повысите производительность сайта.