Стоит ли отключить WP_CRON и запускать wp-cron.php с сервера?
Похоже, что WordPress без необходимости запускает WP CRON при каждой загрузке страницы. Я думаю, вместо того чтобы запускать его при каждом посещении, почему бы не настроить его запуск каждые 5 минут через сервер? Я мог бы просто вызывать wp-cron.php каждые пять минут и достичь желаемого результата?
Есть ли какие-либо недостатки у такого подхода?
Нет никаких недостатков в использовании серверных cron-заданий для запуска WP CRON. Напротив, это рекомендуемая практика.
Согласно официальной документации по разработке плагинов WordPress:
WP-Cron не работает непрерывно, что может стать проблемой, если есть критические задачи, которые должны выполняться вовремя. Решение простое: настройте планировщик задач вашей системы на выполнение с нужными интервалами (или в конкретное необходимое время).
Для этого сначала отключите стандартное поведение cron в файле wp-config.php
:
define('DISABLE_WP_CRON', true);
Затем запланируйте запуск wp-cron.php
на вашем сервере. В Linux это делается так:
crontab -e
Однако вместо запуска через командную строку (CLI) выполните его как HTTP-запрос. Для этого можно использовать wget
:
*/5 * * * * wget -q -O - https://ваш-домен.com/wp-cron.php?doing_wp_cron
WordPress загружает все необходимые основные файлы, плагины и т.д. в wp-cron.php
с помощью следующего кода:
if ( !defined('ABSPATH') ) {
/** Настройка окружения WordPress */
require_once( dirname( __FILE__ ) . '/wp-load.php' );
}
Так что не беспокойтесь о том, что WordPress не загрузит важные функции.

В документации WordPress.org, на которую вы ссылаетесь, упоминается wget http://ВАШ_САЙТ_URL/wp-cron.php
без добавления ?doing_wp_cron
. Так какой вариант лучше? Что делает добавление ?doing_wp_cron
, чего нет в версии без этого параметра?

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

Я совершенно не согласен с этим. Во-первых, это не соответствует действительности, что этот метод "рекомендуется". Во-вторых, этот метод нарушит работу любых плагинов, которые используют фактически рекомендуемый метод планирования событий. Я считаю, что это очень плохой совет. Почти никто не должен отключать крон, если у вас нет ОЧЕНЬ специфической причины для этого. Единственная причина, которую я могу придумать - это если вы разбиваете WordPress для CDN или что-то подобное. Это НЕ обычная практика.

@JohnDee: этот метод не отключает cron полностью, он отключает только метод WP Cron, который проверяет и пытается запускать задачи при каждой загрузке страницы. define('DISABLE_WP_CRON', true);
отключает только эту часть процесса cron, а затем вызов cron-скрипта с помощью кода типа */5 * * * * wget -q -O - https://your-domain.com/wp-cron.php?doing_wp_cron
на сервере гарантирует выполнение cron-задач. Любой плагин планирования даже не заметит разницы.

Ссылка на документацию WordPress.org по этой теме изменилась на https://developer.wordpress.org/plugins/cron/hooking-wp-cron-into-the-system-task-scheduler/

Есть несколько недостатков: Во-первых, при использовании wp-cron.php через CLI переменные, такие как $_SERVER, не устанавливаются. Эту проблему можно обойти, отправляя curl-запрос к wp-cron.php вместо прямого вызова.
Во-вторых, поскольку WordPress не загружается полностью при вызове wp-cron.php, плагины SMTP-рассылки не будут загружены при выполнении крона. Опять же, curl-запрос решает эту проблему. Использование curl — наиболее распространённый метод.
Однако я предпочитаю использовать wp-cli после правильной настройки почты в Postfix и конфигурации php-fpm (для nginx), а также установки задачи в crontab, например:
*/5 * * * * wp cron event list --skip-plugins --skip-themes --path="/var/www/vhosts/example.com/httpdocs/wp" --fields=hook,next_run_relative --format=csv | awk -F, '$2=="now" {print $1}' | xargs -r wp --path="/var/www/vhosts/example.com/httpdocs/wp" cron event run $1
(Список всех крон-задач в CSV-формате с указанными полями — hook (название задачи) и next_run_relative (время следующего запуска). С помощью AWK выбираем задачи, у которых next_run_relative равен 'now' (те, которые должны выполниться сейчас), и передаём этот список в xargs для выполнения команды wp cron event run $HOOK
для каждой задачи.)
Использование wp-cli обеспечивает корректную загрузку WordPress (я пропускаю загрузку плагинов при выводе списка задач, так как ошибки и предупреждения PHP могут нарушить формат вывода, но не пропускаю их при выполнении задач через xargs, потому что крон может зависеть от этих плагинов).
Надеюсь, это поможет вам разобраться в возможных подводных камнях.

