🥳 Gato GraphQL v0.9 đã được phát hành!
Sau gần 1,5 năm phát triển và hơn 16.000 commit, một phiên bản mới của Gato GraphQL đã chính thức được phát hành! 🥳
Phiên bản 0.9 là bản phát hành lớn nhất trong lịch sử của plugin. Đây là changelog, và đây là mô tả đầy đủ về tất cả các tính năng mới:
github.com/GatoGraphQL/GatoGraphQL/releases/tag/0.9.3
Tài liệu này khá dài (hơn 40 phút đọc!), vì vậy dưới đây là TL;DR với những thay đổi quan trọng nhất.
Hoàn thiện đáng kể GraphQL Schema
Mô hình dữ liệu của WordPress đã được ánh xạ đáng kể vào GraphQL schema.

Trong số những cải tiến khác, schema có những cải tiến sau:
- Truy vấn dữ liệu từ bất kỳ CPT nào, bao gồm từ bất kỳ theme và plugin nào
- Ánh xạ các taxonomy tùy chỉnh (tags và categories)
- Tạo và trả về các kiểu GraphQL phù hợp hơn (ví dụ:
HTML,URL,DateTime) - Tổ chức các đối số field thông qua input objects
- Sử dụng oneof input objects để chọn một entity bằng các thuộc tính khác nhau (ví dụ:
id,slug) - Trả về mutation payloads
- Truy vấn các cài đặt (từ
wp_options) và các giá trị meta (cho posts, users, comments và taxonomies)
Custom scalars
Hỗ trợ cho các kiểu scalar tùy chỉnh đã được thêm vào GraphQL server. Custom scalars cho phép bạn biểu diễn dữ liệu tốt hơn, dù để nhận input thông qua đối số field hay in một output tùy chỉnh trong response.
Một số kiểu custom scalar tiêu chuẩn đã được triển khai, sẵn sàng để sử dụng trong GraphQL schema của bạn:
DateDateTimeEmailHTMLURLURLAbsolutePath
Custom enums
Các kiểu enum tùy chỉnh hiện đã được hỗ trợ. Enums là một loại scalar đặc biệt bị giới hạn ở một tập hợp các giá trị được phép cụ thể. Điều này cho phép bạn:
- Xác thực rằng bất kỳ đối số nào của kiểu này đều là một trong các giá trị được phép
- Truyền đạt qua hệ thống kiểu rằng một field sẽ luôn là một trong một tập hợp hữu hạn các giá trị
Một số kiểu enum đã được triển khai và sử dụng khi phù hợp trong GraphQL schema, bao gồm:
CommentOrderByEnumCommentStatusEnumCommentTypeEnumCustomPostOrderByEnumCustomPostStatusEnumMediaItemOrderByEnumMenuOrderByEnumTaxonomyOrderByEnumUserOrderByEnum
Input Objects
GraphQL server hiện cũng hỗ trợ các input types, và bạn có thể thêm các input objects của riêng mình vào GraphQL schema. Input objects cho phép bạn truyền các đối tượng phức tạp làm input cho các fields, điều này đặc biệt hữu ích cho mutations.
Một số input objects đã được thêm vào schema ở những nơi phù hợp. Ví dụ, các fields để truy vấn dữ liệu (chẳng hạn như posts, users, comments, v.v.) nhận các input objects phức tạp dưới các đối số field filter, sort và pagination, và các fields để thay đổi dữ liệu (chẳng hạn như createPost, addCommentToCustomPost, v.v.) nhận một input object dưới đối số field input.
Oneof Input Objects
"Oneof" input object là một loại input object đặc biệt, trong đó chính xác một trong các input fields phải được cung cấp làm input, nếu không sẽ trả về lỗi xác thực. Hành vi này giới thiệu tính đa hình cho các inputs.
Ví dụ, field Root.post hiện nhận đối số field by, là một oneof input object cho phép truy xuất post thông qua các thuộc tính khác nhau, chẳng hạn như theo id hoặc theo slug:
{
postByID: post(by: {
id: 1
}) {
id
title
}
postBySlug: post(by: {
slug: "hello-world"
}) {
id
title
}
}Lợi ích là một field duy nhất có thể được sử dụng để giải quyết các trường hợp sử dụng khác nhau, vì vậy chúng ta có thể tránh tạo một field khác nhau cho mỗi trường hợp sử dụng (chẳng hạn như postByID, postBySlug, v.v.), từ đó làm cho GraphQL schema gọn gàng và thanh lịch hơn.
Một số Oneof Input Objects đã được triển khai:
Root.customPost(by:)Root.mediaItem(by:)Root.menu(by:)Root.page(by:)Root.postCategory(by:)Root.postTag(by:)Root.post(by:)Root.user(by:)
Operation Directives
Các operations GraphQL (tức là các operations query và mutation) hiện cũng có thể nhận directives.
Giới hạn Directives cho các kiểu cụ thể
Các (field) directives có thể bị giới hạn để chỉ áp dụng cho các fields của một số kiểu cụ thể. Ví dụ, directive @strUpperCase chuyển đổi giá trị field thành chữ hoa chỉ có ý nghĩa trên các fields String, không phải trên Int hoặc Float hoặc Boolean. Giới hạn này hiện có thể được khai báo trong directive resolver.
In đường dẫn đầy đủ đến node của GraphQL query gây ra lỗi
Response hiện chứa đường dẫn đầy đủ đến các nodes trong GraphQL query trả về lỗi (dưới mục extensions.path), giúp dễ dàng tìm ra nguồn gốc của vấn đề hơn.
Ví dụ, trong query sau, directive @nonExisting không tồn tại:
query {
myField @nonExisting
}Response như sau:
{
"errors": [
{
"message": "There is no directive with name 'nonExisting'",
"locations": [
{
"line": 2,
"column": 7
}
],
"extensions": {
"type": "QueryRoot",
"field": "myField @nonExisting",
"path": [
"@nonExisting",
"myField @nonExisting",
"query { ... }"
],
"code": "PoP\\ComponentModel\\e20"
}
}
],
"data": {
"id": "root"
}
}Bật cài đặt mặc định không an toàn
Gato GraphQL cung cấp các cài đặt mặc định an toàn:
- Endpoint đơn bị vô hiệu hóa
- Các phần tử dữ liệu "nhạy cảm" trong GraphQL schema (chẳng hạn như
User.roles, hoặc lọc posts theostatus) không được hiển thị - Chỉ một số ít tùy chọn cài đặt và meta keys (cho posts, users, v.v.) có thể được truy vấn
- Số lượng entities có thể được truy vấn cùng một lúc bị giới hạn (cho posts, users, v.v.)
Các cài đặt mặc định an toàn này cần thiết để bảo mật các trang web "live", ngăn chặn các cuộc tấn công độc hại. Tuy nhiên, chúng không cần thiết khi xây dựng các trang web "tĩnh", nơi trang web WordPress không dễ bị tấn công (chẳng hạn như khi đó là một trang web phát triển trên laptop, nằm sau firewall an toàn, hoặc không được tiếp xúc với Internet nói chung).
Bắt đầu từ v0.9, chúng ta có thể bật các giá trị mặc định không an toàn bằng cách thêm vào wp-config.php:
define( 'GRAPHQL_API_ENABLE_UNSAFE_DEFAULTS', true );Ngoài ra, chúng ta có thể định nghĩa cùng một key/value này như một biến môi trường.
Khi bật các giá trị mặc định không an toàn, các cài đặt mặc định của plugin được chuyển đổi như sau:
- Endpoint đơn được bật
- Các phần tử dữ liệu "nhạy cảm" được hiển thị trong GraphQL schema
- Tất cả các tùy chọn cài đặt và meta keys có thể được truy vấn
- Số lượng entities có thể được truy vấn cùng một lúc là không giới hạn
Tổ chức Custom Endpoints và Persisted Queries theo danh mục
Khi tạo một Custom Endpoint hoặc Persisted Query, chúng ta có thể thêm "GraphQL endpoint category" vào đó, để tổ chức tất cả các endpoints của mình:

Ví dụ, chúng ta có thể tạo các danh mục để quản lý endpoints theo client, ứng dụng, hoặc bất kỳ thông tin cần thiết nào khác:

Trong danh sách Custom Endpoints và Persisted Queries, chúng ta có thể xem các danh mục của chúng và, khi nhấp vào bất kỳ liên kết danh mục nào, hoặc sử dụng bộ lọc ở trên cùng, sẽ chỉ hiển thị tất cả các mục của danh mục đó.

Truy vấn schema extensions qua introspection
Metadata tùy chỉnh được gắn vào các phần tử schema hiện có thể được truy vấn qua field extensions.
Tất cả các phần tử introspection của schema đã được nâng cấp với field mới, mỗi phần tử trả về một đối tượng thuộc kiểu "Extensions" tương ứng, hiển thị các thuộc tính tùy chỉnh cho phần tử đó.
# Using "_" instead of "__" in introspection type name to avoid errors in graphql-js
type _SchemaExtensions {
# Is the schema being namespaced?
isNamespaced: Boolean!
}
extend type __Schema {
extensions: _SchemaExtensions!
}
type _NamedTypeExtensions {
# The type name
elementName: String!
# The "namespaced" type name
namespacedName: String!
# Enum-like "possible values" for EnumString type resolvers, `null` otherwise
possibleValues: [String!]
# OneOf Input Objects are a special variant of Input Objects where the type system asserts that exactly one of the fields must be set and non-null, all others being omitted.
isOneOf: Boolean!
}
extend type __Type {
# Non-null for named types, null for wrapping types (Non-Null and List)
extensions: _NamedTypeExtensions
}
type _DirectiveExtensions {
# If no objects are returned in the field (eg: because they failed validation), does the directive still need to be executed?
needsDataToExecute: Boolean!
# Names or descriptions of the types the field directives is restricted to, or `null` if it supports any type (i.e. it defines no restrictions)
fieldDirectiveSupportedTypeNamesOrDescriptions: [String!]
}
extend type __Directive {
extensions: _DirectiveExtensions!
}
type _FieldExtensions {
isGlobal: Boolean!
# Useful for nested mutations
isMutation: Boolean!
# `true` => Only exposed when "Expose "sensitive" data elements" is enabled
isSensitiveDataElement: Boolean!
}
extend type __Field {
extensions: _FieldExtensions!
}
type _InputValueExtensions {
isSensitiveDataElement: Boolean!
}
extend type __InputValue {
extensions: _InputValueExtensions!
}
type _EnumValueExtensions {
isSensitiveDataElement: Boolean!
}
extend type __EnumValue {
extensions: _EnumValueExtensions!
}Hoàn thành việc tách rời mã GraphQL server khỏi WordPress
GraphQL server nền tảng cung cấp sức mạnh cho plugin hiện có thể được cài đặt và thực thi như một PHP component độc lập, tức là độc lập với WordPress.
Điều này mở ra cánh cửa để sử dụng Gato GraphQL với các framework khác (ví dụ: Laravel), và trên bất kỳ môi trường PHP nào, dù WordPress có sẵn hay không (chẳng hạn như khi thực hiện một tác vụ Continuous Integration).
Duyệt tài liệu khi chỉnh sửa Schema Configuration, Custom Endpoint và Persisted Query
Tất cả các blocks được hiển thị khi chỉnh sửa Schema Configuration, Custom Endpoint và Persisted Query hiện có nút "info" mà khi nhấp vào sẽ hiển thị tài liệu trong một cửa sổ modal.


Nhiều tính năng khác
Để khám phá tất cả các tính năng mới khác, hãy xem mô tả đầy đủ về bản phát hành mới, hoặc duyệt changelog.
Nếu bạn thích những gì bạn thấy, hãy giúp lan tỏa tình yêu ❤️