🚀 Выпущена новая версия 0.8 Gato GraphQL!
Версия 0.8 Gato GraphQL теперь доступна для скачивания! 🎉
Это огромный релиз, сосредоточенный на трёх областях:
- Рефакторинг кодовой базы для поддержки расширений
- Более полное соответствие спецификации GraphQL
- Завершение схемы GraphQL
Кроме того, он поддерживает новый WordPress 5.8 и содержит множество исправлений ошибок и улучшений.
Обратите внимание, что этот релиз содержит breaking changes!
Ниже представлены заметки к релизу. Быстрые ссылки:
- Поддержка WordPress 5.8
- Улучшенная поддержка PHP 8.0
- Упрощённая кодовая база с использованием container services повсюду
- Кэш сохраняется в
wp-content - Введён GraphQL-endpoint с «фиксированной схемой» для работы редактора WordPress
- Расширенная поддержка типов полей в схеме
- Input coercion: принятие одного значения там, где ожидается список
- Дополнительное завершение схемы WordPress
- Добавлены «unrestricted» поля администратора в схему GraphQL
- Введён скалярный тип
AnyScalar - Settings в расширенном формате
- Breaking changes
- Предстоящий Roadmap
- Возникли проблемы?
Поддержка WordPress 5.8
WordPress 5.8 объявляет устаревшими несколько filter hooks, включая allowed_block_types и block_categories (используемые этим плагином).
Затронутые hooks были заменены:
allowed_block_types=>allowed_block_types_allblock_categories=>block_categories_all
Улучшенная поддержка PHP 8.0
Этот релиз исправляет ряд проблем при использовании PHP 8.0.
Упрощённая кодовая база с использованием container services повсюду
Кодовая база GraphQL-сервера была рефакторизована: теперь используется service container для регистрации всех элементов схемы (type resolvers, field resolvers, interface resolvers, custom scalar resolvers и другие).
Это важная веха, вводящая единый подход к разработке плагина и его расширений, значительно упрощающая их код и документацию.
Наконец можно приступить к написанию документации о создании пользовательских расширений для Gato GraphQL. Работа над ней начнётся в ближайшее время и будет опубликована в разделе руководств.
Кэш сохраняется в wp-content
Плагин кэширует результаты на диск для оптимизации производительности.
Ранее кэшированные файлы хранились в системной папке, скрытой от администратора. Теперь они хранятся в wp-content/graphql-api/cache/.
Введён GraphQL-endpoint с «фиксированной схемой» для работы редактора WordPress
Теперь в wp-admin есть 2 endpoint'а:
GRAPHQL_API_ADMIN_CONFIGURABLESCHEMA_ENDPOINTGRAPHQL_API_ADMIN_FIXEDSCHEMA_ENDPOINT
С GRAPHQL_API_ADMIN_CONFIGURABLESCHEMA_ENDPOINT схема GraphQL изменяется в соответствии с пользовательскими настройками: включено ли пространство имён, включены ли типы/директивы и т.д.
С GRAPHQL_API_ADMIN_FIXEDSCHEMA_ENDPOINT схема GraphQL не изменяется пользовательскими настройками и всегда отображает все типы, поля и директивы, включая «unrestricted» поля администратора.
Фиксированный endpoint позволяет блокам Gutenberg запрашивать все поля независимо от того, включены ли они пользователем, с неограниченным доступом.
Расширенная поддержка типов полей в схеме
Поддержка списков как типов полей расширена; теперь поддерживаются следующие возможности:
- Списки с non-null элементами:
[String!] - Списки списков:
[[String]] - Любые их комбинации:
[[String!]!]
Input coercion: принятие одного значения там, где ожидается список
Теперь можно передать одно значение в GraphQL-запросе там, где ожидается список, как определено в спецификации GraphQL.
Например, эти queries теперь эквивалентны:
query InputSingleValue {
posts(filter: { ids: 1 }) {
title
}
}
query InputListOfSingleItem {
posts(filter: { ids: [1] }) {
title
}
}Дополнительное завершение схемы WordPress
В схему GraphQL добавлены дополнительные сущности из модели данных WordPress:

Рассмотрим, какие новые элементы были добавлены.
Категории
Категории отображены через новый тип PostCategory и новые поля:
Root.postCategories: [PostCategory]Root.postCategory: PostCategoryPost.categories: [PostCategory]
Например, этот запрос получает категории для записей:
{
posts {
id
title
categories {
id
name
url
}
}
}Также добавлено поле mutation для назначения категорий записям:
MutationRoot.setCategoriesOnPost: Post
И добавлен input categories к полям mutation для записей:
MutationRoot.createPostMutationRoot.updatePostPost.update(когда включены nested mutations)
Meta
Теперь можно запрашивать значения meta для custom post, пользователя, комментария и таксономии через новые поля:
Post.metaValue: AnyScalarPost.metaValues: [AnyScalar]User.metaValue: AnyScalarUser.metaValues: [AnyScalar]Comment.metaValue: AnyScalarComment.metaValues: [AnyScalar]PostCategory.metaValue: AnyScalarPostCategory.metaValues: [AnyScalar]PostTag.metaValue: AnyScalarPostTag.metaValues: [AnyScalar]
Например, этот запрос получает meta last_name для пользователей:
{
users {
id
lastName: metaValue(key: "last_name")
}
}Поскольку значения meta могут быть чем угодно (string, integer, float или boolean), они отображены через вновь введённый универсальный скалярный тип AnyScalar.
Значения meta могут быть публичными или приватными. Какие meta-ключи можно запрашивать, необходимо явно настроить на странице настроек:

