🎯 Поздравляем: ваш плагин WordPress только что стал функцией «ядра»
Поскольку 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, эксклюзивный для вашего плагина, и настроить его соответствующим образом.