Что такое 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); // Эта строка должна отсутствовать или быть false2. Регистрация собственной задачи
Добавим задачу, например, ежедневное удаление устаревших транзиентов:
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, чтобы исключить внешние вызовы.