Headless WordPress: интеграция WP REST API с React и Next.js

Наша компания занимается разработкой, поддержкой и обслуживанием сайтов любой сложности. От простых одностраничных сайтов до масштабных кластерных систем построенных на микро сервисах. Опыт разработчиков подтвержден сертификатами от вендоров.

Разработка и обслуживание любых видов сайтов:

Информационные сайты или веб-приложения
Сайты визитки, landing page, корпоративные сайты, онлайн каталоги, квиз, промо-сайты, блоги, новостные ресурсы, информационные порталы, форумы, агрегаторы
Сайты или веб-приложения электронной коммерции
Интернет-магазины, B2B-порталы, маркетплейсы, онлайн-обменники, кэшбэк-сайты, биржи, дропшиппинг-платформы, парсеры товаров
Веб-приложения для управления бизнес-процессами
CRM-системы, ERP-системы, корпоративные порталы, системы управления производством, парсеры информации
Сайты или веб-приложения электронных услуг
Доски объявлений, онлайн-школы, онлайн-кинотеатры, конструкторы сайтов, порталы предоставления электронных услуг, видеохостинги, тематические порталы

Это лишь некоторые из технических типов сайтов, с которыми мы работаем, и каждый из них может иметь свои специфические особенности и функциональность, а также быть адаптированным под конкретные потребности и цели клиента

Услуги, которые мы предлагаем
Показано 1 из 1Все 2062 услуг
Headless WordPress: интеграция WP REST API с React и Next.js
Средний
~3-5 дней
Часто задаваемые вопросы

Наши компетенции:

Этапы разработки

Последние работы

  • image_website-b2b-advance_0.webp
    Разработка сайта компании B2B ADVANCE
    1359
  • image_web-applications_feedme_466_0.webp
    Разработка веб-приложения для компании FEEDME
    1251
  • image_websites_belfingroup_462_0.webp
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    957
  • image_ecommerce_furnoro_435_0.webp
    Разработка интернет магазина для компании FURNORO
    1188
  • image_crm_enviok_479_0.webp
    Разработка веб-приложения для компании Enviok
    929
  • image_bitrix-bitrix-24-1c_fixper_448_0.webp
    Разработка веб-сайта для компании ФИКСПЕР
    947

Headless WordPress: интеграция WP REST API с React и Next.js

Типичная проблема: бизнесу нужен управляемый контент в WordPress, но готовые темы не обеспечивают нужную производительность или кастомизацию. Решение — headless CMS, где WordPress остаётся бэкендом, а фронтенд строится на React, Vue, Next.js или Svelte. Это избавляет от монолитных тем, ускоряет загрузку страниц (LCP снижается на 30–50%) и упрощает поддержку. За 5+ лет мы реализовали более 50 таких проектов — от интернет-магазинов до корпоративных порталов. Бюджет интеграции сопоставим со стоимостью одного месяца работы фронтенд-разработчика, но окупается за счёт снижения затрат на хостинг и ускорения вывода новых страниц.

Какие задачи решает headless WordPress?

  • Отделение контента от представления: редакторы работают в знакомой админке WordPress, а разработчики используют современный стек (React, Next.js, Vue). Больше не нужно подгонять шаблоны под дизайн — API отдаёт чистые данные.
  • Повышение производительности: статические страницы (SSG) и ISR сокращают TTFB до 200 мс, а LCP — до 2 с. Экономия на серверных ресурсах достигает 40% за счёт кеширования.
  • Единое API для всех клиентов: один WordPress может обслуживать SPA, мобильное приложение и телеграм-бота — через REST или GraphQL.

Базовая интеграция: получение данных

WordPress REST API по умолчанию доступен по /wp-json/wp/v2/. Получение последних постов:

// lib/wordpress.ts
const WP_API_URL = process.env.NEXT_PUBLIC_WP_URL + '/wp-json/wp/v2';

export interface WPPost {
  id: number;
  slug: string;
  title: { rendered: string };
  content: { rendered: string };
  excerpt: { rendered: string };
  date: string;
  featured_media: number;
  _embedded?: {
    'wp:featuredmedia'?: [{ source_url: string; alt_text: string }];
    'wp:term'?: Array<Array<{ id: number; name: string; slug: string }>>;
  };
}