По умолчанию список разрешённых meta-ключей пуст.
Меню
Меню отображены через новый тип Menu и новое поле Root.menu.
{
menu(by: { id: 176 }) {
itemDataEntries
}
}Settings
Настройки сайта (хранящиеся в таблице wp_options) можно запрашивать через новое поле Root.option: AnyScalar.
Например, этот запрос получает название сайта:
{
siteName: optionValue(name: "blogname")
}Какие опции могут быть доступны, необходимо явно настроить на странице настроек:

По умолчанию можно запрашивать только следующие опции:
"home""blogname""blogdescription"
User posts
Авторизованные пользователи могут получать свои собственные записи для любого статуса (publish, pending, draft или trash) через новые поля:
Root.myPosts: [Post]Root.myPostCount: IntRoot.myPost: Post
Например, теперь можно выполнить этот запрос:
# Log yourself in first
mutation LogIn {
loginUser(usernameOrEmail: "test", password: "pass") {
id
name
}
}
# Then retrieve your posts
query GetMyPosts {
myPosts {
id
title
url
status
author {
name
}
}
}Добавлены «unrestricted» поля администратора в схему GraphQL
Схема GraphQL должна соблюдать баланс между публичными и приватными полями, чтобы не раскрывать конфиденциальную информацию в публичном API.
Новый модуль Schema for the Admin добавляет «unrestricted» поля администратора в схему GraphQL, которые могут раскрывать приватные данные:
Root:
unrestrictedPostunrestrictedPostsunrestrictedPostCountunrestrictedCustomPostunrestrictedCustomPostsunrestrictedCustomPostCountunrestrictedGenericCustomPostunrestrictedGenericCustomPostsunrestrictedGenericCustomPostCountunrestrictedPageunrestrictedPagesunrestrictedPageCountunrestrictedUsersrolescapabilities
User:
unrestrictedPostsunrestrictedPostCountunrestrictedCustomPostsunrestrictedCustomPostCountrolescapabilities
PostCategory:
unrestrictedPostsunrestrictedPostCount
PostTag:
unrestrictedPostsunrestrictedPostCount
Например, для доступа к данным записей сейчас есть поле posts, которое раскрывает только публичные данные, возвращая опубликованные записи.
Теперь также можно получить данные записей через поле unrestrictedPosts, которое раскрывает публичные и приватные данные, возвращая записи с любым статусом ("publish", "draft", "pending", "trash").
{
unrestrictedPosts(status: [draft, pending]) {
id
title
status
author {
id
name
}
}
}Введён скалярный тип AnyScalar
Скалярный тип AnyScalar представляет любой из встроенных скаляров (String, Int, Boolean, Float или ID).
Он используется во вновь введённых полях option и metaValue(s), поскольку заранее неизвестен тип возвращаемых данных, а объединение скалярных типов ещё не поддерживается спецификацией GraphQL.
Settings в расширенном формате
Опции на странице Settings разделены по вкладкам. Начиная с v0.8, их также можно просматривать все вместе на одной длинной странице.
Чтобы включить это поведение, снимите флажок "Have all options in this Settings page be organized under tabs, one tab per module." в Settings и нажмите "Save Changes":

После этого все settings будут отображаться вместе в расширенном формате:

Breaking changes
Релиз v0.8 вносит breaking changes по сравнению с предыдущей версией.
Configuration breaking changes
Для следующих CPT был перестроен блок «Options»:
- Schema Configurations
- Custom Endpoints
- Persisted Queries
В предыдущей v0.7 единый блок Options для этих сущностей содержал множество элементов конфигурации. Начиная с v0.8, этот блок разделён на несколько независимых блоков, каждый из которых содержит свою конфигурацию.
Например, в v0.7 (помимо включения/отключения endpoint'а) блок Custom Endpoint Options позволял настраивать клиенты GraphiQL и Interactive Schema:

Начиная с v0.8, эта конфигурация добавляется через блоки GraphiQL и Interactive Schema:

Конфигурация, хранящаяся в блоках Options для всех 3 CPT, не переносится автоматически в новый формат. Поэтому перед обновлением до v0.8 запишите сохранённую конфигурацию и воспроизведите её после обновления до новой версии.
Приносим извинения за неудобства.
Кроме того, необходимо нажать кнопку «Reset the template» в редакторе WordPress для всех записей 3 CPT.

Удалённые нестандартные директивы
Нестандартные директивы удалены из плагина:
@default@removeIfNull@export
Удалённые модули
Следующие модули удалены из плагина:
- Field Deprecation
- Configuration Cache
- Schema Cache
- Multiple Query Execution
- Proactive Feedback
- Schema Editing Access
- Embeddable fields
Предстоящий Roadmap
Теперь, когда v0.8 выпущен, можно начать планировать дальнейший путь.
Текущий план выглядит следующим образом:
Выпустить v0.9 в сентябре 2021 года, включая:
- Custom scalars
- Обновлённую схему GraphQL с использованием custom scalars там, где это уместно (напр.:
Post.dateбудет возвращать типDateвместоString) - Дополнительные улучшения для поддержки расширений
А затем выпустить v1.0 в конце года или в начале 2022 года, включая:
- Демонстрацию плагина-расширения
- Полные руководства по документированию создания расширений
- Запуск плагина Gato GraphQL на
wp.org
Чтобы получать уведомления о текущем состоянии, вы можете подписаться на рассылку.
Возникли проблемы?
Если у вас возникли какие-либо проблемы при установке или запуске v0.8, пожалуйста, создайте issue в репозитории.