Как использовать WP-Cron для задач на выполнение по расписанию в WordPress

Диагностика проблемы: почему стандартный WP-Cron может не работать корректно

WP-Cron — это встроенный в WordPress механизм для запуска задач по расписанию (например, публикация отложенных постов, очистка кэша, отправка email и т.д.). Однако он работает не как системный cron, а запускается при обращении к сайту. Это приводит к проблемам:

  • Задачи не выполняются вовремя, если на сайт нет трафика.
  • На высоконагруженных сайтах WP-Cron может запускаться слишком часто, создавая нагрузку.
  • Трудно диагностировать, выполняются ли задачи и когда.

Чтобы понять, работает ли WP-Cron, можно использовать плагин WP Crontrol, который позволяет просмотреть и управлять запланированными задачами.

Как правильно использовать WP-Cron: пошаговое решение

1. Отключение встроенного WP-Cron и настройка системного cron

Для надежной работы лучше отключить автоматический вызов WP-Cron и запустить его через системный cron. Для этого в wp-config.php добавьте:

define('DISABLE_WP_CRON', true);

Далее настроьте системный cron (на примере Linux-сервера):

* * * * * wget -q -O - https://example.com/wp-cron.php?doing_wp_cron >/dev/null 2>&1
<

Эта команда будет запускать WP-Cron каждую минуту.

2. Добавление пользовательской задачи в WP-Cron

Пример: добавим задачу, которая будет выполняться раз в час и чистить устаревшие записи из кастомной таблицы.

function my_custom_cron_schedule($schedules) {
    if(!isset($schedules['hourly'])) {
        $schedules['hourly'] = [
            'interval' => 3600,
            'display' => __('Каждый час')
        ];
    }
    return $schedules;
}
add_filter('cron_schedules', 'my_custom_cron_schedule');

function my_custom_cron_task() {
    global $wpdb;
    $table = $wpdb->prefix . 'my_custom_table';
    $wpdb->query("DELETE FROM $table WHERE date < NOW() - INTERVAL 30 DAY");
}

if (!wp_next_scheduled('my_custom_cron_hook')) {
    wp_schedule_event(time(), 'hourly', 'my_custom_cron_hook');
}
add_action('my_custom_cron_hook', 'my_custom_cron_task');

3. Проверка и отладка задач WP-Cron

Для проверки зарегистрированных задач используйте плагин WP Crontrol или код:

$next_run = wp_next_scheduled('my_custom_cron_hook');
if ($next_run) {
    echo 'Следующий запуск: ' . date('Y-m-d H:i:s', $next_run);
} else {
    echo 'Задача не запланирована';
}

Чтобы вручную запустить задачу (для теста), вызовите:

do_action('my_custom_cron_hook');

Проверка результата после внедрения

  • Через системный cron убедитесь, что скрипт wp-cron.php вызывается каждую минуту (логи сервера или статус crontab).
  • Посмотрите в WP Crontrol, что задачи запланированы и время следующего запуска обновляется.
  • Проверьте результаты выполнения задачи — в примере очистку таблицы (например, количество записей в базе).
  • Для отладки можно добавить логирование в функцию задачи, например, через error_log().

Частые ошибки и их исправление при работе с WP-Cron

  • Задачи не запускаются: Проверьте, что DISABLE_WP_CRON не установлен в true без настроенного системного cron.
  • Несвоевременное выполнение: WP-Cron зависит от посещений сайта, если трафика мало — используйте системный cron.
  • Дублирование задач: Всегда проверяйте с помощью wp_next_scheduled(), чтобы не создавать несколько одинаковых событий.
  • Проблемы с HTTPS или URL: Убедитесь, что URL в командной строке cron корректный, совпадает с сайтом (http/https).

Практические советы по безопасности и производительности

  • Не запускайте тяжелые задачи на каждое посещение — используйте системный cron.
  • Для сложных задач используйте WP-Cron только для планирования, а выполнение делегируйте отдельным PHP-скриптам с контролем времени.
  • Ограничьте доступ к wp-cron.php по IP, если вызываете его из cron, чтобы избежать внешних вызовов.
  • Логируйте ошибки и время выполнения задач, чтобы быстро выявлять проблемы.

Сравнение вариантов запуска cron в WordPress

МетодПлюсыМинусыРекомендуемое использование
Стандартный WP-CronПрост в настройке, работает из коробкиЗависит от трафика, нет точного времени запускаДля небольших сайтов с регулярным трафиком
Системный cron + DISABLE_WP_CRONТочный запуск, надежностьНужно настраивать на сервереДля средних и больших сайтов
Внешние сервисы cronНе зависит от сервера, легко масштабируетсяЗависимость от сторонних сервисовДля критичных задач, если нет доступа к серверу
Как создать автоматическое резервное копирование базы данных в WordPress
07.01.2026
Как отключить Emoji в WordPress без плагинов для ускорения сайта
23.02.2026
Как добавить автоматическое оптимизирование изображений в WordPress
18.11.2025
Как избежать конфликтов между WooCommerce и плагинами кеширования
21.05.2026
Как отключить кеширование в WooCommerce без плагинов: практическое руководство
23.04.2026