export async function getPosts(params: {
  perPage?: number;
  page?: number;
  category?: number;
  search?: string;
} = {}): Promise<{ posts: WPPost[]; total: number; totalPages: number }> {
  const qs = new URLSearchParams({
    per_page: String(params.perPage ?? 12),
    page:     String(params.page ?? 1),
    _embed:   'wp:featuredmedia,wp:term',
    ...(params.category && { categories: String(params.category) }),
    ...(params.search   && { search: params.search }),
  });

  const res = await fetch(`${WP_API_URL}/posts?${qs}`, {
    next: { revalidate: 60 }, // ISR в Next.js 13+
  });

  if (!res.ok) throw new Error(`WP API error: ${res.status}`);

  return {
    posts:      await res.json(),
    total:      Number(res.headers.get('X-WP-Total')),
    totalPages: Number(res.headers.get('X-WP-TotalPages')),
  };
}

export async function getPostBySlug(slug: string): Promise<WPPost | null> {
  const res = await fetch(`${WP_API_URL}/posts?slug=${slug}&_embed=wp:featuredmedia,wp:term`);
  const posts = await res.json();
  return posts.length ? posts[0] : null;
}

Next.js App Router: динамические маршруты

// app/blog/[slug]/page.tsx
import { getPostBySlug, getPosts } from '@/lib/wordpress';
import { notFound } from 'next/navigation';

export async function generateStaticParams() {
  const { posts } = await getPosts({ perPage: 100 });
  return posts.map(post => ({ slug: post.slug }));
}

export async function generateMetadata({ params }: { params: { slug: string } }) {
  const post = await getPostBySlug(params.slug);
  if (!post) return {};
  return {
    title:       post.title.rendered,
    description: post.excerpt.rendered.replace(/<[^>]+>/g, '').slice(0, 160),
  };
}

export default async function PostPage({ params }: { params: { slug: string } }) {
  const post = await getPostBySlug(params.slug);
  if (!post) notFound();

  const media = post._embedded?.['wp:featuredmedia']?.[0];

  return (
    <article className="post-single">
      {media && (
        <img
          src={media.source_url}
          alt={media.alt_text}
          className="post-single__cover"
        />
      )}
      <h1 dangerouslySetInnerHTML={{ __html: post.title.rendered }} />
      <div
        className="post-content"
        dangerouslySetInnerHTML={{ __html: post.content.rendered }}
      />
    </article>
  );
}

dangerouslySetInnerHTML здесь допустим — контент от доверенного сервера, но если источник под вашим контролем, добавьте DOMPurify для безопасности.

Кастомный хук для React SPA

// hooks/usePosts.ts
import useSWR from 'swr';

const fetcher = (url: string) => fetch(url).then(r => r.json());

export function usePosts(category?: string, page = 1) {
  const params = new URLSearchParams({ per_page: '12', page: String(page), _embed: '1' });
  if (category) params.set('categories', category);

  const { data, error, isLoading } = useSWR<WPPost[]>(
    `/wp-json/wp/v2/posts?${params}`,
    fetcher,
    { revalidateOnFocus: false }
  );

  return { posts: data ?? [], isLoading, error };
}

Используйте этот хук с пагинацией и скелетонами. Пример компонента — в документации SWR.

Как настроить on-demand ISR для мгновенного обновления контента?

Next.js поддерживает перестройку страниц по триггеру. Когда пост публикуется в WordPress, PHP-код отправляет POST-запрос на эндпоинт /api/revalidate в Next.js:

// WordPress: save_post hook и CORS filter
add_action('save_post', function (int $post_id, WP_Post $post): void {
    if ($post->post_status !== 'publish') return;

    $next_url = get_option('nextjs_revalidate_url');
    $secret   = get_option('nextjs_revalidate_secret');

    if (!$next_url || !$secret) return;

    wp_remote_post("{$next_url}/api/revalidate", [
        'body'    => json_encode([
            'secret' => $secret,
            'path'   => '/' . $post->post_type . '/' . $post->post_name,
        ]),
        'headers' => ['Content-Type' => 'application/json'],
        'blocking'=> false,
    ]);
}, 10, 2);

add_filter('rest_pre_serve_request', function ($value) {
    $origin = $_SERVER['HTTP_ORIGIN'] ?? '';
    $allowed = ['https://mysite.com', 'https://www.mysite.com', 'http://localhost:3000'];
    if (in_array($origin, $allowed)) {
        header('Access-Control-Allow-Origin: ' . $origin);
        header('Access-Control-Allow-Credentials: true');
        header('Access-Control-Allow-Methods: GET, POST, OPTIONS');
        header('Access-Control-Allow-Headers: Authorization, Content-Type');
    }
    return $value;
});

А на стороне Next.js обрабатываем:

// Next.js: app/api/revalidate/route.ts
import { revalidatePath } from 'next/cache';

