Skip to content

Всё для WordPress, веб-разработки — и не только

🔧 Как исправить ошибку «Публикация просрочена» в WordPress: 3 рабочих способа

🔧 Как исправить ошибку «Публикация просрочена» в WordPress: 3 рабочих способа

Вы ставите будильник на восемь утра, в понедельник у вас выходит важный пост. Вы подготовили его за выходные, прописали расписание в админке WordPress и легли спать спокойно. Вторник, вы открываете сайт, ничего. В админке напротив заголовка горит: «Публикация просрочена».

Знакомо? Только за последний год в русскоязычном сегменте форумов поддержки WordPress эту проблему обсуждали более трёхсот раз. И дело не в вашей админке, не в хостинге и не в плагинах, дело в архитектурной особенности самого WordPress.

Ниже, три способа закрыть вопрос раз и навсегда, от самого быстрого до самого надёжного. Без cron-заклинаний, без правки wp-config.php вслепую и без пледа «я просто буду публиковать вручную».

💡 Быстрый обзор:

  • Поставить Missed Schedule Post Publisher, автоматическая публикация просроченных постов, две минуты на установку
  • Заменить WP-Cron на серверный cron, радикальное решение, не зависит от посещаемости
  • Установить WP Crontrol для ручного контроля, показывает все cron-события, позволяет запустить любое вручную

Почему WordPress пропускает запланированные публикации

WordPress не использует настоящий системный cron. Вместо этого он полагается на механизм WP-Cron, псевдо-cron, который срабатывает не по таймеру сервера, а по факту захода посетителя на сайт.

Работает это так. Когда вы назначаете публикацию на 09:00, WordPress записывает задачу в базу данных. Но выполнить он её сможет, только если в районе 09:00 на сайт кто-то зайдёт. Зашёл посетитель, WordPress пробежался по списку задач и опубликовал пост. Не зашёл, задача повисает мёртвым грузом, а вы видите сообщение «Публикация просрочена».

Для сайтов с трафиком от 500-1000 посетителей в сутки WP-Cron работает приемлемо: кто-то почти наверняка кликнет в нужный момент. Но если у вас молодой блог, нишевый проект или вы публикуете посты ночью (по вашему часовому поясу), WP-Cron подводит регулярно. Добавьте сюда кеширующие плагины: WP Rocket, W3 Total Cache или Cloudflare могут отдавать закешированную страницу, вообще не дёргая WordPress, и cron-задачи не запускаются часами.

Именно поэтому ошибка «Публикация просрочена», системная, а не случайная. И лечится она не перепланированием поста вручную, а одним из трёх подходов ниже.

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

Работа над контентом сайта за ноутбуком

Способ 1: плагин Missed Schedule Post Publisher, простой и надёжный

Самый быстрый способ закрыть проблему, поставить специализированный плагин. Исторически для этого использовали WP Missed Schedule, но он удалён из каталога WordPress.org ещё в 2017 году, а версия с GitHub содержала бэкдор. Не вздумайте его ставить.

Актуальная замена, Missed Schedule Post Publisher. Плагин с одним-единственным назначением: проверяет, не зависла ли запланированная публикация, и выпускает её в момент обнаружения.

Чем он отличается от мёртвого предшественника:

  • Работает через WP-Cron и одновременно через заходы посетителей, если WP-Cron отключён хостингом, плагин переключается автоматически

  • Настраиваемый интервал проверки: 5, 10, 15, 20, 30 или 60 минут

  • Нулевое влияние на производительность, один лёгкий запрос к базе данных

  • Совместим с WP Rocket, W3 Total Cache и Cloudflare

  • Не создаёт «воронку» лишних событий cron, проверяет только пропущенные публикации

Установка, стандартная: Plugins → Add New → поиск «Missed Schedule Post Publisher» → Install → Activate. После активации зайдите в Settings → Missed Schedule Post Publisher и выберите интервал проверки. Для большинства сайтов 10-15 минут, оптимально.

