GraphQL в WordPress: руководство WPGraphQL и повышение скорости

Что такое GraphQL и почему он заменяет REST API

GraphQL – язык запросов, разработанный Facebook в 2015 году. В отличие от традиционного REST, где каждый эндпоинт возвращает фиксированный набор данных, GraphQL позволяет клиенту точно указать, какие поля нужны, и получить их одним запросом. Это снижает количество запросов, уменьшает объём передаваемых данных и упрощает работу с мобильными и SPA‑приложениями.

Основные отличия от REST

  • Один запрос → несколько ресурсов
  • Точная выборка полей (over‑ и under‑fetching исчезают)
  • Схема в виде типизированного графа, которую можно интроспектировать
  • Встроенная поддержка мутаций (создание/обновление/удаление)

Установка и настройка WPGraphQL

WPGraphQL – официальный плагин, добавляющий GraphQL‑слой в WordPress. Он полностью совместим с Gutenberg, ACF и большинством популярных плагинов.

Требования к серверу

Для стабильной работы плагина ваш хостинг должен поддерживать PHP ≥ 7.4 и иметь включённый json‑расширение. Если планируете использовать кеширование, рекомендуется установить htaccess‑ускорение.

Плагин и базовая конфигурация

  1. Перейдите в «Плагины → Добавить новый» и найдите WPGraphQL.
  2. Установите и активируйте плагин.
  3. В меню появится пункт «GraphQL». По умолчанию все публичные типы (posts, pages, users) уже доступны.

Для расширения схемы откройте functions.php вашей темы и добавьте пример ниже.

add_action( 'graphql_register_types', function() {
    register_graphql_object_type( 'Book', [
        'description' => __( 'Книга в библиотеке', 'my-textdomain' ),
        'fields'      => [
            'ID' => [
                'type'        => 'ID',
                'description' => __( 'Идентификатор книги', 'my-textdomain' ),
            ],
            'title' => [
                'type'        => 'String',
                'description' => __( 'Название книги', 'my-textdomain' ),
            ],
            'author' => [
                'type'        => 'String',
                'description' => __( 'Автор книги', 'my-textdomain' ),
            ],
        ],
    ] );
} );

Первые запросы: типы, поля, фильтры

После активации плагина перейдите по адресу /graphql (например, https://example.com/graphql) – откроется GraphiQL‑консоль, где можно писать запросы.

Пример простого запроса

{ 
  posts(where: {status: PUBLISHED}, first: 5) {
    nodes {
      id
      title
      excerpt
    }
  }
}

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

Мутации: создание и обновление контента

Мутации – это аналоги POST/PUT/PATCH в REST. WPGraphQL поставляется с набором базовых мутаций, а вы можете регистрировать свои.

Пример мутации создания поста

mutation CreatePost($title: String!, $content: String!) {
  createPost(input: {title: $title, content: $content, status: PUBLISH}) {
    post {
      id
      title
      status
    }
    success
    errors
  }
}

Переменные передаются в виде JSON:

{
  "title": "Новый пост через GraphQL",
  "content": "Контент, сформированный на лету."
}

Оптимизация производительности GraphQL в WordPress

Хотя GraphQL уже экономит трафик, без правильных настроек запросы могут нагружать базу данных.

Кеширование запросов

Самый простой способ – включить Wordfence и использовать встроенный кеш запросов в WPGraphQL. Для более продвинутого решения подключите wp-graphql-cache – плагин, сохраняющий ответы в объектный кеш.

Ограничение глубины и сложности

В graphql.php можно задать лимит:

add_filter( 'graphql_max_query_depth', function() { return 8; } );
add_filter( 'graphql_max_query_complexity', function() { return 2000; } );

Это защищает сайт от «глубоких» запросов, которые могут привести к DoS‑атакам.

Практика: интеграция с фронтендом React

Для SPA‑приложений чаще используют Apollo Client. Ниже – минимальная настройка.

Использование Apollo Client

import { ApolloClient, InMemoryCache, gql } from '@apollo/client';

const client = new ApolloClient({
  uri: 'https://example.com/graphql',
  cache: new InMemoryCache(),
});

client.query({
  query: gql`
    query GetPosts {
      posts(first: 10) {
        nodes { id title }
      }
    }
  `,
}).then(result => console.log(result.data));

С помощью Apollo вы получаете автоматическое кеширование на клиенте, а вместе с серверным кешем WPGraphQL достигаете скорости, сравнимой с нативным htaccess‑ускорением.

Дополнительные ресурсы

❓ Часто задаваемые вопросы

Можно ли отключить отдельные типы в WPGraphQL?

Да, через фильтр graphql_register_types вы можете удалить или скрыть любые типы, используя функцию unregister_graphql_type().

Как защитить GraphQL‑эндпоинт от неавторизованных запросов?

Используйте механизм ролей WordPress и добавьте проверку в хук graphql_before_resolve_field, возвращая ошибку, если пользователь не имеет нужных прав.

Влияет ли кеширование WPGraphQL на обновление контента?

Кеш инвалидируется автоматически при сохранении постов, но при кастомных типах может потребоваться вызвать wp_graphql_cache_invalidate() вручную.

Можно ли использовать WPGraphQL с мультисайтомом?

Да, плагин полностью поддерживает WordPress Multisite, однако каждый сайт имеет свою схему и кеш, что требует отдельной настройки.