Назад в блог

Мой стек WordPress для Headless: 12 плагинов из реального проекта

Sergey Nesmachny
Sergey Nesmachny
11.01.2026
7 мин чтения
Поделиться:
Мой стек WordPress для Headless: 12 плагинов из реального проекта

\”WordPress в 2026? Серьёзно?\” — слышу я каждый раз, когда рассказываю о своём технологическом стеке.

Да, серьёзно. И пока другие тратят недели на настройку Strapi или платят $300/месяц за Contentful, мой headless-сайт уже работает в продакшене.

Эта статья — продолжение кейса по разработке корпоративного сайта. Здесь я подробно расскажу о WordPress-части проекта: почему выбрал именно эту CMS, какие плагины использовал и какие грабли собрал по дороге.

Почему WordPress, а не модные альтернативы?

Когда речь заходит о выборе CMS для headless-проекта, многие сразу думают о Strapi, Sanity или Contentful. Я тоже думал. А потом посчитал.

Критерий WordPress Strapi Sanity Contentful
Возраст 21 год 9 лет 7 лет 11 лет
Стоимость Бесплатно Бесплатно От $99/мес От $300/мес
Хостинг Свой сервер Свой сервер Cloud Cloud
Обучение команды 0 дней 2-3 дня 1 неделя 1 неделя
Плагины 60,000+ ~1,500 ~200 ~150
Stack Overflow ответов 500,000+ ~15,000 ~8,000 ~12,000

Для моего проекта WordPress победил по главному критерию: скорость запуска при максимальной гибкости.

Конкретные преимущества

Зрелая экосистема. 21 год разработки означает: на любой баг уже есть ответ. Я ни разу не столкнулся с проблемой, которую никто не решал до меня.

Управление пользователями из коробки. Роли (Admin, Editor, Author), права доступа, мультисайт — всё готово. Не нужно писать auth-систему с нуля или платить за Auth0.

Медиа-библиотека. Загрузка файлов, автоматическая генерация миниатюр разных размеров, метаданные изображений — работает без дополнительных плагинов.

REST API по умолчанию. Начиная с версии 4.7, WordPress включает полноценный REST API. Любой контент доступен по /wp-json/wp/v2/.

Знакомый интерфейс. Контент-менеджер уже знает WordPress. Ноль времени на обучение — сразу в работу.


Локальная разработка: Local by Flywheel

Прежде чем говорить о плагинах — инструмент, без которого я не начинаю ни один WordPress-проект.

Local (ранее Local by Flywheel) — лучший способ поднять WordPress локально на Mac или Windows.

Что умеет:

  • Новый WordPress-сайт за 30 секунд (буквально)
  • Автоматическая настройка nginx/Apache, PHP, MySQL
  • Встроенный SSL для локальных доменов
  • Live Links — публичная ссылка для показа клиенту без деплоя
  • Переключение версии PHP одним кликом
  • Полная интеграция с WP-CLI
  • Бесплатный для основных функций

Мой workflow: открыл Local → \\\”Create new site\\\” → ввёл имя → через минуту WordPress готов.

Скачать: localwp.com


Плагины: полный стек проекта

За годы работы я перепробовал сотни плагинов. Вот 12, которые реально использую в production.

🔴 Критически важные (без них не стартую)

WP Mail SMTP

Проблема: Стандартная PHP-функция mail() отправляет письма в спам или вникуда.

Решение: Плагин позволяет отправлять через нормальные SMTP-сервисы:

  • SendGrid (использую в этом проекте)
  • Gmail / Google Workspace
  • Mailgun, Amazon SES
  • Любой SMTP-сервер

Без этого плагина вы просто не узнаете, что клиент отправил заявку.

wordpress.org/plugins/wp-mail-smtp


Safe SVG

Проблема: WordPress блокирует загрузку SVG из соображений безопасности.

Решение: Плагин санитизирует SVG при загрузке, удаляя потенциально опасный код (скрипты, внешние ссылки).

Почему критично: Логотипы, иконки, векторная графика — всё в SVG. Без этого плагина каждый раз конвертировать в PNG.

wordpress.org/plugins/safe-svg


XCloner – Backup and Restore

Проблема: Один неудачный апдейт — и сайт лежит.

Решение: Полные бэкапы (файлы + БД) с восстановлением в один клик.

