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.12.0. С включённым GitHub updater релиз подтянется сам. Либо скачайте max-autopost-1.12.0.zip с GitHub Releases и загрузите через «Плагины → Добавить новый → Загрузить плагин».
- Проверьте состояние:
wp max-autopost status. 1.12.0 не включает воркер обратно сам, если его выключило обновление до 1.11.9. В админке об этом скажет предупреждение. - Посмотрите, что накопилось:
wp max-autopost queue list. Ненужные старые посты лучше убрать из очереди до включения воркера, иначе они уйдут в канал. - Включите воркер кнопкой в предупреждении или командой
wp max-autopost worker enable. - Если у вас есть свой скрипт после публикации с
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.