Как насчет настройки: /15 * * * wget -q -O - http://yourdomain.com/wp-cron.php?doing_wp_cron, как предложил TomMcFarlin - https://tommcfarlin.com/wordpress-cron-jobs/. Кажется, работает хорошо. Был бы признателен за ваш комментарий.

Да, как я уже упоминал, люди выбирают использование curl (wget или любого другого http-вызова) для запуска крон-заданий, и в этом методе нет ничего плохого. Я просто предупреждал о проблемах прямого вызова wp-cron php файла, который не включает необходимые файлы, и предлагал альтернативный метод, если хотите немного разнообразия.

Я до сих пор не нашел реальных недостатков в переносе wp-cron на внешний сервис. Занимаюсь этим уже много лет.
Особенно в современном мире, где приложения можно запускать как микросервисы.
Я использую отдельные Docker-контейнеры для каждого компонента WordPress - php, веб-сервер, база данных, crontab, redis и так далее). Crontab работает как отдельный контейнер, вызывая wp-cron через HTTP в локальной сети и запускаясь только тогда, когда это необходимо.
Это снижает нагрузку на бэкенд-узлы и повышает безопасность за счет уменьшения поверхности атаки.
Если разработчик не может разобраться, как сделать что-то без вызова wp-cron при каждой загрузке страницы, это говорит лишь о его неопытности. "Оставить как есть" только потому, что вы не понимаете, как это работает - плохая причина ничего не менять.

Существует множество причин не отключать wp-cron. Фактически, практически невозможно найти реальный сценарий, где это действительно необходимо. Он не замедляет работу вашего сайта и используется для множества процессов, о которых вы можете даже не подозревать.
Многие плагины используют WP-Cron для планирования задач. Они могут начать работать некорректно, если вы отключите планировщик.
В интернете распространено множество руководств на эту тему, потому что она действительно запутанная, а также потому что отключение wp-cron не оказывает немедленного заметного эффекта на сайт. Однако через полгода это может вызвать головную боль у разработчика, которому придётся разбираться с загадочными проблемами.
Кроме того, WP Heartbeat срабатывает каждые 15 секунд в административной части сайта, решая эту проблему для 99% пользователей, которые думают, что она у них есть.

Это ужасный ответ - они -НЕ- отключают WP Cron. Они просто отключают вызов WP Cron при загрузке страницы и переносят его на системный демон cron. Боже.

В любом случае, главная причина оставить всё как есть - многие плагины теперь используют cron для выполнения фоновых задач. Вы можете нарушить работу чего-то, что делает СЛЕДУЮЩИЙ человек, потому что он ожидает, что система будет работать стандартным образом. Удачи!

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

Что ж, эти два комментария подтверждают мою точку зрения. Один разработчик говорит: "это не отключает cron, а лишь переносит его на cron операционной системы" — что является нарушением работы WordPress, который должен быть независим от ОС. Другой разработчик заявляет: "это ответственность разработчика плагина предусмотреть уничтожение wp cron". Серьёзно? То есть, если вам нужна функциональность cron, вы должны ПЛАНИРОВАТЬ устранение системы cron? Какую тогда? Резервную систему cron? Этот комментарий не имеет смысла [очевидно].
