Как использовать WP-Cron для автоматизации задач в WordPress

Что такое WP-Cron и зачем он нужен в WordPress

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

Диагностика проблем с WP-Cron

Частые симптомы неправильной работы WP-Cron:

  • Запланированные задачи не выполняются вовремя или не выполняются вообще.
  • Задержки в запуске задач, особенно при низком трафике сайта.
  • Ошибки в логах, связанные с HTTP-запросами к wp-cron.php.

Для диагностики используйте плагин WP Crontrol (https://wordpress.org/plugins/wp-crontrol/) — он позволяет просматривать и запускать задачи вручную, а также видеть расписание.

Как настроить WP-Cron для надежной работы

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

По умолчанию WP-Cron запускается при каждом заходе на сайт, что не подходит для сайтов с низкой посещаемостью. Оптимальное решение — отключить этот запуск и настроить системный cron на сервере.

1. В wp-config.php добавьте:

define('DISABLE_WP_CRON', true);

2. Настройте cron задачу на сервере (пример для Linux), чтобы запускать wp-cron.php каждые 15 минут:

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

Или через curl:

*/15 * * * * curl -s https://example.com/wp-cron.php?doing_wp_cron > /dev/null 2>&1

Замените https://example.com на ваш домен.

Регистрация и использование собственных запланированных событий (cron hooks)

Чтобы запустить свою функцию по расписанию, создайте и зарегистрируйте событие:

function my_custom_cron_job() {
    // Ваша логика, например очистка устаревших данных
    global $wpdb;
    $wpdb->query("DELETE FROM {$wpdb->prefix}postmeta WHERE meta_key = '_old_meta' AND meta_value < NOW() - INTERVAL 30 DAY");
}

add_action('my_hourly_event', 'my_custom_cron_job');

// Регистрация события при активации темы или плагина
if (!wp_next_scheduled('my_hourly_event')) {
    wp_schedule_event(time(), 'hourly', 'my_hourly_event');
}

Этот код запускает функцию my_custom_cron_job каждый час.

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

1. Установите и активируйте плагин WP Crontrol.

2. Перейдите в «Инструменты» → «Cron Events» и убедитесь, что ваше событие my_hourly_event отображается с корректным расписанием.

3. Запустите событие вручную кнопкой «Run Now» и проверьте в базе данных, что данные изменились (например, удалены старые метаданные).

4. Проверьте логи сервера и ошибок PHP для отсутствия ошибок при выполнении таска.

Частые ошибки и как их исправить

  • Задачи не запускаются вообще: Не отключен встроенный WP-Cron и системный cron не настроен. Проверьте DISABLE_WP_CRON и cron на сервере.
  • HTTP-запросы к wp-cron.php блокируются: Проверьте настройки .htaccess, firewall и плагинов безопасности, которые могут блокировать запросы. Разрешите доступ к wp-cron.php.
  • Повторное создание событий: Поставьте проверку if (!wp_next_scheduled(...)), иначе задачи будут дублироваться и запускаться часто.
  • Задачи выполняются слишком часто или слишком редко: Используйте стандартные интервалы WordPress: 'hourly', 'twicedaily', 'daily', либо добавьте свои с помощью фильтра cron_schedules.

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

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

Сравнительная таблица вариантов запуска cron в WordPress

ВариантПлюсыМинусыПрименение
Встроенный WP-CronПрост в настройке, работает без сервераЗависит от трафика, нестабилен на низкозагруженных сайтахМалые сайты с постоянным трафиком
Системный cron + отключенный WP-CronНадежность, точность запуска, меньше нагрузкиТребует доступа к серверу и базовых навыков администрированияСайты с низким трафиком и высокими требованиями к расписанию
Как создать собственный тип записи (Custom Post Type) в WordPress с примерами кода
10.03.2026
Как настроить использование Transient API в WordPress для эффективного кэширования
26.03.2026
Как запретить регистрацию в WordPress и удалить форму регистрации
13.03.2026
WooCommerce: как автоматически удалять товары при нулевом остатке
23.05.2026
Как автоматизировать сборку данных с помощью AJAX в WordPress
04.04.2026