Зачем публиковать SEO-статьи в WordPress через REST API
WordPress REST API дает программный доступ к контенту сайта. Один POST-запрос на /wp-json/wp/v2/posts создает запись, а ответ возвращает ее ID, slug и ссылку на страницу. Ручная загрузка той же статьи занимает 25-40 минут: перенести текст, вставить изображения, прописать title, description и canonical, расставить теги и категории, проверить внутренние ссылки.
При плане 50 статей в месяц на механику уходит около 30 часов, при 100 статьях - порядка 50 часов, то есть почти полторы рабочие недели на копирование. REST API сжимает этот этап до минут: материал уходит на сайт сразу после генерации, а человек проверяет смысл и качество вместо переноса абзацев.
Платформа SerpJet генерирует SEO-статьи и публикует их в WordPress через REST API, включая мета-теги и canonical. Пакет материалов отправляется на сайт из интерфейса платформы, без ручной вставки текста в редактор.
Проблемы ручной публикации: время, ошибки, выгорание
День контент-менеджера с планом в пять статей выглядит однообразно: открыть документ, скопировать текст, вставить в редактор, поправить заголовки, загрузить картинку, заполнить alt, вписать title и description в SEO-плагин, добавить теги, поставить внутренние ссылки, проверить предпросмотр, нажать «Опубликовать». Пять статей - примерно три часа чистой механики.
На потоке появляются ошибки, которые потом дорого искать:
- canonical не прописан у статьи, которая дублируется на втором домене;
- теги разъехались по кластеру: где-то «купить кофемашину», где-то «кофемашина купить»;
- alt у изображения пустой, картинка не попадает в поиск по изображениям;
- slug содержит дату и случайный транслит, внутренние ссылки ведут на старый URL;
- мета-описание осталось от шаблона сайта и повторяется на десятках страниц.
При 50 и более статьях в месяц такой конвейер выжигает команду: люди уходят не от сложных задач, а от бесконечного копирования. Автоматизация здесь закрывает пропускную способность отдела, а не абстрактное удобство.
Что дает REST API: скорость, масштаб, интеграция с генерацией
- Публикация сразу после генерации. Готовый HTML уходит на сайт без промежуточного файла или документа.
- Массовая загрузка. Один скрипт или один клик в интерфейсе ставит в очередь десятки и сотни материалов.
- Единый стандарт оформления. Структура заголовков, теги, поля плагина и slug задаются шаблоном, поэтому разнобой в верстке исчезает.
- Обновление существующих статей. Запрос PATCH на
/wp-json/wp/v2/posts/<id>меняет текст, мета-поля и дату без создания новой записи. - Отложенный выход по расписанию. Поля
dateи статусfutureразносят публикации по календарю.
Планка в 500 статей в месяц выглядит реалистично, когда между генерацией и публикацией нет ручного звена. Индексацию такого потока тоже ускоряют программно: автоматическая отправка новых URL в Google и Яндекс снимает еще один пласт рутины.
Настройка аутентификации WordPress REST API
Анонимный запрос к /wp-json/wp/v2/posts отдает только опубликованные записи. Создание, правка и удаление требуют авторизации, иначе API вернет 401. Для автоматической публикации подходят три схемы, и выбор зависит от того, кто именно шлет запрос: ваш скрипт, сторонний сервис или SaaS-платформа.
| Метод | Что нужно | Когда выбирать |
|---|---|---|
| Application Passwords | WordPress 5.6+, HTTPS | Скрипты, боты, интеграции с одним сайтом |
| JWT | Плагин, секретный ключ, срок жизни токена | Мобильные приложения, короткоживущие сессии |
| OAuth 1.0a | Плагин, регистрация приложения, подпись запроса | Внешние сервисы, действующие от имени пользователя |
Application Passwords: самый простой способ для автоматизации
Пароли приложений встроены в ядро WordPress начиная с версии 5.6, отдельный плагин не нужен. Пароль создается в профиле пользователя отдельно, хранится в базе в виде хэша и в любой момент может быть отозван. По умолчанию пароли приложений доступны всем пользователям на сайтах, обслуживаемых по протоколу HTTPS.
- Откройте профиль пользователя: «Пользователи» → «Профиль».
- Найдите блок «Пароли приложений» и впишите понятное имя, например
serpjet-publisher. - Нажмите «Добавить новый пароль» и скопируйте строку вида
abcd EFGH 1234 ijkl. Она показывается один раз. - Сохраните ее в менеджере секретов или передайте в настройках интеграции.
В запросе пароль идет в заголовке Authorization вместе с логином, закодированный в Base64:
curl -X POST https://example.com/wp-json/wp/v2/posts -H "Authorization: Basic BASE64_ЛОГИН:ПАРОЛЬ_ПРИЛОЖЕНИЯ" -H "Content-Type: application/json" -d '{"title":"Заголовок статьи","content":"<p>Текст статьи</p>","status":"publish"}'
Практические требования: только HTTPS, роль пользователя с правом publish_posts и аккуратность с хранением секрета. Отозвать доступ можно в том же блоке профиля одним нажатием, что удобно при смене подрядчика. SerpJet подключается к сайту по этому методу: вы указываете адрес сайта, логин и пароль приложения, платформа дальше сама формирует запросы.
JWT и OAuth: когда нужны и как не запутаться
JWT выдает токен после проверки логина и пароля. Токен живет ограниченное время и подписывается секретным ключом, который прописывают в wp-config.php; сам механизм добавляет плагин, поскольку в ядре его нет. Схема удобна, когда нужно ограничить срок доступа или работать из мобильного приложения.
OAuth 1.0a подходит внешним сервисам, которые действуют от имени пользователя и хранят consumer key с secret. Подпись каждого запроса собирается отдельно, поэтому отладка занимает время. Для одного сайта и одной задачи публикации такая сложность не окупается.
Для публикации SEO-статей пароля приложения достаточно в большинстве проектов. Усложняйте схему, если требуется гранулярный доступ для разных подрядчиков или очень короткий срок жизни ключа.
Ключевые эндпоинты REST API для публикации статей
Публикация статьи упирается в четыре адреса API:
| Задача | Метод и адрес |
|---|---|
| Создать или обновить запись | POST /wp-json/wp/v2/posts, PATCH /wp-json/wp/v2/posts/<id> |
| Загрузить изображение | POST /wp-json/wp/v2/media |
| Создать тег | POST /wp-json/wp/v2/tags |
| Создать рубрику | POST /wp-json/wp/v2/categories |
Создание записи через /wp-json/wp/v2/posts
Тело запроса - JSON. Поле content принимает HTML, статус управляет публикацией, а таксономии передаются массивами ID.
{
"title": "Как выбрать кофемашину для офиса",
"slug": "kak-vybrat-kofemashinu-dlja-ofisa",
"content": "<h2>Критерии выбора</h2><p>Текст статьи</p>",
"excerpt": "Короткое описание для архива и анонсов.",
"status": "publish",
"categories": [12],
"tags": [34, 35],
"featured_media": 456,
"date": "2026-09-27T10:00:00"
}
Ответ содержит id, link и status, поэтому публикация легко логируется. Для черновика смените статус на draft, для публикации по календарю укажите future и будущую дату. Спецсимволы экранируются по правилам JSON, а теги внутри content должны быть закрыты, иначе редактор WordPress переформатирует блоки по своему усмотрению.
Загрузка изображений через /wp-json/wp/v2/media
Файл отправляется бинарными данными, а не JSON. Имя и тип задаются заголовками, среди которых Content-Disposition:
curl -X POST https://example.com/wp-json/wp/v2/media -H "Authorization: Basic BASE64_ЛОГИН:ПАРОЛЬ" -H "Content-Disposition: attachment; filename=\"cover.jpg\"" -H "Content-Type: image/jpeg" --data-binary @cover.jpg
В ответ приходит ID файла. Его подставляют в поле featured_media при создании записи, тогда картинка становится обложкой. Alt-текст для SEO добавляют отдельным запросом к тому же объекту:
curl -X POST https://example.com/wp-json/wp/v2/media/456 -H "Authorization: Basic BASE64_ЛОГИН:ПАРОЛЬ" -H "Content-Type: application/json" -d '{"alt_text":"Кофемашина в переговорной офиса","caption":"Фото: офисная кухня"}'
На практике загрузка медиа через REST API требует внимательной отладки: в сообществе разработчиков описывали случаи, когда при неверно собранном запросе в медиабиблиотеке появлялись только пустые записи с именами файлов, но без самих изображений. Проверяйте ответ API и наличие файла на диске после первой загрузки.
SerpJet подбирает изображения к статье и передает их через этот же эндпоинт вместе с alt-текстами, поэтому картинки не приходится догружать вручную.
Управление тегами и категориями через /wp-json/wp/v2/tags
Тег создается одним POST-запросом с именем и, при необходимости, slug:
curl -X POST https://example.com/wp-json/wp/v2/tags -H "Authorization: Basic BASE64_ЛОГИН:ПАРОЛЬ" -H "Content-Type: application/json" -d '{"name":"кофемашина для офиса","slug":"kofemashina-dlja-ofisa"}'
Ответ содержит ID термина. Массив этих ID уходит в поле tags при создании записи. Чтобы не плодить дубликаты, проверяйте существование термина заранее: функция term_exists() проверяет, существует ли указанный элемент таксономии, и если да - возвращает его ID или массив данных с ключом term_id. Рубрики работают так же через /wp-json/wp/v2/categories. SerpJet проставляет теги по кластерам семантического ядра, чтобы структура блога совпадала с логикой спроса.
Передача SEO-метатегов и canonical через REST API
Ядро WordPress не хранит title, description и canonical в отдельных полях, поэтому стандартный запрос к posts их не переносит. Эти данные живут в мета-полях SEO-плагина, и шлюзом к ним служит объект meta в теле запроса. Работает это при двух условиях: плагин активен, а его мета-поля зарегистрированы для REST.
Интеграция с Yoast SEO и Rank Math
Важное ограничение: REST API Yoast SEO в настоящее время работает только на чтение и не поддерживает вызовы для обновления данных. Чтобы значения SEO все же уходили через API, мета-поля плагина нужно зарегистрировать для REST вручную - например, через add_action('rest_api_init', ...) и register_post_meta с параметром show_in_rest. В примерах для Yoast фигурирует ключ yoast_wpseo_metadesc. По сообщениям пользователей, после такой регистрации значения SEO отправляются через API и сохраняются корректно, но индикаторы Yoast остаются серыми до ручного редактирования и сохранения записи в админке WordPress.
{
"title": "Как выбрать кофемашину для офиса",
"content": "<p>Текст статьи</p>",
"status": "publish",
"meta": {
"yoast_wpseo_metadesc": "Разбираем критерии выбора кофемашины для офиса: объем, обслуживание, стоимость владения."
}
}
Точный список доступных полей сверяйте перед запуском: отправьте запрос OPTIONS на /wp-json/wp/v2/posts и посмотрите ключи внутри meta в разделе schema. Если нужного ключа там нет, поле регистрируют функцией register_post_meta с параметром show_in_rest. Названия ключей зависят от версии SEO-плагина, поэтому проверка занимает пару минут и избавляет от молчаливой потери метатегов.
Как избежать дублирования и санкций поисковиков
Риск автоматической публикации связан с двумя вещами: повторяющимся текстом и мусорными метаданными. Оба вопроса решаются на уровне генерации, а не после публикации.
- Уникальность. SerpJet генерирует тексты на основе семантического ядра и данных RAG, а не копирует выдачи конкурентов.
- Canonical. Если версия статьи выходит на втором домене, поле canonical указывает на основную страницу и снимает проблему дублей.
- Релевантность. Ключи, LSI-слова и теги берутся из кластера запросов, поэтому статья отвечает на конкретный спрос.
- Поддержка позиций. Устаревшие материалы обновляются программно, когда трафик по ним просел.
Поисковые системы оценивают результат, а не способ загрузки страницы. Страница, опубликованная через API с корректными метатегами, canonical и уникальным текстом, не отличается от такой же страницы, набранной руками в редакторе.
Как SerpJet автоматизирует публикацию в WordPress
SerpJet закрывает весь цикл: сбор семантики, кластеризацию, генерацию статей, перелинковку, встраивание ваших товаров и услуг через RAG, публикацию и автообновление. WordPress подключается по адресу сайта и паролю приложения, поэтому код на стороне клиента писать не нужно.
Порядок работы:
- Сайт подключается в настройках платформы.
- Загружается или собирается семантическое ядро, разбитое по кластерам.
- Запускается генерация: статьи получают структуру, метатеги, изображения и внутренние ссылки.
- Материалы проходят согласование в интерфейсе платформы.
- Утвержденные статьи публикуются в WordPress или Битрикс.
Одноклик-публикация и массовая загрузка
Одна статья уходит на сайт кнопкой «Опубликовать», пакет выбирается чекбоксами и отправляется одним действием. Ставить в очередь сотню материалов можно вечером, а утром видеть их на сайте: API принимает запросы последовательно, теги и рубрики подставляются из ядра, изображения приходят вместе с записью. Доступна отложенная публикация, если контент-план расписан по датам.
Интерфейс согласования и контроль качества
Автоматизация не означает публикацию без просмотра. В интерфейсе SerpJet статья открывается целиком: заголовок, структура, метатеги, встроенные офферы. Материал можно утвердить, отправить на доработку или отклонить с комментарием. Такой контроль закрывает главное возражение о качестве: перед выходом текст видит человек, но не тратит время на верстку и перенос.
Экономический эффект: ROI автоматизации публикации
Считайте не стоимость подписки, а разницу между ней и текущими расходами на контент. По данным исследования рынка SEO 2026 от Топвизора, в котором во второй половине 2025 года опросили 180 специалистов, SEO-копирайтинг и подготовка контента на сайте занимают третье место среди услуг - 68,9%. Это подтверждает, что контент остается одной из главных статей расходов и работ в SEO.
К текстам добавляется время сотрудника на публикацию. Те же 100 статей, загруженных вручную по 30 минут, съедают около 50 часов, то есть больше рабочей недели. Через API этот этап сокращается до нескольких минут машинного времени.
| Статья расходов | Ручной процесс, 100 статей | Публикация через API |
|---|---|---|
| Написание текстов | по прайсу подрядчика | подписка SerpJet |
| Загрузка и оформление | около 50 часов | минуты |
| Метатеги, canonical, alt | вручную, с ошибками | по шаблону |
| Обновление устаревших статей | по остаточному времени | автоматически |
Экономия проявляется не только в деньгах. Команда перестает тонуть в рутине, а сайт работает как автономный отдел продаж: новые материалы выходят по расписанию, старые поддерживаются в тонусе.
Пошаговый план внедрения автоматической публикации
- Проверьте базу: WordPress 5.6 или новее, включен HTTPS, постоянные ссылки не на «простом» формате.
- Создайте отдельного пользователя с ролью, дающей право публикации, и пароль приложения для него.
- Установите и активируйте SEO-плагин: Yoast SEO или Rank Math.
- Зарегистрируйтесь в SerpJet и подключите сайт: адрес, логин, пароль приложения.
- Загрузите семантическое ядро или соберите его в платформе.
- Запустите генерацию первой партии из 5-10 статей.
- Проверьте результат в интерфейсе согласования: заголовок, структура, офферы, метатеги.
- Опубликуйте одну статью и откройте ее на сайте: проверьте canonical, description, alt у обложки, теги.
- Отправьте остальные материалы пакетом и настройте расписание.
Первый тестовый запуск занимает меньше часа, основное время уходит на проверку пары страниц. Дальше цикл повторяется без ручной загрузки: генерация, согласование, публикация, обновление. Начните с десяти статей, сверьте индексацию в Яндекс Вебмастере и масштабируйте объем на serpjet.ru.