Возможности:

  • Бэкап по расписанию (cron)
  • Хранение в облаке (S3, Google Drive, Dropbox)
  • Инкрементальные бэкапы
  • Восстановление прямо из админки

Правило: Бэкап перед каждым обновлением плагинов. Всегда.

wordpress.org/plugins/xcloner-backup-and-restore


🟡 Рекомендуемые (значительно улучшают workflow)

Contact Form 7

Для чего: Формы обратной связи с гибкой настройкой.

Киллер-фича для Headless: REST API endpoint для отправки форм:

 
 
POST /wp-json/contact-form-7/v1/contact-forms/{id}/feedback

Форма на React/Next.js отправляет данные напрямую в WordPress — без backend-прослоек.

wordpress.org/plugins/contact-form-7


Flamingo

Проблема: Contact Form 7 только отправляет email. Если письмо потерялось — заявка потеряна.

Решение: Сохраняет ВСЕ отправки в базу данных WordPress. В админке появляется раздел \\\”Inbound Messages\\\” с полной историей.

Установка: Просто активировать. Никаких настроек — работает автоматически.

wordpress.org/plugins/flamingo


WordPress Importer

Для чего: Импорт контента из XML-файлов.

Когда нужен:

  • Миграция между сайтами
  • Перенос демо-данных
  • Восстановление из стандартного экспорта WP

wordpress.org/plugins/wordpress-importer


🟢 Специфичные для проекта

WooCommerce

Неожиданное применение: Использую не для продаж, а как систему управления каталогом продуктов.

Что даёт:

  • Структурированные карточки товаров
  • Кастомные поля (характеристики, спецификации)
  • Категории и теги
  • Галереи изображений
  • Готовый REST API (/wp-json/wc/v3/products)

Совет: Если нужен каталог без e-commerce — WooCommerce всё равно лучший выбор. Просто отключите корзину и оплату.

wordpress.org/plugins/woocommerce


Translio (AI Translation)

Что делает: Автоматический перевод контента через Claude AI.

Функционал:

  • Перевод постов/страниц в один клик
  • Сохранение в отдельные мета-поля
  • REST API для получения переводов
  • Очередь для batch-обработки

Интеграция с frontend:

 
 
GET /wp-json/mmq/v1/translate/{post_id}?lang=de

🔧 Кастомные плагины (разработаны под проект)

MMQ Configuration

Панель управления для специфичных настроек:

  • REST endpoints для homepage, сервисов, приложений
  • Meta boxes для расширенных полей товаров
  • Настройки newsletter-секции
  • Управление иконками продуктов

Почему не ACF: Для headless удобнее полный контроль над структурой REST API.


MMQ Next.js Webhooks

Автоматическое обновление frontend при изменении контента:

  1. Редактор сохраняет пост в WordPress
  2. Плагин отправляет webhook на Next.js
  3. Next.js ревалидирует страницы (ISR)
  4. Контент обновляется без редеплоя

Без этого пришлось бы ждать истечения кэша или деплоить при каждой правке.


Структура REST API

Итоговая карта endpoints проекта:

 
 
# Стандартные WordPress
GET /wp-json/wp/v2/posts              # Посты блога
GET /wp-json/wp/v2/pages              # Страницы
GET /wp-json/wp/v2/media              # Медиафайлы

# WooCommerce
GET /wp-json/wc/v3/products           # Каталог товаров
GET /wp-json/wc/v3/products/categories

# Contact Form 7
POST /wp-json/contact-form-7/v1/contact-forms/{id}/feedback

# Кастомные (MMQ Configuration)
GET /wp-json/mmq/v1/homepage          # Данные главной
GET /wp-json/mmq/v1/services/{slug}   # Страницы сервисов
GET /wp-json/mmq/v1/downloads         # PDF-документы
GET /wp-json/mmq/v1/translate/{id}    # AI-переводы

Подводные камни (о чём молчат в туториалах)

🪨 CORS-ад

Проблема: Первые 2 часа проекта я боролся с ошибками CORS при запросах с localhost.

Решение (добавить в functions.php):

 
 