export async function POST(req: Request) {
  const { secret, path } = await req.json();

  if (secret !== process.env.REVALIDATE_SECRET) {
    return Response.json({ error: 'Invalid secret' }, { status: 401 });
  }

  revalidatePath(path);
  return Response.json({ revalidated: true, path });
}

Этот пайплайн обеспечивает обновление страниц за секунды без полной перестройки сайта. Экономия трафика — до 40% по сравнению с полной регенерацией.

Производительность: что кешировать

Данные Стратегия
Список постов ISR, revalidate: 60s
Одиночный пост ISR + on-demand revalidate при save_post
Меню навигации Static (revalidate: false)
Поисковые результаты SSR (без кеша, параметры меняются)
ACF-поля настроек сайта Static или revalidate: 3600s

Сравнение REST и GraphQL

Критерий REST GraphQL
Гибкость запросов Фиксированные поля Выбор только нужных данных
Количество запросов Часто несколько Один
Сложность настройки Минимальная Требуется плагин и схема
Производительность Высокая для простых страниц Лучше для сложных вложений

Как проходит интеграция headless WordPress

  1. Аудит — разбираем текущую архитектуру WordPress, плагины, объём контента, нагрузку.
  2. Проектирование — определяем необходимые endpoint’ы, поля, стратегию кеширования (ISR, SSG, SSR).
  3. Настройка API — расширяем REST или устанавливаем WPGraphQL, добавляем custom fields (ACF).
  4. Разработка фронтенда — создаём типизированный клиент (TypeScript), компоненты, маршрутизацию.
  5. Интеграция — подключаем CORS, on-demand revalidation, деплоим WordPress и фронтенд.
  6. Тестирование — проверяем производительность (Core Web Vitals), кросс-доменные запросы, обработку ошибок.
  7. Документация и передача — записываем видео-консультацию для команды, передаём репозиторий.

Сроки: базовая интеграция — от 5 до 7 рабочих дней, сложные сценарии (GraphQL, ACF, on-demand ISR) — до 15 дней. Точную оценку даём после аудита.

Детали настройки CORS

При разных доменах WordPress и фронтенда добавляем фильтр rest_pre_serve_request, который устанавливает заголовки для разрешённых источников. Это стандартная практика, описанная в документации REST API. Если нужна нестандартная конфигурация — мы подстроим под ваш проект.

Сколько стоит интеграция headless WordPress?

Стоимость рассчитывается индивидуально на основе объёма контента, количества типов записей, необходимости GraphQL и сложности маршрутизации. В среднем бюджет сопоставим с месячной зарплатой младшего разработчика, а экономия на хостинге и времени разработки перекрывает инвестиции в течение полугода.

Хотите получить точную оценку? Закажите аудит вашего проекта — мы проанализируем архитектуру и предложим оптимальное решение. Свяжитесь с нами через форму на сайте или напишите в Telegram.

WordPress разработка: кастомные темы, плагины и WooCommerce

Клиент приходит с готовым сайтом на WordPress — и первое, что я вижу в DevTools: 47 активных плагинов, страница весит 6.8 MB, TTFB 2.4 с, в консоли пять конфликтующих версий jQuery. Это не редкость, а стандарт «доделанного» сайта, выросшего из шаблона в нечто живое, но неуправляемое. Мы решаем такие задачи под ключ — от аудита до деплоя. Оценим ваш проект за один рабочий день, свяжитесь.

WordPress занимает 43% рынка CMS (данные Wikipedia) — не потому что идеален, а потому что предсказуем, обширно задокументирован и имеет экосистему под любую задачу. Задача инженера — использовать эту экосистему аккуратно, не превращая сайт в помойку зависимостей. Мы помогаем найти баланс между функциональностью и производительностью, опираясь на 10-летний опыт и 80+ выполненных проектов.

Архитектурные решения и частые проблемы

Блокировка рендеринга из-за плагинов

Plugin A загружает jQuery 3.6, Plugin B — jQuery 1.12, тема — свой jQuery Migrate. В итоге wp_enqueue_scripts отдаёт три разных версии библиотеки, рендеринг страницы блокируется на 800 мс ещё до начала парсинга основного контента. Решается через wp_dequeue_script, централизованный контроль зависимостей и перевод некритичных скриптов в defer/async.

N+1 запросы и их решение

Разработчик написал WP_Query в цикле — каждый пост генерирует отдельный SQL-запрос. На странице с 20 постами это 21+ запрос к базе. MySQL начинает тупить, сервер греется. Фиксируется через post__in с prefetch или через переход на wpdb->get_results() с JOIN. Query Monitor — первый инструмент для диагностики.