Плагин не требует ручного контроля. Поставили, настроили интервал, и можете проверить результат через сутки: зайдите в Posts → All Posts и убедитесь, что метка «Публикация просрочена» исчезла. Дальше он работает сам, молча и безотказно.

Для сравнения: старый WP Missed Schedule (закрыт в каталоге WordPress.org с 2017 года, версия с GitHub содержала бэкдор) выглядел в админке вот так. Если вы вдруг видите этот плагин у себя в списке установленных, удалите немедленно и замените на Missed Schedule Post Publisher.

Устаревший плагин WP Missed Schedule в списке установленных плагинов WordPress

Способ 2: серверный cron вместо WP-Cron, радикальное решение

Способ глубже технически, но даёт стопроцентную надёжность: вы отключаете WP-Cron и вешаете вызов wp-cron.php на системный cron сервера.

Системный cron запускается по расписанию операционной системы, независимо от посещаемости сайта. Задали интервал в 5 минут, задача выполнится ровно через 5 минут, даже если на сайте ноль посетителей.

Что нужно сделать:

  • Откройте wp-config.php и добавьте строку до /* That's all, stop editing! */:
1define('DISABLE_WP_CRON', true);

Это запрещает WordPress запускать cron-задачи при заходе посетителей. Сами задачи никуда не исчезают, они остаются в базе и ждут вызова извне.

  • В панели хостинга найдите раздел «Cron-задачи» (cPanel → Cron Jobs, ISPmanager → Планировщик, или аналогичный). Создайте задачу с интервалом 5-10 минут и командой:
1wget -q -O - https://ваш-сайт.com/wp-cron.php?doing_wp_cron > /dev/null 2>&1

Если сервер поддерживает PHP CLI, альтернативный вариант, более быстрый и без нагрузки на веб-сервер:

1php /home/username/public_html/wp-cron.php
  • Сохраните задачу. Через 10 минут проверьте логи cron, если ошибок нет, система работает.

Бонус: отключение WP-Cron через DISABLE_WP_CRON убирает паразитную задержку при загрузке страниц для посетителей. WordPress больше не дёргает cron-задачи во время обычного просмотра, страницы открываются чуть быстрее.

Минус у этого способа один: доступ к настройкам cron есть не на всех хостингах. Дешёвый shared-хостинг иногда блокирует создание cron-задач. В этом случае возвращайтесь к способу 1, Missed Schedule Post Publisher спроектирован как раз под такие ограничения и работает без системного cron.

Способ 3: ручная проверка через WP Crontrol, полный контроль

Третий способ, для тех, кто хочет видеть всё, что происходит под капотом WordPress. WP Crontrol, это диспетчер cron-событий прямо в админке. Он не публикует посты сам, но показывает, какие задачи запланированы, когда они должны были сработать и что пошло не так.

Что даёт WP Crontrol:

  • Полный список всех событий cron с хуком, аргументами и временем следующего запуска

  • Возможность запустить любое событие вручную, немедленно, одним кликом

  • Редактирование и удаление событий cron

  • Добавление новых событий и пользовательских расписаний

  • Предупреждение, если система cron не работает (сервер не может подключиться сам к себе)

После установки зайдите в Tools → Cron Events. Вы увидите таблицу всех задач. Если публикация «зависла», найдите событие с хуком publish_future_post, нажмите «Run Now», и пост уйдёт в ленту через секунду.

WP Crontrol особенно полезен для отладки: вы видите, не создал ли какой-то плагин сотню лишних cron-событий (бывает), не забился ли очередь задач, нет ли конфликта между плагинами. Колонка «Next Run» показывает, когда событие должно сработать в следующий раз, если дата в прошлом, задача зависла. Колонка «Recurrence» подскажет, как часто событие повторяется, нестандартно частые повторы (каждую минуту) почти всегда указывают на проблемный плагин.

