MAX Autopost 1.12.0: очередь переживает обновление, отправка одного поста и WP-CLI

Обложка: MAX Autopost 1.12.0, обновление не выключает автоворкер, отправка одного поста и команды WP-CLI

4 октября 2026 я выложил MAX Autopost 1.12.0. Это релиз про очередь, а не про картинки и кнопки. Обновление до 1.11.9 тихо выключало автоворкер, скрипт публикации отправлял в MAX не тот пост, повторная отправка могла дать дубли, а отложенные записи вставали в очередь дважды.

Плагин: MAX Autopost (Free). Предыдущий разбор: 1.11.9 и картинка, которая не доходила до MAX. Страница проекта: MAX Autopost на krivoshein.site.

Что было сломано в 1.11.9

  • Обновление выключало автоворкер. Миграция при обновлении сбрасывала worker_enabled, генерировала новый stamp очереди и двигала cutoff. Посты ниже нового cutoff уходили в ошибку. Новые записи вставали в очередь, но крон сразу выходил, и очередь просто копилась.
  • Скрипт публикации слал чужой пост. Внешние скрипты вызывали KRV_MAX_Autopost::process_queue(true). Этот вызов разбирает очередь с головы, поэтому в MAX уходил самый старый пост из очереди, а не тот, который только что вышел.
  • Повторная отправка могла дать дубли. «Переочередь» держалась на одном confirm() в браузере и возвращала в очередь в том числе уже отправленные посты. Массовое действие «В очередь: published» тоже брало посты со статусом sent и partial_success.
  • Отложенные посты вставали в очередь дважды. Хуки future_to_publish и transition_post_status оба ставили один и тот же пост. На krivoshein.site так попали в очередь по два раза посты 12140 и 12150.

Что исправлено в 1.12.0

  • Обновление больше не трогает автоворкер, stamp и cutoff, если они уже есть. Свежая установка по-прежнему стартует с выключенным воркером.
  • В ошибку при обновлении уходят только queued старше 14 дней. Срок меняется фильтром krv_max_autopost_stale_queue_days, от 1 до 3650 дней. Молодая очередь остаётся queued, sent и partial_success не меняются.
  • Новый публичный метод KRV_MAX_Autopost::send_post_now($post_id) и команда wp max-autopost send <id> отправляют ровно этот пост. Повтор без --force уже отправленный пост не шлёт, на время отправки на пост ставится замок.
  • process_queue(true) по-прежнему разбирает очередь, а process_queue(true, 0, $id) отправляет именно этот id.
  • «Переочередь» сначала показывает сухой просмотр. Выполнить можно только с чекбоксом «Да, переотправить» и отдельным nonce. Уже отправленные посты попадают туда только с отдельной галочкой, старый хеш сохраняется в _krv_max_sent_hash_prev, в лог пишется requeue_reset.
  • «В очередь: published» больше не берёт queued, sent и partial_success.
  • Отложенная публикация ставит пост в очередь один раз: хук future_to_publish снят.
  • Если автоворкер выключен, а очередь не пуста, на каждой странице админки висит предупреждение со сроком ожидания и кнопкой включения. Если воркер включён, а самый старый пост ждёт дольше 30 минут, появляется отдельное предупреждение. Крестиком они не закрываются, пока проблема есть.
  • Неудачная ручная кнопка «Отправить» больше не ставит сразу жёсткую ошибку: пост остаётся в очереди и ждёт повтора.

Пачка и HTTP 429

В настройках появились два поля: «Постов за запуск» (от 1 до 20, по умолчанию 1) и «Пауза между отправками» (от 0 до 60 секунд, по умолчанию 3). Тик крона и ручной запуск берут пачку постов и укладываются примерно в 45 секунд, замок крона продлевается на каждом посте.

Если MAX отвечает HTTP 429, плагин берёт задержку из Retry-After, а если заголовка нет, обычный backoff. Пачка останавливается, пост остаётся queued, время следующей попытки сдвигается, счётчик попыток не растёт. Запасные повторы без HTML и без вложений на 429 больше не запускаются.

Команды WP-CLI

Команды появляются, когда плагин загружен под WP-CLI:

wp max-autopost status
wp max-autopost queue list --status=queued --limit=50 --format=json
wp max-autopost queue run --limit=5
wp max-autopost send 12223
wp max-autopost send 12223 --dry-run
wp max-autopost send 12223 --force
wp max-autopost worker enable
wp max-autopost worker disable
  • status показывает состояние плагина, очереди и крона. Token и chat_id маскируются, вывод можно спокойно вставлять в issue.
  • queue list выводит очередь. Статусы: queued, error, partial_success, sent или all, по умолчанию queued. Формат table, json или csv, до 500 строк.
  • queue run разбирает очередь, даже если воркер выключен. Без --limit берётся настройка «Постов за запуск», с ним до 50 постов.
  • send <id> отправляет один опубликованный пост в обход выключателя воркера. --dry-run ничего не отправляет и не меняет мету, --force отправляет снова уже отправленный пост. Код выхода 0, если пост ушёл или пропущен, 1 при ошибке или HTTP 429.
  • worker enable|disable включает и выключает автоворкер.

Скрипт, который раньше вызывал process_queue(true) после публикации, теперь должен вызывать wp max-autopost send <id> с ID только что вышедшего поста. Из PHP то же самое делает KRV_MAX_Autopost::send_post_now($id).

Если в wp-config.php стоит DISABLE_WP_CRON, событие плагина нужно запускать системным cron каждую минуту. Пример из README:

* * * * * www-data flock -n /tmp/krv-wpcron.lock wp --path=/path/to/htdocs cron event run --due-now --quiet

Как обновиться

  1. Обновите плагин до 1.12.0. С включённым GitHub updater релиз подтянется сам. Либо скачайте max-autopost-1.12.0.zip с GitHub Releases и загрузите через «Плагины → Добавить новый → Загрузить плагин».
  2. Проверьте состояние: wp max-autopost status. 1.12.0 не включает воркер обратно сам, если его выключило обновление до 1.11.9. В админке об этом скажет предупреждение.
  3. Посмотрите, что накопилось: wp max-autopost queue list. Ненужные старые посты лучше убрать из очереди до включения воркера, иначе они уйдут в канал.
  4. Включите воркер кнопкой в предупреждении или командой wp max-autopost worker enable.
  5. Если у вас есть свой скрипт после публикации с process_queue(true), переключите его на wp max-autopost send <id>.

SHA-256 архива релиза: 889bfde85a81940141d3a5d06737ec4bb93e90115dd12b1af9787a41ce82118b.

Для тех, кто копает глубже

  • На WP 6.6+ add_option() делает INSERT … ON DUPLICATE KEY UPDATE и возвращает true, даже если строка уже была, поэтому как мьютекс он не работает. Замок крона и замок поста теперь берутся через INSERT IGNORE, а при внешнем object cache через wp_cache_add. Протухший замок снимается, чтобы упавший процесс не заклинил очередь.
  • Хеш отправки включает post_modified_gmt, поэтому для защиты от повтора одного хеша мало. send_post_now смотрит на статус sent и partial_success. Кнопка в админке статус не блокирует: после правки поста его можно отправить снова.
  • Если целей несколько и вторая ответила 429 после успешной первой, пост целиком возвращается в очередь. Первая цель при следующей попытке может получить дубль.
  • Сообщение, кнопки, картинка и fallback остались как в 1.11.9, кроме короткого выхода на 429.

Итог: после 1.12.0 обновление плагина не останавливает автопостинг, скрипт публикации отправляет свой пост, а не самый старый, повторная отправка сначала показывает, что именно уйдёт, отложенные записи уходят один раз. Для серверов без WP-Cron есть WP-CLI. Полный список правок в CHANGELOG.md, описание плагина и все статьи по версиям на странице MAX Autopost.

Поддержка: aleksey@krivoshein.site · Issues на GitHub.

Источники и ссылки


Комментарии загружаются…