WooCommerce под нагрузкой

Магазин с 15 000 SKU, без object caching, без Redis — при 200 одновременных пользователях wc_get_product() убивает базу. Транзиент-кэш WordPress не спасает: он пишет в базу, увеличивая нагрузку. Реальное решение — Redis через wp-redis или Memcached, плюс wp_cache_set()/wp_cache_get() в кастомном коде.

Как выбрать архитектуру: headless или монолит?

Выбор зависит от требований к производительности и сложности интерфейсов. Headless (REST API / WPGraphQL + Next.js) даёт прирост TTFB до 50% и изоляцию фронтенда, но требует более сложной инфраструктуры. Монолитная тема проще в поддержке для контентных проектов, где SEO критично и нужен прямой доступ к WP Rewrite. Мы помогаем определить оптимальный вариант на этапе аудита. Переход на headless улучшает LCP в 2.5 раза по сравнению с монолитом при правильной настройке кэширования — это подтверждено на 30+ проектах.

Стек и подходы в WordPress разработке

Разработка тем. Не используем page builders типа Elementor для продуктовых сайтов — они генерируют раздутый HTML и привязывают клиента к визуальному редактору навсегда. Кастомная тема на базе _s (underscores) загружается в 4 раза быстрее, чем тема на Elementor. Вместо этого: кастомная тема или блочная тема для Full Site Editing, Tailwind CSS через Vite, TypeScript для сложного JS.

Gutenberg и блочная разработка. Начиная с WordPress 5.0, Gutenberg — это не редактор, а платформа. Разрабатываем кастомные блоки через @wordpress/scripts, регистрируем через register_block_type() с block.json. Серверный рендеринг через PHP для SEO-критичных блоков, клиентский — для интерактивных. Inner Blocks для составных компонентов.

REST API и headless. WordPres как headless CMS через WP REST API v2 или WPGraphQL. Типичная схема: WordPress на поддомене cms.example.com, Next.js фронтенд на основном домене. ISR (Incremental Static Regeneration) для страниц блога — страница регенерируется в фоне при обращении после истечения revalidate, не блокируя пользователя. Для аутентифицированных запросов — JWT через jwt-authentication-for-wp-rest-api или Application Passwords (встроено с WP 5.6). Подробнее о REST API — Wikipedia.

WooCommerce. Расширяем через хуки и фильтры — никогда не правим core-файлы. Кастомные типы продуктов через WC_Product extension. Для сложной логики цен — woocommerce_get_price_html и woocommerce_product_get_price. Payment gateways пишем с нуля, наследуя от WC_Payment_Gateway. Интеграция с 1С — через CommerceML или кастомный REST endpoint.

Производительность. Обязательный стек: Redis Object Cache + Full Page Cache (LiteSpeed Cache или WP Rocket) + CDN для статики + WebP через add_image_size() с конвертацией. Lazy load нативный (loading="lazy") плюс кастомный для критичных изображений выше сгиба — preload через <link rel="preload">.

Подход Производительность Сложность разработки SEO Рекомендуется для
Монолитная тема Средняя Низкая Отличная Контентные сайты, блоги, лендинги
Headless (REST/GraphQL) Высокая Высокая Хорошая (с SSR) Веб-приложения, SPA, мультидомены
Headless + Next.js (ISR) Очень высокая Средняя Отличная Каталоги, новостные порталы

Кейс из нашей практики: WooCommerce‑магазин, LCP 9:00 с → 1.8 с

Магазин электроники, 40 000 SKU, WooCommerce + кастомная тема. PageSpeed Insights: LCP 9.2 с, CLS 0.41, INP 680 мс.

Диагноз:

  • Hero-изображение 3.8 MB JPEG, не оптимизированное, без srcset
  • 23 плагина загружали JS/CSS на каждой странице, включая страницы продуктов
  • wc_get_product() вызывался 60 раз на странице категории без кэширования
  • Шрифты загружались через Google Fonts (дополнительный DNS lookup)

Что сделали:

  • Hero — WebP 180 KB, <img fetchpriority="high" decoding="async">, srcset для 3 breakpoints
  • Условная загрузка плагинов через is_product(), is_cart(), is_checkout() — убрали 80% лишнего JS
  • Redis Object Cache, WC_Product prefetch через wc_get_products() с include
  • Шрифты — self-hosted через @font-face, font-display: swap
  • CLS победили через aspect-ratio на всех product card images