Но сам по себе WP Crontrol ошибку «Пропущенного расписания» не предотвращает, только помогает диагностировать и вручную закрыть последствия. После ручного запуска зависшей публикации пост выходит мгновенно, однако в следующий раз ситуация повторится, если не закрыть причину на уровне способа 1 или 2.

Панель управления cron-событиями WordPress в плагине WP Crontrol

Лучшая связка: способ 1 (плагин-автомат) + способ 3 (WP Crontrol для контроля). Автомат публикует пропущенное, а WP Crontrol позволяет одним взглядом убедиться, что очередь cron-задач чистая и всё работает штатно.

⁉️🤔 Частые вопросы

Почему WordPress не использует нормальный cron, как все нормальные системы?

Разработчики WordPress сознательно выбрали модель псевдо-cron, потому что она не требует настройки на стороне сервера. Пользователь ставит WordPress на любой хостинг, и планирование публикаций работает «из коробки» без SSH и правки конфигов. Ценой этого удобства стала ненадёжность на низкотрафиковых сайтах. WP-Cron запускается при каждом запросе к сайту, и если запросов нет в нужный момент, задача не выполняется. Это архитектурный компромисс, и для критичных по времени публикаций его недостаточно.

Какой способ выбрать, если я не разбираюсь в серверах?

Missed Schedule Post Publisher (способ 1). Установка, две минуты через админку, настройка, выбор интервала из выпадающего списка. Никакого кода, никакого SSH, никаких правок wp-config.php. Плагин сам определяет, включён ли WP-Cron на сервере, и подстраивается.

Может ли ошибка быть связана с часовым поясом WordPress?

Да, и проверьте это первым делом. Зайдите в Settings → General → Timezone и убедитесь, что выбран правильный городской часовой пояс, а не смещение UTC вручную. Смещение UTC+X не учитывает летнее/зимнее время, раз в полгода расписание «съезжает» на час, и посты публикуются не тогда, когда вы ждали.

Влияет ли кеширование на пропуск публикаций?

Напрямую, да. Плагины кеширования (WP Rocket, W3 Total Cache, WP Super Cache) и CDN (Cloudflare) могут отдавать посетителю готовую HTML-страницу, вообще не запуская PHP-ядро WordPress. Если WP-Cron не вызывается, задачи не выполняются. Missed Schedule Post Publisher (способ 1) обходит эту проблему, работая и через cron, и через заходы посетителей в обход кеша. Серверный cron (способ 2) не зависит от кеша в принципе.

Что делать, если хостинг заблокировал возможность создавать cron-задачи?

Используйте способ 1, Missed Schedule Post Publisher. Он проектировался именно для таких ситуаций: работает через встроенный WP-Cron, а если тот отключён, автоматически переключается на проверку при заходах посетителей. Вы не теряете функциональность, просто проверка происходит чуть реже (по факту визита, а не строго по таймеру).

Что ставить прямо сегодня

Проблема «Публикация просрочена» не лечится ручным перепланированием, это как подкрашивать трещину на трубе. Нужно либо поставить плагин-автомат (две минуты, и забыли), либо перейти на серверный cron (чуть дольше, и забыли навсегда).

Если у вас типовой блог или сайт компании на среднем хостинге, начните с Missed Schedule Post Publisher. Интервал 10 минут, пять кликов в админке, и вопрос закрыт. Хотите гарантий на уровне инфраструктуры, поднимите системный cron. Добавьте WP Crontrol для контроля, и о пропущенных публикациях можно будет вспоминать только в разговорах о том, «как оно было раньше».

Через сутки после установки зайдите в админку и проверьте ближайший запланированный пост. Если он вышел вовремя, система работает. Если нет, откройте WP Crontrol и посмотрите, не висит ли задача publish_future_post без выполнения, это укажет на более глубокую проблему с cron на сервере, которую решит способ 2.