Как использовать WP-Cron для отложенных задач в WordPress без плагинов

Что такое WP-Cron и зачем он нужен для отложенных задач

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

Основные проблемы при работе с WP-Cron

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

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

Чтобы понять, работает ли WP-Cron корректно, выполните следующие шаги:

  • Проверка наличия запланированных задач: используйте функцию wp_get_scheduled_event() или плагин Debug Bar Cron (только для проверки). Например, можно вывести список задач в теме:
add_action('admin_notices', function() {
    $crons = _get_cron_array();
    echo '<pre>';
    print_r($crons);
    echo '</pre>';
});
  • Проверка запуска wp-cron.php: зайдите в браузере на https://ваш-сайт.ru/wp-cron.php?doing_wp_cron. Если на экране нет ошибок, значит скрипт доступен.
  • Логи ошибок: проверьте логи сервера на предмет ошибок при выполнении wp-cron.php или PHP ошибок, связанных с запланированными задачами.

Пошаговое решение для надёжного запуска отложенных задач через WP-Cron без плагинов

1. Отключение стандартного запуска WP-Cron при каждом визите

Добавьте в wp-config.php строку:

define('DISABLE_WP_CRON', true);

Это позволит контролировать запуск cron самостоятельно, снижая нагрузку.

2. Настройка системного cron для вызова wp-cron.php

Настройте системный cron на сервере для регулярного запуска скрипта:

*/15 * * * * wget -q -O - https://ваш-сайт.ru/wp-cron.php?doing_wp_cron >/dev/null 2>&1

Или с помощью curl:

*/15 * * * * curl -s https://ваш-сайт.ru/wp-cron.php?doing_wp_cron >/dev/null 2>&1

Рекомендуемый интервал — 15 минут, можно уменьшать до 5 при необходимости.

3. Создание собственной отложенной задачи

Добавьте в functions.php или в плагин следующий код для регистрации и обработки задачи:

function wpnews_schedule_custom_task() {
    if (!wp_next_scheduled('wpnews_custom_task_hook')) {
        wp_schedule_event(time(), 'hourly', 'wpnews_custom_task_hook');
    }
}
add_action('wp', 'wpnews_schedule_custom_task');

function wpnews_custom_task_function() {
    // Ваш код, выполняемый по расписанию
    error_log('WPNews: Custom cron task executed at ' . date('Y-m-d H:i:s'));
}
add_action('wpnews_custom_task_hook', 'wpnews_custom_task_function');

Здесь задача запускается каждый час, можно заменить 'hourly' на 'twicedaily' или 'daily'. Для кастомных интервалов регистрируйте их через фильтр cron_schedules.

4. Добавление кастомного интервала (если нужно)

add_filter('cron_schedules', function($schedules) {
    $schedules['every_five_minutes'] = [
        'interval' => 300,
        'display' => __('Каждые 5 минут')
    ];
    return $schedules;
});

Вызовите в wp_schedule_event вместо 'hourly' — 'every_five_minutes'.

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

  • Проверьте логи PHP или error_log на наличие записей выполнения задачи (например, через error_log из примера выше).
  • Запустите вручную системный cron или вызовите wp-cron.php из браузера и убедитесь, что задача срабатывает.
  • Используйте WP-CLI команду wp cron event list для просмотра запланированных событий (если есть доступ к консоли).

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

  • Опечатки в хуках или несогласованность имён: Убедитесь, что хук в add_action совпадает с тем, что используется в wp_schedule_event.
  • Не отключен стандартный WP-Cron при использовании системного cron: Это ведёт к двойным вызовам и повышенной нагрузке. Проверьте, что DISABLE_WP_CRON действительно true.
  • Неправильный URL в системном cron: Протокол (http/https) и путь к wp-cron.php должны быть корректны и доступны без авторизации.
  • Отсутствие прав на выполнение системного cron: Убедитесь, что cron задаётся от имени пользователя с необходимыми правами.

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

  • Минимизируйте количество cron-задач: Удаляйте ненужные задачи с помощью wp_clear_scheduled_hook('hook_name').
  • Используйте системный cron вместо стандартного WP-Cron на живых сайтах с высоким трафиком.
  • Защитите вызов wp-cron.php: Добавьте проверку nonce или IP в начале скрипта, если используете нестандартные вызовы.
  • Логируйте ошибки и результаты выполнения задач, чтобы быстро обнаруживать сбои.

Сравнение вариантов запуска отложенных задач в WordPress

ВариантПлюсыМинусыКогда использовать
Стандартный WP-Cron (по посещениям)Простота настройки, нет доступа к серверуНе гарантирует своевременный запуск, нагрузка при большом трафикеМаленькие сайты с постоянным трафиком
Системный cron + отключение WP-CronНадёжный и своевременный запуск, меньше нагрузкиТребуется доступ к серверу и навыки настройкиСредние и крупные сайты, требующие точного расписания
Плагины-менеджеры cronУдобный интерфейс для управления задачамиДополнительная нагрузка и возможные конфликтыЕсли нет доступа к серверу, но нужна удобная настройка
Как создать собственный виджет WordPress: подробное руководство
25.11.2025
Как использовать REST API в WordPress для создания настраиваемых приложений
08.11.2025
Как использовать WordPress Hooks для защиты от спама
26.02.2026
Как создать динамические таблицы в WordPress с помощью шорткодов
05.01.2026
Как автоматизировать создание и публикацию новостей в WordPress
26.03.2026