В WordPress встроена система планировщика задач — WP-Cron. Она отвечает за выполнение отложенных задач, таких как публикация запланированных записей, отправка писем или очистка кэша. Однако многие сталкиваются с тем, что задачи WP-Cron выполняются с задержкой или не выполняются вовсе. В этой статье разберём, почему так происходит, и как настроить WP-Cron для надёжной работы с примерами кода и рекомендациями.
Что такое WP-Cron и почему возникают проблемы с задержкой
WP-Cron — это псевдо-крон, который запускается не по системному времени, а при загрузке любой страницы сайта. То есть, если у сайта нет посетителей, запланированные задачи не выполняются. Кроме того, при высоких нагрузках или кэшировании страниц вызовы WP-Cron могут отставать или пропускаться.
Основные причины задержек:
- Низкий трафик сайта — задачи не запускаются вовремя;
- Кэширование страниц (например, с помощью плагинов кеша), которое блокирует выполнение wp-cron.php;
- Ограничения хостинга, блокирующие внутренние HTTP-запросы;
- Конфликты с другими плагинами, вызывающие ошибки при выполнении задач.
Все это приводит к тому, что автоматические задачи (например, публикация отложенных постов) не выполняются своевременно, что может критично для бизнеса.
Как отключить встроенный WP-Cron и настроить системный cron
Самое надёжное решение — отключить автоматический запуск WP-Cron при каждом заходе на сайт и настроить системный cron на сервере, который будет вызывать wp-cron.php с нужным интервалом.
Отключение встроенного WP-Cron
Для этого в файл wp-config.php добавьте строку:
define('DISABLE_WP_CRON', true);
Это остановит автоматический вызов задач при загрузке сайта.
Настройка системного cron на примере Linux-сервера
Добавьте в crontab следующую строку, чтобы запускать задачи каждые 15 минут (можете настроить интервал по необходимости):
*/15 * * * * curl -s https://ваш-сайт.ru/wp-cron.php?doing_wp_cron > /dev/null 2>&1
Или, если curl отсутствует, используйте wget:
*/15 * * * * wget -q -O - https://ваш-сайт.ru/wp-cron.php?doing_wp_cron > /dev/null 2>&1
Это обеспечит своевременный запуск всех запланированных задач без привязки к посещениям сайта.
Создание пользовательской задачи WP-Cron с примером кода
WP-Cron полезен для автоматизации различных процессов. Рассмотрим пример, как создать и зарегистрировать свою задачу, которая будет выполняться ежечасно.
Регистрация пользовательского события
function wpmonitor_custom_cron_schedules($schedules) {
if (!isset($schedules['hourly'])) {
$schedules['hourly'] = array(
'interval' => 3600, // 1 час в секундах
'display' => __('Каждый час'),
);
}
return $schedules;
}
add_filter('cron_schedules', 'wpmonitor_custom_cron_schedules');
В этом коде мы добавили интервал для запуска задачи каждый час.
Создание задачи и её обработчика
function wpmonitor_schedule_custom_event() {
if (!wp_next_scheduled('wpmonitor_hourly_event')) {
wp_schedule_event(time(), 'hourly', 'wpmonitor_hourly_event');
}
}
add_action('wp', 'wpmonitor_schedule_custom_event');
function wpmonitor_do_hourly_task() {
// Код задачи: например, очистка устаревших опций
global $wpdb;
$wpdb->query("DELETE FROM $wpdb->options WHERE option_name LIKE '_transient_wpmonitor_%' AND option_value < NOW() - INTERVAL 1 DAY");
}
add_action('wpmonitor_hourly_event', 'wpmonitor_do_hourly_task');
Этот код создаёт событие wpmonitor_hourly_event, которое запускается каждый час и выполняет функцию очистки устаревших транзиентов.
Мониторинг и отладка выполнения WP-Cron задач
Для контроля и диагностики задач WP-Cron рекомендуются плагины:
- WP Crontrol — позволяет просматривать, редактировать и запускать задачи вручную.
- Clearfy Pro — среди прочих возможностей помогает оптимизировать работу WP-Cron и устранять конфликты.
Для отладки можно добавить логирование вызовов задач. Пример:
function wpmonitor_do_hourly_task() {
if (defined('WP_DEBUG') && WP_DEBUG) {
error_log('WPMonitor: wpmonitor_hourly_event выполнено в ' . current_time('mysql'));
}
// основная логика задачи
}
Это поможет убедиться, что задача действительно запускается.
Рекомендации по улучшению работы WP-Cron на сайте
Чтобы WP-Cron работал стабильно, обратите внимание на следующие рекомендации:
- Отключите встроенный WP-Cron и настройте системный cron для регулярного запуска
wp-cron.php. - Избегайте кэширования файлов
wp-cron.phpв настройках плагинов кеша. - Используйте функцию
wpmonitor_custom_cron_schedulesдля добавления удобных интервалов. - Проверяйте конфликтующие плагины, которые могут блокировать или замедлять выполнение задач.
- Используйте плагины мониторинга типа WP Crontrol для визуальной проверки задач.
Следуя этим советам, вы обеспечите своевременное выполнение запланированных задач и стабильную работу сайта.
Если хотите расширить функционал WP-Cron и оптимизировать работу сайта, рекомендуем обратить внимание на плагин Clearfy Pro, который включает инструменты для управления и оптимизации WordPress, в том числе и работу планировщика задач.