WP-Cron
Коротко
Встроенный планировщик WordPress, который выполняет отложенные и периодические задачи не по системным часам, а при обращениях посетителей к сайту.
Что такое «WP-Cron»
На обычном хостинге у сайта может не быть доступа к системному cron, поэтому WordPress сделал свой механизм. Список задач с временем запуска хранится в базе, в настройке cron. При каждом открытии страницы WordPress проверяет, не наступило ли время какой-то из них. Если наступило, он отправляет фоновый запрос самому себе на wp-cron.php и выполняет задачи там, не задерживая посетителя.
Через планировщик идут выход запланированных публикаций, проверка обновлений, очистка корзины и просроченных транзиентов, а также задачи плагинов: рассылки, синхронизация с 1С, резервные копии.
Пример: своя периодическая задача
register_activation_hook( __FILE__, function () {
if ( ! wp_next_scheduled( 'myshop_sync_stock' ) ) {
wp_schedule_event( time(), 'hourly', 'myshop_sync_stock' );
}
} );
register_deactivation_hook( __FILE__, function () {
wp_clear_scheduled_hook( 'myshop_sync_stock' );
} );
add_action( 'myshop_sync_stock', 'myshop_sync_stock_run' );
Встроенные интервалы — hourly, twicedaily, daily и weekly, свои добавляют фильтром cron_schedules. Проверка wp_next_scheduled() нужна, чтобы задача не дублировалась.
Слабые места
- Нет посетителей — нет запуска. На тихом сайте запись, назначенная на 9:00, выйдет, когда кто-то зайдёт, а в админке появится пометка о пропущенном расписании.
- Фоновый запрос к самому себе блокируют HTTP-авторизация на тестовом сайте, защитные плагины и неверный DNS на сервере.
- Тяжёлые задачи на посещаемом сайте запускаются в случайные моменты и нагружают сервер вместе с наплывом посетителей.
Как перевести на системный cron
В wp-config.php добавляют define( 'DISABLE_WP_CRON', true );, а в crontab сервера — запуск через WP-CLI:
*/5 * * * * wp cron event run --due-now --path=/var/www/site/www >/dev/null 2>&1
На своём сайте я сделал именно так: задачи выполняются каждые пять минут независимо от посещаемости. Посмотреть очередь можно командой wp cron event list или плагином WP Crontrol.

