Отложенная публикация и wp-cron.php
Собираясь уехать на недельку отдохнуть, я решил опробовать такую функцию WordPress, как отложенная публикация записи. Написал несколько статей, распределил даты публикации на неделю вперед и попробовал испытать эту возможность блога на одной из статей. Однако WordPress отказался публиковать статью в назначенное время, а счетчик минут, оставшихся до публикации стал почему-то увеличиваться. Воспользовавшись поиском, я узнал, что такая проблема возникает у многих блогеров, а путей ее решения никто не знает. После долгих изысканий на англоязычных форумах я узнал почему WordPress не хочет публиковать статьи в заданное время и нашел способ как это исправить.
Любые действия, которые регулярно повторяются WordPress выполняет через использование псевдо-крона в wp-cron.php, однако существует вероятность того, что у вашего хостера неправильно настроен сервер для работы этого файла. В частности, в настройках сервера должно быть прописано разрешение для функции fsockopen использовать локальные адреса. Если же на локальные адреса прописан запрет скрипт в файле wp-cron.php выполняться не будет. Можно, конечно, попросить хостера изменить настройки сервера, но большинство хостеров вам в этом откажет. Поэтому используем обходной путь. Открываем на редактирование файл wp-cron.php и комментируем (добавляя в начало символ #) строчки:
23 24 | if ( $_GET['check'] != wp_hash('187425') ) exit; |
Теперь, если вы откроете ссылку вида http://www.myblog.ru/wp-cron.php скрипт в этом файле выполнится и все ваши просроченные публикации немедленно будут опубликованы. Конечно, ручное дергание файла wp-cron.php нам ни в коем случае не подходит, а поэтому настраиваем выполнение данного скрипта через демон cron. Его настройка осуществляется разными путями у различных хостеров, читайте документацию по хостингу. В моем случае мне помогла такая команда:
0 * * * * /usr/local/bin/php5 -q http://www.wordpressplugins.ru/wp-cron.php
То есть cron будет выполнять скрипт в wp-cron.php каждый час. Точное время публикации записи соблюдено не будет, но опоздание с публикацией в течение часа по сути не так уж и страшно, главное, что сама отложенная публикация будет работать. Попутно решилась проблема с плагином WordPress Database Backup, который именно по этой причине не хотел отправлять мне бекапы на имейл раз в неделю.
Что делать, если ваш хостинг не предоставляет возможности использовать демон cron? Есть такой сервис как - это именно то, что вам нужно. Он сможет регулярно выполнять ваш скрипт в .php файле, просто скормите ему ссылку файла скрипта и укажите, как часто его выполнять.
PS. Данная статья запланирована на публикацию в 3:50 ночи 3 августа, следовательно опубликована она будет в 4 часа утра 3 августа.
Рекомендую также:

#31, 27 октября, 2009 в 17:00
вот проблема была решена..нетривиально!
#32, 20 ноября, 2009 в 22:36
Здравствуйте, а не подскажете что делать с последними версиями wp, например WordPress 2.8.6, там указанного вами кода в cron.php вообще нет. Помогите пожалуйста.
#33, 29 ноября, 2009 в 02:15
честно говоря я не знаю. попробуйте удалить строчки
а после этого дергайте файл вручную.
#34, 6 декабря, 2009 в 14:49
Здравствуйте.
Такая же проблема... Wordpress 2.8.6 - указанного вами кода нет.
Если дергаешь файл вручную - все сразу публикуется. Но тогда какой в этом смысл.. Неужели никак нельзя наладить автоматическое выполнение скрипта?
На хостинге стоит Direct Admin, там есть планировщик Cron, ввожу прямой адрес задания
но всё равно скрипт почему-то не выполняется..
Может нужно вводить какой-то другой путь к файлу крона?
Спасибо.
#35, 7 декабря, 2009 в 06:56
полагаю у вас должна быть внутренняя ссылка, а не внешняя. а если и это не поможет, то воспользуйтесь службами веб-крона, тут в комментариях достаточно ссылок.
#36, 4 апреля, 2010 в 23:59
тут я описал детально все оп пунктам весь процесс настройки крона вручную и через DirectAdmin
#37, 28 мая, 2010 в 13:23
Flector,СПАСИБО! Без твоего комента еще бы долго лазил, все делал, но посты не публиковались в нужное время( Пока не установил в общих настройках временную зону с учетом перехода времени и все стало публиковаться! Спасибо!