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

#46, 19 апреля, 2011 в 16:48
Подскажите что и где надо настроить на сервере чтобы работала отложенная публикация? Варианты с кроном и плагинами не подходят.
#47, 20 апреля, 2011 в 00:08
Константин, а почему не подходят варианты с кроном? Крон - это самый правильный вариант. Если Ваш хостер не даёт управлять кроном на хостинг-сервере, то всегда можно воспользоваться удалёнными сервисами (находятся гуглением по запросу типа "Web Based Cron") или попросить знакомого админа на своем сервере настроить обращение к скрипту Вашего блога в заданные моменты времени.
#48, 20 апреля, 2011 в 03:12
Alex, сайтов много - на всех настраивать крон - сложней чем изменить конфигурацию сервера. Сколько не искал по инету про fsockopen так и не понял как он настраивается.
#49, 20 апреля, 2011 в 11:46
Если проблема только в fsockopen, то нужно проверить 2 вещи.
1) Что соответствующий параметр в php.ini включен (по-моему, это allow_url_fopen, но на 100% не уверен).
2) Что конфигурация firewall-а хостинг-сервера разрешает исходящие соединения.
Если есть рутовый доступ, то проверять правильность настройки всего этого дела удобно tcpdump-ом.
#50, 20 апреля, 2011 в 14:36
Alex, allow_url_fopen = On, allow_url_include = Off, вроде так и должно быть? Сейчас посмотрел на старом хостинге в админке при входе вордпресс показывает новости и что-то там про плагины, а на новом сервере не показывает - видимо действительно дело в запрете на внешние запросы. Пока не знаю как поменять, но эта проблема немного в другом виде всплывает и на других серверах и cms, так что надо разобраться. Если подскажете куда копать буду очень признателен.
#51, 20 апреля, 2011 в 15:06
На новом хостинге нужно проверить настройки firewall-а. Если у Вас нет рутового доступа к серверу с сайтом, спросите об этом хостера (или того, у кого такой доступ есть).
#52, 20 апреля, 2011 в 15:11
Теперь сайт на сервере, iptables-save выдает:
# Generated by iptables-save v1.4.2 on Wed Apr 20 16:10:32 2011
*mangle
:PREROUTING ACCEPT [1615854:1421242626]
:INPUT ACCEPT [1615854:1421242626]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [1894869:2446249320]
:POSTROUTING ACCEPT [1894869:2446249320]
COMMIT
# Completed on Wed Apr 20 16:10:32 2011
# Generated by iptables-save v1.4.2 on Wed Apr 20 16:10:32 2011
*filter
:INPUT ACCEPT [1615854:1421242626]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [1894869:2446249320]
COMMIT
# Completed on Wed Apr 20 16:10:32 2011
#53, 20 апреля, 2011 в 15:17
Судя по :OUTPUT ACCEPT [1894869:2446249320] с firewall-ом всё нормально. Стоит еще проверить собран ли PHP с поддержкой сокетов.
#54, 20 апреля, 2011 в 15:50
phpinfo() показывает Sockets Support enabled... может проблема в отсутствии апача? На двух серверах где есть такая ошибка установлены только nginx, php-fpm и MySQL, где есть апач все работает нормально.
#55, 20 апреля, 2011 в 19:48
Тут уже сложно заочно что-то сказать. Надо смотреть своими глазами. Если хотите, можете дать мне доступ на сервер, я попробую разобраться. Контакты есть на моём сайте.
#56, 24 апреля, 2011 в 09:35
Вопрос с отложенной публикацией решился доустановкой php-pear
#57, 29 апреля, 2011 в 19:20
У меня проблема - бэкапы не то, что не отсылаются на e-mail, но и не сжимаются и не скачиваются. Но на сервере сохраняются в несжатом виде. В чем проблема может быть, подскажите, пожалуйста, облазил все форумы, ничего путного не нашел.
Искал у себя в файле wp-cron.php строчку которую вы написали, не нашел почему то...
#58, 2 августа, 2011 в 12:54
а у меня нету такого в кроне