Бесплатный AI-плагин для WordPress: 330 SEO-статей с картинками за 3 недели без копирайтера
Бесплатный плагин ставится в WordPress zip-архивом и сам ведёт контент-конвейер: из RSS-темы пишет SEO-статью, рисует картинку, подбирает категории и публикует по расписанию.
Задача
Ручной цикл контента знаком каждому, кто гоняет ChatGPT для блога: тема → запрос → статья → картинка → загрузка в WordPress → категории и теги → «Опубликовать». 15–20 минут на статью, полтора рабочих дня на тридцать. Копирайтер закрывает ту же работу от 500 ₽ за статью — тридцать в месяц уже около 15 000 ₽.
Тот же цикл нужен любому владельцу блога или интернет-магазина, который держит регулярный SEO-раздел: новости, обзоры, товарные подборки. Задача — собрать плагин, который проходит весь цикл сам, в фоне, по расписанию, и оставляет владельцу только проверку и кнопку публикации. Дополнительно — сделать его бесплатным лид-магнитом: свободно ставится, а тонкая настройка под нишу и не-WordPress-платформы продаётся отдельно.
Решение
DWAP AI Content — плагин на PHP 8.2 (namespace DWAP, PSR-4, WordPress Coding Standards, зависимости через Composer). Ставится в WordPress zip-архивом через админку, как любой плагин. Внутри — конвейер из одного оркестратора и сменных провайдеров.
Generator проводит статью через весь пайплайн: генерация текста → генерация промпта картинки из готового заголовка → генерация изображения → wp_insert_post (черновик или сразу публикация, привязка обложки, категорий и тегов) → запись в лог. Картинка — fail-soft: если провайдер изображений упал, статья всё равно создаётся (статус лога partial), а скачивание картинки идёт с тремя ретраями (CDN бывает медленным).
Сменные провайдеры вместо одного вшитого API. Provider_Factory собирает нужный провайдер из настроек, все они работают по OpenAI-совместимому протоколу через интерфейсы:
- текст — OpenRouter (бесплатные модели), Polza.ai (российский API, оплата в рублях, без VPN) или любой Custom по URL и ключу;
- картинки — Pixazo (Flux Schnell бесплатно), Polza.ai (Nano Banana с кириллицей) или Custom.
Переключение «бесплатно ↔ платно» и «глобальный API ↔ российский» — это выбор в настройках, а не правка кода. Для OpenRouter плагин сам подтягивает список именно бесплатных текстовых моделей (фильтр по нулевой цене и текстовой модальности).
Подбор категорий и тегов без мусора. Если включена авто-таксономия, в промпт подставляются уже существующие на сайте категории и теги ({categories_list} / {tags_list}). Модель возвращает структурированный ответ с маркерами TITLE: / CATEGORY: / TAGS: / BODY:, а парсер находит термины по имени и привязывает их к посту. Новые теги на лету создаются только если это явно разрешено отдельной опцией — иначе плагин выбирает исключительно из имеющихся и не плодит хаос в таксономии. Тот же парсер вычищает частые артефакты LLM: markdown-ограждения ```, продублированный заголовок в начале тела, запрещённые вводные секции («Введение», «Обзор») и иероглифы CJK, которые модели иногда роняют в русский текст.
Внешний источник против зацикливания. RSS_Reader тянет свежие темы из ленты и дедуплицирует их по GUID через отдельную таблицу истории — одна тема не берётся дважды. Это ключевое решение: без внешнего входа LLM со временем зацикливается и пишет об одном и том же разными заголовками. Свежесть дисциплинирует темой.
Расписание. Scheduler регистрирует событие WP Cron с частотой от 10 минут до недели и за один запуск генерирует заданное число статей, беря следующую неиспользованную тему по списку лент. Сбой на одной статье не роняет прогон — цикл ловит исключение, пишет его в лог и идёт к следующей. Всё видно в таблице логов: провайдер, модель, токены, статус, ссылка на пост.

Стек
PHP 8.2 · WordPress 5.0+ · WP Cron · OpenAI-совместимый API (openai-php/client, Guzzle) · OpenRouter · Polza.ai · Pixazo (Flux Schnell) · MySQL · Composer / PSR-4 · Docker (dev)
Результат
- 330 статей за 3 недели на тестовом блоге — одна за другой, в фоне, без участия. Отдельные попытки отваливались, но крон продолжал стрелять: за сутки что-то да накапливалось.
- 25 статей в день на бесплатном тире. Free-лимит OpenRouter — 50 запросов в сутки, плагин тратит 2 на статью (текст + промпт картинки). Для старта одного блога — с запасом.
- Стоимость. На связке Polza.ai крон в 30 статей/месяц обходится в 300–500 ₽ — цена одной статьи у копирайтера против ~15 000 ₽ за тот же объём вручную.
- Статьи выходят с обложкой, категориями и SEO-заголовком — формат, который Яндекс нормально индексирует.


Что не сработало
Генерация «из воздуха» зацикливается. Первый вариант с промптом «выбери тему сам» без внешнего источника через день-два начинал ходить по кругу — недетерминированность LLM без актуального входа. Решение — обязательный RSS с дедупликацией по GUID: тема приходит снаружи и не повторяется.
Бесплатный тир OpenRouter нестабилен. Модели уходят из free без предупреждения (в карточке висит Going away April 22), упираются в лимиты и очереди, иногда просто лежат. Под крон каждые 10 минут это лотерея. Вывод: намертво к одной модели не привязываешься, раз в пару недель заглядываешь и меняешь — благо крон прощает, не эта попытка, так следующая.
Flux Schnell не умеет кириллицу. Где бесплатная модель пытается написать русский текст на обложке, выходят «китайские иероглифы». Лечится двумя способами: генерировать обложки без текста либо переходить на платный Nano Banana через Polza.ai, который кириллицу пишет.
WP-крон не системный. Он просыпается при заходах на сайт, а не по часам. На живом трафике летает, на пустом блоге ленится. Фикс — серверный крон, который сам дёргает сайт по расписанию.