php
add_action(\\\'rest_api_init\\\', function() {
    remove_filter(\\\'rest_pre_serve_request\\\', \\\'rest_send_cors_headers\\\');
    add_filter(\\\'rest_pre_serve_request\\\', function($value) {
        // На продакшене заменить * на конкретный домен!
        $origin = \\\'https://your-frontend.com\\\';
        header(\\\"Access-Control-Allow-Origin: $origin\\\");
        header(\\\'Access-Control-Allow-Methods: GET, POST, OPTIONS\\\');
        header(\\\'Access-Control-Allow-Headers: Content-Type, Authorization\\\');
        return $value;
    });
});

⚠️ Важно: Access-Control-Allow-Origin: * — только для разработки. На проде укажите конкретный домен.


🪨 Превью постов не работает

Проблема: Кнопка \\\”Preview\\\” в WordPress открывает… WordPress. А нам нужен frontend.

Решение: Кастомный preview endpoint + фильтр preview_post_link:

 
 
php
add_filter(\\\'preview_post_link\\\', function($link, $post) {
    return \\\'https://your-frontend.com/api/preview?id=\\\' . $post->ID;
}, 10, 2);

🪨 Медленный REST API

Проблема: Запрос /wp-json/wp/v2/posts по умолчанию возвращает ВСЁ — все поля каждого поста. Один запрос может весить 500KB.

Решение: Всегда используйте параметр _fields:

 
 
GET /wp-json/wp/v2/posts?_fields=id,title,excerpt,featured_media,date

Размер ответа падает в 10 раз.


🪨 Gutenberg + Headless = боль

Проблема: Если редакторы используют блоки Gutenberg, в API приходит HTML с кастомными комментариями. Парсить это на фронтенде — квест.

Мои варианты решения:

  1. Использовать Classic Editor (плагин)
  2. Ограничить набор разрешённых блоков
  3. Использовать библиотеку @wordpress/block-serialization-default-parser

Я выбрал вариант 1 — Classic Editor. Проще для всех.


🪨 Безопасность wp-admin

Проблема: Боты постоянно долбят /wp-admin и /wp-login.php.

Решение: IP whitelist на уровне nginx:

 
 
nginx
location /wp-admin {
    allow 1.2.3.4;  # Ваш IP
    deny all;
}

location /wp-login.php {
    allow 1.2.3.4;
    deny all;
}

Или плагин типа Limit Login Attempts Reloaded.


Советы по оптимизации

Кэширование на всех уровнях

REST API запросы можно (и нужно) кэшировать:

Уровень Инструмент TTL
WordPress Transients API 1-24 часа
Сервер nginx fastcgi_cache 1 час
CDN Cloudflare 1-4 часа
Frontend Next.js ISR (revalidate) 60-3600 сек

Отключите ненужное

Если WordPress только как API:

 
 
php
// Отключить emoji
remove_action(\\\'wp_head\\\', \\\'print_emoji_detection_script\\\', 7);

// Отключить embed
remove_action(\\\'wp_head\\\', \\\'wp_oembed_add_discovery_links\\\');

// Отключить REST API для неавторизованных (если не нужен публичный доступ)
add_filter(\\\'rest_authentication_errors\\\', function($result) {
    if (!is_user_logged_in()) {
        return new WP_Error(\\\'rest_forbidden\\\', \\\'Unauthorized\\\', [\\\'status\\\' => 401]);
    }
    return $result;
});

Итоги: когда выбирать WordPress Headless

✅ Выбирайте WordPress, если:

  • Команда уже знает WordPress
  • Нужен быстрый старт (дни, не недели)
  • Бюджет ограничен
  • Требуется сложное управление контентом (роли, workflow)
  • Проект может расти непредсказуемо

❌ Рассмотрите альтернативы, если:

  • Нужна real-time синхронизация (Sanity лучше)
  • Команда не знает PHP вообще
  • Проект строго cloud-native
  • Нужен GraphQL из коробки (тогда Strapi)

Нужна помощь с Headless WordPress?

Если вы планируете похожий проект, я могу помочь на любом этапе:

🔍 Консультация (1 час) — разберём архитектуру, выберем стек, составим план

📋 Аудит — проверю текущий WordPress на готовность к headless-миграции

🚀 Разработка под ключ — от настройки CMS до деплоя, как в этом кейсе

Обсудить проект →


Есть вопросы по конкретным плагинам или настройкам? Пишите в комментариях или в Telegram — отвечу.

Sergey Nesmachny

Автор

Sergey Nesmachny

Поделиться: