WP REST API и GraphQL: как сделать эффективную интеграцию

WordPress сегодня активно развивается в сторону предоставления гибких API для взаимодействия с внешними приложениями и фронтендами. Помимо классического WP REST API, все больше разработчиков обращают внимание на GraphQL — мощный инструмент для выборочной и эффективной работы с данными. В этой статье мы подробно рассмотрим, как грамотно интегрировать WP REST API и GraphQL в вашем проекте на WordPress, чтобы получать максимум гибкости и производительности.

Что такое WP REST API и GraphQL: основа для интеграции

WP REST API — это стандартный набор эндпоинтов, встроенных в ядро WordPress, который позволяет получать и изменять данные сайта по протоколу HTTP. Его преимущество — простота и широкая поддержка, но при этом он довольно ограничен в плане выборки данных и может создавать избыточные запросы.

GraphQL — это язык запросов и рантайм для API, который позволяет клиенту запрашивать ровно те данные, которые нужны, а не весь набор. Это дает экономию ресурсов и ускоряет работу фронтенда.

Интеграция этих двух технологий дает возможность использовать проверенные механизмы WordPress и одновременно получать гибкость GraphQL.

Плагины для реализации GraphQL в WordPress

Для добавления GraphQL в WordPress есть несколько популярных плагинов:

  • WPGraphQL — наиболее популярный плагин, который добавляет полноценный GraphQL сервер в WordPress. Позволяет работать с постами, таксономиями, пользователями и кастомными типами записей.
  • WPGraphQL JWT Authentication — расширение для добавления авторизации через JWT, что важно для защищенного доступа к API.
  • WPGraphQL Custom Post Type UI — автоматически регистрирует кастомные типы записей для GraphQL.

Все эти плагины можно установить из репозитория WordPress или скачать с WPSHOP.RU.

Как настроить WPGraphQL для вашего сайта

После установки плагина WPGraphQL достаточно перейти в раздел GraphQL» в админке WordPress и ознакомиться с интерфейсом. Для начала работы можно использовать встроенный GraphiQL IDE, позволяющий писать и тестировать запросы прямо в админке.

Пример запроса для получения списка постов с названием и датой публикации:

{ posts { nodes { title date } } }

Для расширения возможностей можно зарегистрировать кастомные поля и типы записей, чтобы они были доступны через GraphQL. Для этого добавим в functions.php следующий код:

function wpapi_register_custom_graphql_fields() {
  register_graphql_field( 'Post', 'customField', [
    'type' => 'String',
    'description' => 'Мое кастомное поле',
    'resolve' => function( $post ) {
      return get_post_meta( $post->ID, 'custom_field_key', true );
    }
  ]);
}
add_action( 'graphql_register_types', 'wpapi_register_custom_graphql_fields' );

Этот код добавляет в тип Post новое поле customField, которое подгружает метаданные из post meta.

Как использовать WP REST API и GraphQL вместе

В некоторых случаях целесообразно использовать оба API — REST для простых операций и GraphQL для сложных выборок.

Например, можно использовать WP REST API для аутентификации и CRUD-операций, а GraphQL — для получения сложных структур данных с фильтрацией и пагинацией.

Пример комбинированного запроса: сначала аутентифицируемся через REST API, получаем токен, затем делаем запрос GraphQL с передачей токена в заголовках.

const token = await fetch('/wp-json/jwt-auth/v1/token', {
  method: 'POST',
  body: JSON.stringify({ username: 'user', password: 'pass' }),
  headers: { 'Content-Type': 'application/json' }
}).then(res => res.json()).then(data => data.token);

const query = `{ posts { nodes { title content } } }`;

const response = await fetch('/graphql', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
    'Authorization': `Bearer ${token}`
  },
  body: JSON.stringify({ query })
});

const data = await response.json();

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

При активном использовании API важно не допустить перегрузки сервера и снизить время ответа.

Рекомендации:

  • Кэширование запросов. Используйте плагины, например Clearfy Pro (ссылка), которые позволяют кэшировать ответы REST и GraphQL.
  • Ограничение глубины запросов GraphQL. Чтобы избежать тяжелых запросов, задавайте лимиты на глубину и количество полей.
  • Использование пагинации. Разбивайте выборки на страницы, чтобы снизить нагрузку.
  • Защита API. Добавьте авторизацию и проверку прав, например, с помощью WPGraphQL JWT Authentication, чтобы предотвратить неавторизованный доступ.

Практический пример: создание кастомного GraphQL эндпоинта с фильтрацией

Допустим, нужно получить список продуктов с фильтрацией по цене и категории. Для этого регистрируем новый запрос в GraphQL:

function wpapi_register_custom_query() {
  register_graphql_field( 'RootQuery', 'filteredProducts', [
    'type' => ['list_of' => 'Product'],
    'args' => [
      'minPrice' => ['type' => 'Float'],
      'maxPrice' => ['type' => 'Float'],
      'categoryId' => ['type' => 'ID'],
    ],
    'resolve' => function( $root, $args ) {
      $meta_query = [];
      if (isset($args['minPrice'])) {
        $meta_query[] = [
          'key' => 'price',
          'value' => $args['minPrice'],
          'type' => 'NUMERIC',
          'compare' => '>='
        ];
      }
      if (isset($args['maxPrice'])) {
        $meta_query[] = [
          'key' => 'price',
          'value' => $args['maxPrice'],
          'type' => 'NUMERIC',
          'compare' => '<='
        ];
      }
      $tax_query = [];
      if (isset($args['categoryId'])) {
        $tax_query[] = [
          'taxonomy' => 'product_cat',
          'field' => 'term_id',
          'terms' => $args['categoryId'],
        ];
      }
      $query = new WP_Query([
        'post_type' => 'product',
        'meta_query' => $meta_query,
        'tax_query' => $tax_query
      ]);
      return $query->posts;
    }
  ]);
}
add_action( 'graphql_register_types', 'wpapi_register_custom_query' );

Такой запрос позволит гибко получать продукты по заданным параметрам прямо из GraphQL.

Заключение

Интеграция WP REST API и GraphQL в WordPress — отличный способ повысить гибкость и эффективность взаимодействия фронтенда и бэкенда. С помощью плагинов WPGraphQL и дополнительных расширений можно легко настроить мощный API, подходящий под конкретные задачи.

Не забывайте про оптимизацию, кэширование и защиту API, чтобы обеспечить стабильную работу сайта при высокой нагрузке.

Подробнее о полезных инструментах и плагинах для WordPress смотрите на WPSHOP.RU.

Шаблоны для WP Плагины для WP