DevOps 8 мин чтения

WordPress Cron Job / WP-Cron

Как работает WP-Cron, его проблемы и как заменить на реальный системный Cron. Автоматические задачи в WordPress без костылей.

WP-Cron — встроенная система планировщика задач WordPress. Но у неё есть фундаментальная проблема: она работает только когда кто-то посещает сайт.

Как работает WP-Cron

WP-Cron — это не настоящий cron. Это псевдо-планировщик:

  1. Посетитель открывает любую страницу сайта
  2. WordPress проверяет: есть ли запланированные задачи?
  3. Если да — выполняет их прямо в этом HTTP-запросе
  4. Если нет посетителей — задачи не выполняются

Это создаёт проблемы:

  • На ночи/выходные без трафика — задачи не запускаются
  • При большом трафике — задачи замедляют загрузку страниц
  • Точность расписания зависит от трафика

Правильное решение: системный Cron

Отключите WP-Cron и замените реальным системным cron-om.

Шаг 1: Отключить WP-Cron в wp-config.php

// wp-config.php
define('DISABLE_WP_CRON', true);

Шаг 2: Добавить системный cron

# В crontab (crontab -e)
*/5 * * * * wget -q -O - https://yoursite.com/wp-cron.php?doing_wp_cron > /dev/null 2>&1

Или через curl:

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

Шаг 3: Для VPS/VDS с WP-CLI

*/5 * * * * cd /var/www/html && wp cron event run --due-now > /dev/null 2>&1

Создание кастомных задач WP-Cron

// Регистрация расписания
add_filter('cron_schedules', function($schedules) {
    $schedules['every_15_minutes'] = [
        'interval' => 900,
        'display'  => 'Every 15 Minutes'
    ];
    return $schedules;
});

// Планирование задачи
if (!wp_next_scheduled('my_custom_hook')) {
    wp_schedule_event(time(), 'every_15_minutes', 'my_custom_hook');
}

// Функция задачи
add_action('my_custom_hook', function() {
    // Ваша логика
    error_log('Cron job executed at ' . current_time('mysql'));
});

Полезные плагины для работы с WP-Cron

  • WP Crontrol — визуальный интерфейс для управления задачами
  • Advanced Cron Manager — подробные логи и управление
  • Action Scheduler — надёжная очередь задач (используется WooCommerce)

Мониторинг задач

// Просмотр всех запланированных задач
$crons = _get_cron_array();
foreach ($crons as $timestamp => $hooks) {
    foreach ($hooks as $hook => $events) {
        echo $hook . ' → ' . date('Y-m-d H:i:s', $timestamp) . "\n";
    }
}

Через WP-CLI:

wp cron event list
wp cron event run my_custom_hook

Docker + WP-Cron

В Docker Compose добавьте отдельный контейнер для cron:

cron:
  image: wordpress:php8.2-cli
  command: >
    sh -c "while true; do
      wp --allow-root cron event run --due-now --path=/var/www/html;
      sleep 300;
    done"
  volumes:
    - ./wordpress:/var/www/html