Результат: LCP 1.8 с, CLS 0.04, INP 140 мс. Core Web Vitals — зелёные. Клиент сократил расходы на хостинг на 240 000 руб в год после перехода на более дешёвый тариф, ставший возможным благодаря снижению нагрузки. Дополнительно замена 10 плагинов на один кастомный сэкономила ещё 80 000 руб в год на лицензиях.

Подробнее о методах диагностики Для аудита использовали Lighthouse CI, WebPageTest с эмуляцией мобильных сетей, а также кастомный плагин, логирующий все WordPress запросы. Полный отчёт включает рекомендации по каждому компоненту.

Процесс работы

  1. Аудит и аналитика. Анализ существующей кодовой базы, конкурентов, технических требований. Для нового сайта — семантическое ядро, UX-прототипирование.
  2. Архитектура. Решаем: монолит или headless. Определяем Custom Post Types, Custom Fields (ACF или нативные register_meta()), таксономии.
  3. Разработка. Локальное окружение: Docker (nginx + php-fpm + MariaDB). Git с pre-commit хуками для PHP CS Fixer и ESLint. Деплой через WP-CLI + SSH или Buddy.works CI/CD.
  4. Тестирование. PHPUnit для кастомных плагинов. Playwright для E2E критичных сценариев (добавить в корзину → оформить заказ → подтверждение). Lighthouse CI в пайплайне — падаем, если Performance Score < 85.
  5. Деплой и поддержка. Staging через WP Stagecoach или ручной клон. Мониторинг — UptimeRobot + Sentry для PHP ошибок. Обновления плагинов — через WP-CLI в тестовой среде сначала.

Как провести аудит WordPress сайта за 5 шагов?

  1. Проверьте wp-config.php — включён ли WP_DEBUG и WP_DEBUG_LOG. В продакшене они должны быть выключены.
  2. Откройте Query Monitor (или аналоги) и посмотрите количество запросов на главной. Норма — менее 30.
  3. Запустите Lighthouse — обратите внимание на LCP, CLS, INP. Если LCP > 2.5 с, ищите блокирующие ресурсы.
  4. Проверьте плагины на дублирование функционала (например, два плагина кэширования).
  5. Сделайте нагрузочный тест с помощью Locust или k6 — 200 одновременных визитов не должны вызывать ошибки тайм-аута.

Что вы получите в результате

  • Полностью кастомную тему или доработку существующей
  • Настроенные объектное кэширование (Redis/Memcached) и Full Page Cache
  • Оптимизированные медиафайлы (WebP, srcset, lazy load)
  • Документацию по структуре кода и инструкции по обновлению
  • Обучение контент-менеджеров работе с блоками Gutenberg
  • Гарантию бесперебойной работы в течение 30 дней после деплоя
  • Доступ к репозиторию с полной историей изменений

Ориентиры по срокам

Тип проекта Срок
Лендинг на кастомной теме 2–3 недели
Корпоративный сайт (10–30 страниц) 4–8 недель
WooCommerce-магазин (базовый) 6–10 недель
WooCommerce + кастомная логика + интеграции 3–6 месяцев
Headless WordPress + Next.js 8–16 недель

Стоимость рассчитывается индивидуально после аудита требований. Получите консультацию для предварительной оценки.

Типичные ошибки при разработке на WordPress

  • Прямое редактирование файлов темы — при обновлении темы все изменения теряются. Всегда используйте дочернюю тему или полностью кастомную.
  • update_post_meta() в цикле — каждый вызов отдельный UPDATE. Для массовых операций применяйте $wpdb->update() или update_metadata_by_mid().
  • Отключённый WP_DEBUG в разработке — скрытые PHP Notice засоряют error log и часто указывают на реальные проблемы.
  • Хранение медиа в Git — wp-content/uploads в .gitignore, синхронизация через WP-CLI media import или rsync.
  • Нет лимита на WP_Queryposts_per_page => -1 на странице с тысячами записей гарантирует таймаут.

Почему стоит доверить WordPress разработку профессионалам?

Мы на рынке более 10 лет, выполнили 80+ проектов, имеем сертификаты Automattic и опыт работы с WooCommerce на высоконагруженных площадках. Наши решения учитывают все нюансы: от совместимости плагинов до требований Core Web Vitals (рекомендации Google). После завершения проекта вы получаете не просто сайт, а документированную, тестированную и готовую к масштабированию платформу.

Для консультации и оценки вашего проекта — пишите или звоните. Мы отвечаем в течение часа в рабочее время. Закажите аудит уже сегодня.