WP-Cron — встроенная система планировщика задач WordPress. Но у неё есть фундаментальная проблема: она работает только когда кто-то посещает сайт.
Как работает WP-Cron
WP-Cron — это не настоящий cron. Это псевдо-планировщик:
- Посетитель открывает любую страницу сайта
- WordPress проверяет: есть ли запланированные задачи?
- Если да — выполняет их прямо в этом HTTP-запросе
- Если нет посетителей — задачи не выполняются
Это создаёт проблемы:
- На ночи/выходные без трафика — задачи не запускаются
- При большом трафике — задачи замедляют загрузку страниц
- Точность расписания зависит от трафика
Правильное решение: системный 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