Блог

🎯 Поздравляем: ваш плагин WordPress только что стал функцией «ядра»

Leonardo Losoviz
Автор: Leonardo Losoviz ·

Поскольку WP REST API уже входит в ядро WordPress, я нередко советовал избегать GraphQL и просто использовать REST API для передачи данных в плагины WordPress и блоки Gutenberg.

Но теперь всё изменилось. WordPress 6.5 только что вышел, и в него включена потрясающая новая функция: Plugin Dependencies.

Благодаря Plugin Dependencies, любой плагин WordPress, доступный в директории плагинов, можно объявить зависимостью для нашего плагина, и WordPress установит эту зависимость прямо перед установкой нашего плагина.

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

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

Но когда требуемый плагин предоставляет «инструментарий» для другого плагина, а рассчитывать на то, что владелец сайта уже установил этот плагин (или вообще знает о его существовании), не приходится — результат может оказаться действительно значимым.

Именно такова ситуация с GraphQL и Gato GraphQL.

GraphQL становится функцией «ядра» в WordPress

GraphQL — это интерфейс для получения, изменения и повторного сохранения любых данных сайта WordPress. Любой плагин, которому необходимо работать с данными (а таких практически все), потенциально может использовать GraphQL для решения своих задач.

GraphQL — это «инструментарий». А Gato GraphQL — поставщик этого инструментария.

Объявив зависимость вашего плагина от Gato GraphQL, вы получаете GraphQL-сервер, немедленно готовый к использованию вашим плагином.

Например, вы можете использовать GraphQL для получения данных для блоков Gutenberg вашего плагина и избежать создания (и поддержки) REST-контроллеров.

Впервые разработчики плагинов могут рассматривать GraphQL как реальную альтернативу WP REST API.

Может ли зависимость плагина стать проблемой?

Поскольку плагин, установленный в качестве зависимости, будет виден в wp-admin, ничего не подозревающий владелец сайта вполне обоснованно может задаться вопросом: «Откуда это взялось? Меня взломали? Это спам? Что вообще происходит?»

Если владелец сайта будет раздражён, это станет серьёзной проблемой — ни один плагин не может позволить себе настраивать пользователей против себя (по крайней мере, пока они не поймут, что происходит, и не примут решение).

Эту ситуацию можно улучшить и даже полностью избежать. Например, применительно к Gato GraphQL в качестве зависимости: Gato GraphQL мог бы также иметь версию плагина Lite, которая просто устанавливает GraphQL-сервер только для внутреннего использования, без отображения в UI. (Ещё одна задача в мой список дел! 🤷🏻‍♂️)

Более важный вопрос для Gato GraphQL (и других плагинов тоже): станет ли новый сайт менее безопасным?

В частности для Gato GraphQL: будет ли публичный endpoint GraphQL раскрывать данные, доступные любому посетителю, что может непреднамеренно обнажить приватные данные?

Ответ — нет. Gato GraphQL по умолчанию не включает публичный единый endpoint, поэтому его можно устанавливать без опасений по поводу рисков безопасности.

Добавление Gato GraphQL как зависимости плагина

Давайте засучим рукава и поиграем с этой замечательной новой функцией.

Чтобы использовать GraphQL в своём плагине, необходимо объявить gatographql зависимостью плагина в заголовке плагина:

/**
 * Plugin Name: Blocks for cooking recipes
 * Requires Plugins: gatographql
 */

После этого ваш плагин может получать данные через внутренний endpoint blockEditor, доступный в wp-admin через JavaScript-константу GATOGRAPHQL_BLOCK_EDITOR_ADMIN_ENDPOINT, которая указывает на этот URL:

https://mysite.com/wp-admin/edit.php?page=gatographql&action=run_query&endpoint_group=blockEditor

Например, блок может получать данные с помощью такого JavaScript-кода:

(async function () {
  const data = {
    query: `
      query GetCookingRecipeBlockData($limit: Int) {
        posts(pagination: { limit: $limit }) {
          id
          title
          author {
            id
            name
          }
        }
      }
    `,
    variables: {
      limit: 3
    },
  };
 
  const response = await fetch(
    GATOGRAPHQL_BLOCK_EDITOR_ADMIN_ENDPOINT,
    {
      method: 'post',
      body: JSON.stringify(data),
      headers: {
        Accept: 'application/json',
        'Content-Type': 'application/json',
        'Content-Length': data.length,
      },
      credentials: 'include',
    }
  );
 
  /**
   * Execute the query, and await the response
   */
  const json = await response.json();
 
  /**
   * Check if the query produced errors, otherwise use the results
   */
  if (json.errors) {
    console.log(JSON.stringify(json.errors));
  } else {
    console.log(JSON.stringify(json.data));
  }
})();

Если вы хотите использовать вложенные мутации в своих GraphQL queries, вы также можете создать внутренний endpoint, эксклюзивный для вашего плагина, и настроить его соответствующим образом.


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

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