GraphQL-серверы для WordPress

Gato GraphQL vs WPGraphQL

Сравнение Gato GraphQL и WPGraphQL

Gato GraphQL vs WPGraphQL
plus image
Gato GraphQL vs WPGraphQL

Если вам нужно просто создать headless-сайт на WordPress и развернуть его как статический, и вы сейчас используете WPGraphQL, переход на Gato GraphQL не даст никакой разницы.

В остальных случаях переход на Gato GraphQL даёт множество преимуществ. Ниже перечислены возможности Gato GraphQL + всех расширений, которых нет в WPGraphQL.

Сводная таблица

ФункцияGato GraphQLWPGraphQL
Проблема N+1Не возникает благодаря архитектурному решениюМожет возникнуть, если не обработать; разработчик должен об этом помнить
Безопасность: отключение endpointМожно полностью отключить единый endpoint с помощью persisted queries (PRO)Не предусмотрено
Контроль доступаВалидация поле за полем с ролями/capabilities/IP через UI (PRO)Не на уровне полей, менее гранулярно
Управление кешемmax-age рассчитывается автоматически для queries (PRO)Автоматического управления кешем нет
Пользовательские endpointsНесколько endpoints, защищённых паролем/настраиваемых; поддерживается иерархия endpoints (PRO)Один endpoint, ограниченная настройка
Массовые обновления и поиск/заменаМассовое удаление, назначение тегов, замена (с regex) через GraphQL (PRO)Не предусмотрено
Пользовательские/экспериментальные возможности GraphQLВложенные мутации, namespace схемы, oneOf input objectВ основном стандартная спецификация GraphQL
Multiple Query Execution (компонуемость)Несколько queries в одном документе, совместное использование состояния через @exportПакетные queries (несколько за запрос), но без общего состояния
Внутренние/приватные endpointsПриватный endpoint только для backend/PHP, не доступный пользователям (PRO)Не предусмотрено
Расширенная мутация данныхПолучение, изменение и сохранение данных в одном документе (PRO)Не поддерживается
Синхронизация и распространение контентаИмпорт/экспорт через GraphQL, RSS, CSV, REST API (PRO)Не предусмотрено
Интеграция с веб-сервисамиИсходящие/входящие вызовы API и вебхуки (PRO)Не поддерживается
Автоматизация (хуки/рабочие процессы)GraphQL как автоматизация рабочих процессов (PRO/редактор UI)Не предусмотрено
Удобство использования (интеграция UI)Широкие возможности UI для создания/администрирования GraphQL queriesБолее базовый интерфейс администратора
Batching/компонуемостьКомпоновка полей/директив, повторно используемая логика resolver (PRO)Не поддерживается
Multiple Query ExecutionПоддерживается, с общим состоянием и зависимостямиПоддерживается, без общего состояния
Стандартное headless/статическое использованиеОба одинаково пригодныОба одинаково пригодны

Обозначения:

  • (PRO): Функция требует платной/pro версии или расширений Gato GraphQL.

Краткое резюме:

  • Gato GraphQL предлагает значительно больше возможностей для продвинутой разработки, автоматизации и безопасности
  • Оба плагина равнозначны для базовой статической/headless установки WordPress
  • Расширенные функции Gato GraphQL сосредоточены на:
    • Детальном контроле
    • Автоматизации рабочих процессов
    • Богатых интеграциях
    • Современных экспериментальных возможностях GraphQL

Удобство разработки

Разработчикам не нужно беспокоиться о проблеме queries «n+1»: благодаря архитектурному решению GraphQL-сервера она просто не возникает.

Безопасность

При использовании persisted queries для предоставления предопределённых данных можно полностью отключить единый endpoint GraphQL, чтобы он был недоступен даже аутентифицированным пользователям.

Редактор persisted queries
Редактор persisted queries

Контроль доступа

Можно настроить доступ к данным только для авторизованных пользователей, пользователей с определённой ролью или capability, или посетителей из определённого диапазона IP, на уровне отдельных полей (PRO).

Редактор Access Control List
Редактор Access Control List

Управление кешем

При кешировании ответа GraphQL с помощью стандартного HTTP-кеширования заголовок max-age рассчитывается автоматически на основе всех полей, присутствующих в GraphQL query (PRO).

Редактор Cache Control List

Настройка и управление endpoints

Можно создавать несколько пользовательских endpoints, каждый из которых настроен для конкретного клиента или приложения, защитив их паролем.

Им можно назначать пользовательские категории и задавать иерархию (например, /graphql/customers/some-customer и /graphql/customers/another-customer).

Пользовательский endpoint, защищённый паролем
Пользовательский endpoint, защищённый паролем

Массовые обновления

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

