Не работает отложенная публикация в wordpress

Всем привет. Хотя я работаю с wordpress довольно давно, никогда не использовал функцию отложенной публикации (просто не было нужды в этом). Вчера у меня возникла такая потребность. Поэтому, в этом посте я хочу коротко описать проблемы, которые появились у меня при использовании отложенной публикации, а также пути их решения.

Описание проблемы

Если коротко, то отложенная публикация из коробки у меня попросту не заработала. Я часто раньше видел вопросы пользователей о том, что у них не работает данная функция. Поэтому, я решил сам не исследовать проблему, а сразу посмотреть, как другие люди решают этот вопрос.

Причины проблемы

Очевидно, что корень проблемы кроется в настройках хостинга. По умолчанию многие хостинг-провайдеры блокируют возможность создания Socket-соединения. С другой стороны, wordpress для отложенных действий не использует стандартный CRON (который идёт вместе с *UNIX), а создаёт свой виртуальный крон wp-cron.php.

Как работает wp-cron.php? Довольно просто. Когда кто-то запрашивает некоторую страницу сайта (не важно: страницу админки или страницу основного сайта), wordpress в том числе активизирует и файл wp-cron.php. Код, описанный в этом файле, проверяет: есть ли новые задачи. Если новые задачи есть, они выполняются.

Так в чём же проблема? WordPress должен активизировать файл wp-cron.php с помощью создания Socket-соединения. Соответственно, если хостинг-провайдер запретил выполнение этой функции, то и отложенная публикация работать не будет.

Решение проблемы отложенной публикации

Существует несколько решений данной проблемы. Самый очевидный из них — это изменение настроек вашего сервера. Вы должны сделать так, чтобы из php работали локальные Socket-вызовы. Возможно, нужно изменить конфиги. Возможно, у вас даже не подключен Socket-модуль.

К сожалению, далеко не всегда мы имеем возможность изменять окружение сайта. Поэтому, нужны другие решения. Первое из них я назвал бы грязным. Оно состоит из нескольких шагов:

  1. Изменение файла wp-cron.php (никогда не делайте так!!!). Вы должны убрать все проверки, которые блокируют прямой вызов файла а-ля http://hixon.ru/wp-cron.php. От версии к версии файл wp-cron.php может меняться, но, скорей всего, вам нужно будет убрать проверку на POST-запрос, а также на размер запроса.
  2. Дёргать URL вида http://hixon.ru/wp-cron.php тогда, когда вам нужно выполнение некоторых отложенных действий. То есть, если вы сделали отложенную публикацию на 23.06.2014 15-00, то нужно, например, дёрнуть этот URL в 23.06.2014 15-01. Как это сделать? Есть много способов, один из них описан тут — http://hixon.ru/programmirovanie-2/medlennaya-zagruzka-pervoj-stranicy-sajta-na-asp-net-mvc.html

Второй способ заключается в использовании какого-нибудь плагина, который чинит внутренний CRON wordpress. Лично мне понравился плагин WP Missed Schedule Fix Failed Future Posts. Важно, что из-за особенностей реализации плагина, он принесет на сайт дополнительную нагрузку. Поэтому, если вы каждый день не используете отложенную публикацию, то стоит выключить плагин.

Категории: wordpress