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.

Обновлено:

Все термины раздела «WordPress»

Что будем искать? Например,Продвижение