Отложенная публикация и 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 августа.
Рекомендую также:

#1, 3 августа, 2008 в 18:42
альтернативный русский cron сервис
#2, 28 августа, 2008 в 00:08
Вопрос не по сабжу.
А что за плагин, который позволяет подписаться на комментарии БЕЗ отправки сперва оного?
#3, 28 августа, 2008 в 00:08
Иными словами, я о поле "Подписаться на уведомления без комментирования." :-)
#4, 28 августа, 2008 в 00:18
самый обычный Subscribe To Comments 2.1.2 - там есть возможность такой подписки.
#5, 30 августа, 2008 в 18:09
кто-нибудь пользовался? Отпишитесь как она работает. Я попробовал подключиться, там дают всего две недели на cron, потом надо снова заходить и продлевать. Есть смысл пользоваться этой службой или все таки лучше WebCron.org
#6, 30 августа, 2008 в 18:25
пользуюсь ей почти месяц, никаких нареканий - работает как часы.
#7, 8 сентября, 2008 в 02:45
Пользуюсь WebCron.org уже больше года, 4 движка с него пашут стабильно, хороший сервис. Первый и последний раз было там когда настраивало.
#8, 8 сентября, 2008 в 03:33
Если я желаю подготовить много статей, скажем, на месяц вперед, для публикации по несколько в день, не закинет ли принудительный крон с WebCron.org все запланированные статьи сразу в первый же заход? Или же надо будет теперь сидеть у кнопки с тем удаленным кроном и регулировать процесс каждые два - три часа?
пы.сы. Хостинг мой изначально идет без крона, я на серваке + еще 99 чел, так что вряд ли провайдер согласится что либо менять там.
#9, 8 сентября, 2008 в 03:40
он будет их закидывать только если текущая дата больше, чем запланированная дата публикации.
если распределить 30 записей на 30 дней - то публиковаться они будут по одной записи в день.
#10, 10 сентября, 2008 в 17:52
спасибо, проверено, работает)
#11, 21 сентября, 2008 в 14:21
Автору спасибо за подсказку, долго не мог понять почему не публикуются запланированые посты.
От себя добавлю, что после того как вы закомментируете строки
стоит переименовать ваш wp-cron.php во что-нибудь не столь очевидное (например 12821232_hidden_cr.php), т.к. комментирование этих двух строк позволяет любому желающему дергать ваш крон скрипт загружая ваш сервак бестолковыми запросами, что может совсем не понравится вашему хостеру.
и еще, некоторые хостинг провайдеры не разрешают вносить в крон вызов внешних файлов, тогда путь к скрипту пишите локальный и не забудте перед скрипом указать путь к php интерпретатору, например на хостинге от агавы запись в кроне будет выглядеть так:
#12, 25 сентября, 2008 в 12:59
Хостер Завахост наотрез отказался дать нужную информацию для програмирования крона...
в строке команда изначально появляется "/home/название_аккаунта/" - больше ничего не известно. Предположу, что туда надо ввести "/home/название_аккаунта/domains/адрес/public_html/cron.php"
Помогите настроить плз...
#13, 26 сентября, 2008 в 18:49
а он вообще крон то предоставляет? многие хостеры не дают крон для пользователей. воспользуйтесь вебкроном, кроме того, что нельзя дергать файл чаще чем раз в час он ничем обычному крону не уступает.
#14, 27 сентября, 2008 в 17:36
крон они мне дали, а я всё-таки смог его настроить (хостер сказал, что, судя по логам, крон дёргает файл), но просроченная сататья так и не публиковалась. Значит проблема в самом файле... но как её исправить?
Здесь ( ) не знают...
#15, 27 сентября, 2008 в 18:09
так строчки то нужные в wp-cron.php вы закомментировали?
#16, 27 сентября, 2008 в 20:06
Насколько я понял, заковычивать те строки нужно лишь если нет поддржки запуска локального файла. А раз крон всё-таки пытается запустить его - значит такая поддржка у меня есть? Может ему какие-нибудь права на запуск нужны? или я что-то не так понял?
#17, 27 сентября, 2008 в 20:44
если бы у вас все было хорошо с запуском локального файла - вы бы не искали эту тему, WordPress сам бы публиковал посты и вы про крон и не знали бы ничего.
а раз уж вам пришлось настраивать крон для запуска wp-cron.php - закомментируйте нужные строчки, иначе wp-cron.php не будет выполняться.
ps никакие права не нужны, просто закомментируйте строчки.
#18, 27 сентября, 2008 в 22:51
а локальный адрес (который сейчас прописан в cron'е) оставить или придётся писать внешний?
#19, 2 октября, 2008 в 14:12
ап
#20, 2 октября, 2008 в 18:37
ну так попробуйте сначала один вариант, затем другой и посмотрите, что будет работать в вашем случае.
#21, 2 октября, 2008 в 21:43
так и хотел сделать, но, думал, может Вы знаете...
#22, 3 октября, 2008 в 14:01
что означают "-q" "-f" в команде крона?
#23, 29 октября, 2008 в 20:50
А если все нормально постило, а после того как было переведено время на час назад. (т.е. я ничего не переводил, а переход на зимнее время) перестали публиковаться запланированные записи.
т.е. наступает время для публикации поста и он не публикуется а пишет 1 минута до публикации, потом 2 минуты до публикации и тд.
Может есть другой способ решить эту проблему или только этот?
#24, 2 марта, 2009 в 16:11
а куда написать запланированные записи? в черновик? подскажите пожалуйста
#25, 30 июня, 2009 в 00:09
Подскажите а как вообще отключить wp-cron.php
Чтоб вордпресс его вообще не запускал?
#26, 18 июля, 2009 в 22:35
Идеологически более правильным было бы не комментировать упомянутые строки, а вызывать скрипт wp-cron.php c параметром check. Значение параметра легко определить, временно добавив перед строкой
что-то типа
Тогда, набрав в адресной строке броузера , можно увидеть значение хеша (46cbe1674da1d2888104482d6ed4f87f). Следовательно, из крона обращаться к . Естественно, для предотвращения DoS-атак лучше заменить стандартную последовательность 187425 на что-то другое.
#27, 23 августа, 2009 в 01:45
так как webcron.org стал платным советую использовать сервис - вроде не хуже. правда, надо держать пустой текстовой файл на сервере с определенным именем - они так страхуются.
#28, 25 октября, 2009 в 14:32
а есть ли нормальное, человеческое решение- при том, что проблема случилась при переходе на зимнее время.. в смысле отредактировать как-то файл, или что-то на сервере поменять?
#29, 26 октября, 2009 в 12:57
а что такое "человеческое" решение? установите в общих настройках временную зону с учетом перехода времени и все у вас должно будет работать правильно.
#30, 27 октября, 2009 в 10:48
так не работает.. уже и обновил на 2.8.5 версию..и ерунда.. ничего нет. причем на локалке там список городов в настройках выходит, на сервере нет.
при этом на сервере стоят другие вордпрессы- там все нормально с отложенной публикацией..
один только сайт, который переносился в момент смены времени, поимел такие проблемы..
#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,СПАСИБО! Без твоего комента еще бы долго лазил, все делал, но посты не публиковались в нужное время( Пока не установил в общих настройках временную зону с учетом перехода времени и все стало публиковаться! Спасибо!
#38, 3 сентября, 2010 в 00:03
то есть можно будет любому в сети интернет запускать wp-cron?..