WP-Cron: эффективная автоматизация задач в WordPress

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

WP-Cron — это встроенный механизм планировщика задач в WordPress, который позволяет выполнять определённые действия по расписанию. Это может быть отправка писем, удаление устаревших данных, обновление кэша или любые кастомные задачи. В отличие от классического cron в Linux, WP-Cron запускается при посещении сайта, что может привести к задержкам и пропускам в выполнении задач.

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

Частая проблема — запланированные задачи не выполняются вовремя или не срабатывают вообще. Проверить состояние можно через плагин WP Crontrol или с помощью WP CLI команд:

wp cron event list

Если список пуст или задачи не выполняются, нужно проверить несколько моментов:

  • Включён ли WP-Cron (константа DISABLE_WP_CRON не должна быть true).
  • Есть ли реальный трафик на сайт для запуска WP-Cron.
  • Ошибки PHP, которые могут блокировать выполнение задач.
  • Корректность регистрации задач и их расписания.

Пошаговое решение: правильная настройка WP-Cron

1. Проверка и включение WP-Cron

Убедитесь, что в wp-config.php нет отключения WP-Cron:

define('DISABLE_WP_CRON', true); // Эта строка должна отсутствовать или быть false

2. Регистрация собственной задачи

Добавим задачу, например, ежедневное удаление устаревших транзиентов:

function wpall_register_cron_event() {
    if ( ! wp_next_scheduled( 'wpall_daily_cleanup' ) ) {
        wp_schedule_event( time(), 'daily', 'wpall_daily_cleanup' );
    }
}
add_action( 'wp', 'wpall_register_cron_event' );

function wpall_do_daily_cleanup() {
    global $wpdb;
    $wpdb->query( "DELETE FROM $wpdb->options WHERE option_name LIKE '_transient_timeout_%' AND option_value < UNIX_TIMESTAMP()" );
}
add_action( 'wpall_daily_cleanup', 'wpall_do_daily_cleanup' );

Здесь мы создаём задачу wpall_daily_cleanup, которая запускается раз в сутки и удаляет просроченные транзиенты из базы.

3. Настройка внешнего cron для вызова WP-Cron

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

define('DISABLE_WP_CRON', true);

А затем добавьте в crontab сервера (через SSH команду crontab -e):

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

Здесь https://example.com замените на свой домен. Запуск каждые 15 минут — оптимальный вариант для большинства сайтов.

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

  • Установите плагин WP Crontrol и проверьте наличие вашей задачи и время следующего запуска.
  • Просмотрите логи сервера или плагина, чтобы убедиться, что задача срабатывает без ошибок.
  • Можно добавить временный код для отладки, например, запись в лог или файл при выполнении задачи:
function wpall_do_daily_cleanup() {
    global $wpdb;
    $wpdb->query( "DELETE FROM $wpdb->options WHERE option_name LIKE '_transient_timeout_%' AND option_value < UNIX_TIMESTAMP()" );
    error_log('Daily cleanup executed at ' . current_time('mysql'));
}

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

  • DISABLE_WP_CRON установлен в true: WP-Cron не работает. Проверьте wp-config.php.
  • Низкий трафик сайта: встроенный WP-Cron не запускается. Настройте системный cron.
  • Ошибки в коде задачи: проверьте логи PHP и исправьте синтаксис и логику.
  • Несоответствие расписания: используйте только предопределённые интервалы ('hourly', 'twicedaily', 'daily') или добавляйте свои через фильтр cron_schedules.
  • Несоблюдение безопасности: избегайте выполнения тяжелых задач в WP-Cron без ограничения времени и ресурсов.

Практические советы по оптимизации и безопасности WP-Cron

  • Минимизируйте нагрузку: разбейте тяжелые задачи на несколько мелких, чтобы не блокировать сайт.
  • Используйте системный cron: для стабильной работы и точного расписания лучше отключить встроенный WP-Cron и настроить вызов wp-cron.php через системный cron.
  • Добавляйте индивидуальные интервалы: если нужно, расширьте расписание через фильтр:
add_filter( 'cron_schedules', function( $schedules ) {
    $schedules['every_five_minutes'] = array(
        'interval' => 300,
        'display'  => 'Каждые 5 минут'
    );
    return $schedules;
} );
  • Используйте логирование и мониторинг выполнения задач, чтобы быстро выявлять сбои.
  • Ограничьте доступ к wp-cron.php через .htaccess или настройки сервера, если используете системный cron, чтобы исключить внешние вызовы.
WooCommerce: автоматическое изменение цены продукта при добавлении в корзину
15.05.2026
WooCommerce: автоматическое изменение цены продукта при добавлении в корзину
06.06.2026
WooCommerce: автоматическое удаление неоплаченных заказов по срокам
19.05.2026
Оптимизация базы данных WordPress: практические методы и примеры
11.11.2025
Как отключить Emoji в WordPress для ускорения сайта
02.02.2026