Также можно искать и заменять строку в сотнях записей — например, заменить старый домен новым, в том числе с использованием regex (PRO).

Пользовательские возможности GraphQL

Вы получите доступ к новым возможностям GraphQL, предложенным для спецификации, но ещё не выпущенным, включая вложенные мутации, namespace схемы и Input Object «oneOf».

Интерактивная схема с namespace
Интерактивная схема с namespace

Multiple Query Execution

WPGraphQL позволяет выполнять пакетные queries, при которых несколько GraphQL queries разрешаются в рамках одного HTTP-запроса.

Gato GraphQL предоставляет Multiple Query Execution, при котором один документ GraphQL может выполнять несколько операций.

Multiple Query Execution — это улучшение по сравнению с пакетным выполнением queries, поскольку операции могут обмениваться состоянием с помощью директивы @export.

Например, чтобы продублировать запись, операция query получает данные записи и передаёт их операции mutation, которая создаёт новую запись на их основе:

query GetPostAndExportData($postId: ID!)
{
  post(by: { id: $postId }, status: any) {
    author {
      id @export(as: "authorID")
    }
    categories {
      id @export(as: "categoryIDs", type: LIST)
    }
    rawContent @export(as: "rawContent")
    rawExcerpt @export(as: "excerpt")
    featuredImage {
      id @export(as: "featuredImageID")
    }
    tags {
      id @export(as: "tagIDs", type: LIST)
    }
    rawTitle @export(as: "title")
  }
}
 
mutation DuplicatePost
  @depends(on: "GetPostAndExportData")
{
  createPost(input: {
    status: draft,
    authorBy: {
      id: $authorID
    },
    categoriesBy: {
      ids: $categoryIDs
    },
    contentAs: {
      html: $rawContent
    },
    excerpt: $excerpt
    featuredImageBy: {
      id: $featuredImageID
    },
    tagsBy: {
      ids: $tagIDs
    },
    title: $title
  }) {
    postID
  }
}

Компонуемость

Вы сможете компоновать поля, при этом значение одного поля может передаваться как входные данные другого поля в той же query, что позволяет базовому набору resolver-ов полей охватить неограниченное количество сценариев использования (PRO).

Например, вместо создания поля Post.hasExcerpt можно применить поле _notEmpty к Post.excerpt и получить то же значение:

query {
  post(by: { id: 1 }) {
    excerpt 
    hasExcerpt: _notEmpty(value: $__excerpt)
  }
}

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

Например, следующая query переводит названия категорий записи на другой язык:

query {
  post(by: { id: 1 }) {
    title
    categoryNames
    frenchCategoryNames: categoryNames
      @underEachArrayItem
        @strTranslate(
          from: "en",
          to: "fr"
        )
  }
}

Доступность GraphQL-сервера

Можно предоставлять приватные endpoints для блоков Gutenberg. А также обращаться к приватному GraphQL-серверу, чтобы получать данные для приложения через PHP-код, не создавая публичных endpoints (PRO).

Универсальность при мутации данных

Можно использовать GraphQL для получения, изменения и повторного сохранения контента сайта — всё в рамках одного документа GraphQL (PRO).

Например, можно получить все блоки Gutenberg в записи, извлечь их свойства, перевести эти строки через Google Translate API, вставить строки обратно в блок и сохранить запись.

Синхронизация и распространение контента

Можно использовать GraphQL для импорта записей с другого сайта WordPress, из RSS-ленты, из CSV или из любого REST или GraphQL API (PRO).

Можно экспортировать контент на другой сайт WordPress и сохранять его в формате JSON и CSV (PRO).

Взаимодействие с веб-сервисами

Можно вызывать API любого внешнего сервиса через HTTP-клиент (PRO). Например, подписывать пользователей WordPress на список рассылки Mailchimp.

А также получать и обрабатывать входящие данные от любого сервиса через выделенный вебхук (PRO). Например, можно перехватывать email-адреса подписчиков, зарегистрированных на sandbox-сайте InstaWP, и автоматически отправлять их в Mailchimp.

Автоматизация

Можно использовать GraphQL для автоматизации задач и рабочих процессов с контентом (PRO).

Например, при создании новой записи (событие через хук draft_post) можно выполнить persisted query, которая проверяет, есть ли у записи миниатюра, и если нет — генерирует изображение, вызывая Stable Diffusion API, сжимает его через TinyPng и вставляет в качестве избранного изображения записи.

Редактор правил автоматизации
Редактор правил автоматизации

Удобство использования

Все эти дополнительные сценарии использования можно реализовать прямо в wp-admin, задавая GraphQL query через пользовательский интерфейс, без необходимости разворачивать PHP-код.

Подпишитесь на нашу рассылку

Будьте в курсе всех обновлений Gato GraphQL.