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

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

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

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

Частые признаки проблем с WP-Cron:

  • Запланированные задачи не выполняются вовремя (например, отложенная публикация не срабатывает, автоматические очистки не происходят).
  • В журнале ошибок или отладке вы видите сообщения об ошибках cron-задач.
  • Сайт замедляется при частых визитах из-за постоянного запуска WP-Cron.

Чтобы проверить, работают ли cron-задачи, можно использовать плагин WP Crontrol или выполнить следующий код в файле темы (например, functions.php) для вывода запланированных задач:

add_action('admin_init', function() {
    if (current_user_can('manage_options')) {
        $crons = _get_cron_array();
        echo '<pre>';
        print_r($crons);
        echo '</pre>';
    }
});

Если массив пуст или задачи не появляются, значит WP-Cron не работает.

Настройка WP-Cron для надёжного и точного выполнения

Отключение стандартного запуска WP-Cron на каждый запрос

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

define('DISABLE_WP_CRON', true);

Настройка системного cron для запуска WP-Cron по расписанию

Вместо запуска на каждый запрос настроим системный cron (например, на сервере Linux) для вызова задачи раз в 5 минут:

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

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

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

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

Регистрация собственной задачи WP-Cron

Чтобы добавить пользовательскую задачу, нужно зарегистрировать событие и функцию-обработчик. Например, ежедневная очистка временных данных:

function clear_temporary_data() {
    global $wpdb;
    $wpdb->query("DELETE FROM {$wpdb->options} WHERE option_name LIKE '_transient_temp_%'");
}

add_action('clear_temp_hook', 'clear_temporary_data');

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

Такое решение гарантирует, что очистка будет выполняться раз в сутки.

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

1. Убедитесь, что в wp-config.php стоит define('DISABLE_WP_CRON', true);

2. Проверьте наличие записи в системном cron (команда crontab -l для текущего пользователя).

3. Запустите cron вручную (например, через терминал или браузер) по адресу https://example.com/wp-cron.php?doing_wp_cron, чтобы проверить выполнение.

4. Включите временный лог для вашей задачи, чтобы убедиться, что она срабатывает:

function clear_temporary_data() {
    global $wpdb;
    $wpdb->query("DELETE FROM {$wpdb->options} WHERE option_name LIKE '_transient_temp_%'");
    error_log('Temporary data cleared at ' . date('Y-m-d H:i:s'));
}

Проверьте логи сервера (например, error.log), чтобы увидеть записи.

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

  • Запланированная задача не создаётся: проверьте, что функция schedule_clear_temp вызывается — лучше использовать хук init вместо wp для раннего запуска.
  • Системный cron не срабатывает: убедитесь, что команда в crontab корректна и имеет права на выполнение; проверьте путь к wget или curl.
  • WP-Cron запускается при каждом запросе: проверьте, что DISABLE_WP_CRON определён и серверный cron настроен правильно.
  • Ошибки доступа при вызове wp-cron.php: убедитесь, что URL доступен, нет блокировок по IP или firewall.

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

  • Для вызова wp-cron.php используйте HTTPS — это защитит от перехвата и подделки запросов.
  • Ограничьте частоту запуска системного cron — 5 минут оптимальны на большинстве сайтов, реже для сайтов с низкой активностью.
  • Избегайте тяжелых задач в WP-Cron, лучше разбивайте их на мелкие части.
  • Регулярно очищайте устаревшие и неиспользуемые cron-задачи, чтобы избежать накопления мусора.

Сравнение способов запуска WP-Cron

МетодПлюсыМинусыРекомендуем для
Автозапуск на каждый запрос (по умолчанию)Простота настройки, нет необходимости в серверных правахНет гарантии точного времени, нагрузка при большом трафикеМаленькие сайты с низкой нагрузкой
Системный cron (Linux cron)Точное выполнение, меньше нагрузки сайтаТребует доступа к серверу и базовых навыков работы с crontabЛюбые сайты с доступом к серверу
Внешние сервисы (например, EasyCron)Не нужен доступ к серверу, удобный интерфейсЗависимость от стороннего сервиса, возможные ограниченияХостинги без доступа к cron
Как сделать автоматический импорт новостей в WordPress из RSS
09.01.2026
Как удалить старые медиа файлы в WordPress
11.02.2026
Как использовать WP-Cron для задач автоматизации в WordPress
05.06.2026
Как добавить автоматическое обновление плагинов в WordPress без помощи коммерческих пакетов
20.12.2025
Как использовать WordPress Transients для эффективного кэширования данных
07.02.2026