Blog

🚀 Phát hành phiên bản mới 0.8 của Gato GraphQL!

Leonardo Losoviz
Bởi Leonardo Losoviz ·

Phiên bản 0.8 của Gato GraphQL hiện đã có thể tải xuống! 🎉

Đây là một bản phát hành lớn, tập trung vào ba lĩnh vực:

  1. Tái cấu trúc codebase để hỗ trợ các extension
  2. Tuân thủ đặc tả GraphQL tốt hơn
  3. Hoàn thiện schema GraphQL

Ngoài ra, phiên bản này hỗ trợ WordPress 5.8 mới và chứa nhiều bản sửa lỗi cùng cải tiến.

Lưu ý rằng bản phát hành này chứa các thay đổi không tương thích ngược!

Dưới đây là các ghi chú phát hành. Liên kết nhanh:


Hỗ trợ WordPress 5.8

WordPress 5.8 đã loại bỏ một số filter hooks, bao gồm allowed_block_typesblock_categories (được sử dụng bởi plugin này).

Các hook bị ảnh hưởng đã được thay thế:

  1. allowed_block_types => allowed_block_types_all
  2. block_categories => block_categories_all

Cải thiện hỗ trợ PHP 8.0

Bản phát hành này sửa một số vấn đề khi sử dụng PHP 8.0.

Đơn giản hóa codebase, sử dụng container services ở mọi nơi

Codebase của máy chủ GraphQL đã được tái cấu trúc để sử dụng service container để đăng ký tất cả các phần tử của schema (type resolvers, field resolvers, interface resolvers, custom scalar resolvers và các phần tử khác).

Đây là một cột mốc quan trọng, giới thiệu một phương pháp duy nhất để phát triển plugin và các extension của nó, giúp đơn giản hóa đáng kể code và tài liệu của chúng.

Tài liệu về cách tạo các extension tùy chỉnh cho Gato GraphQL cuối cùng có thể được viết. Công việc trên đó sẽ bắt đầu sớm và sẽ được xuất bản trong phần hướng dẫn.

Cache được lưu dưới wp-content

Plugin lưu kết quả vào đĩa để tối ưu hóa hiệu suất.

Các tệp được lưu trong cache trước đây được lưu trữ trong một thư mục hệ thống, ẩn khỏi tầm nhìn của người dùng quản trị. Từ bây giờ, chúng được lưu trữ dưới wp-content/graphql-api/cache/.

Một endpoint GraphQL "schema cố định" đã được giới thiệu để hỗ trợ trình soạn thảo WordPress

Hiện tại, có 2 endpoint trong wp-admin:

  1. GRAPHQL_API_ADMIN_CONFIGURABLESCHEMA_ENDPOINT
  2. GRAPHQL_API_ADMIN_FIXEDSCHEMA_ENDPOINT

Với GRAPHQL_API_ADMIN_CONFIGURABLESCHEMA_ENDPOINT, schema GraphQL được sửa đổi theo tùy chọn của người dùng, chẳng hạn như có namespace hay không, có các type/directive được bật hay không, và các tùy chọn khác.

Với GRAPHQL_API_ADMIN_FIXEDSCHEMA_ENDPOINT, schema GraphQL không được sửa đổi theo tùy chọn của người dùng, luôn hiển thị tất cả các type, trường và directive, bao gồm cả các trường admin "unrestricted".

Endpoint cố định cho phép các khối Gutenberg truy vấn tất cả các trường, bất kể chúng có được người dùng bật hay không, và với quyền truy cập không bị hạn chế.

Hỗ trợ thêm các kiểu trường trong schema

Hỗ trợ cho danh sách như các kiểu trường đã được mở rộng, hiện hỗ trợ các tính năng sau:

  • Danh sách với các phần tử không null: [String!]
  • Danh sách của danh sách: [[String]]
  • Bất kỳ sự kết hợp nào của chúng: [[String!]!]

Input coercion: chấp nhận một giá trị đơn khi danh sách được mong đợi

Giờ chúng ta có thể nhập một giá trị đơn trong queries GraphQL khi một danh sách được mong đợi, như được định nghĩa trong đặc tả GraphQL.

Ví dụ, các queries này hiện tương đương:

query InputSingleValue {
  posts(filter: { ids: 1 }) {
    title
  }
}
 
query InputListOfSingleItem {
  posts(filter: { ids: [1] }) {
    title
  }
}

Hoàn thiện thêm schema WordPress

Các thực thể bổ sung từ mô hình dữ liệu WordPress đã được thêm vào schema GraphQL:

Schema GraphQL

Hãy xem những phần tử mới nào đã được thêm vào.

Danh mục

Danh mục đã được ánh xạ, thông qua kiểu PostCategory mới, và các trường mới:

  • Root.postCategories: [PostCategory]
  • Root.postCategory: PostCategory
  • Post.categories: [PostCategory]

Ví dụ, queries này lấy các danh mục cho các bài đăng:

{
  posts {
    id
    title
    categories {
      id
      name
      url
    }
  }
}

Một trường mutation, để gán danh mục cho bài đăng, cũng đã được thêm vào:

  • MutationRoot.setCategoriesOnPost: Post

Và một input categories đã được thêm vào các trường mutation cho bài đăng:

  • MutationRoot.createPost
  • MutationRoot.updatePost
  • Post.update (khi nested mutations được bật)

Meta

Các giá trị meta của custom post, người dùng, bình luận và taxonomy hiện có thể được truy vấn, thông qua các trường mới:

  • Post.metaValue: AnyScalar
  • Post.metaValues: [AnyScalar]
  • User.metaValue: AnyScalar
  • User.metaValues: [AnyScalar]
  • Comment.metaValue: AnyScalar
  • Comment.metaValues: [AnyScalar]
  • PostCategory.metaValue: AnyScalar
  • PostCategory.metaValues: [AnyScalar]
  • PostTag.metaValue: AnyScalar
  • PostTag.metaValues: [AnyScalar]

Ví dụ, queries này lấy meta last_name cho người dùng:

{
  users {
    id
    lastName: metaValue(key: "last_name")
  }
}

Vì các giá trị meta có thể là bất cứ thứ gì (string, integer, float hoặc boolean) nên chúng đã được ánh xạ thông qua kiểu scalar chung mới được giới thiệu AnyScalar.

Các giá trị meta có thể là công khai hoặc riêng tư. Các meta key có thể được truy vấn phải được cấu hình rõ ràng trong trang cài đặt:

Xác định các mục
Xác định các mục

Theo mặc định, danh sách các meta key được phép là trống.

Các menu đã được ánh xạ, thông qua kiểu Menu mới, và trường mới Root.menu.

{
  menu(by: { id: 176 }) {
    itemDataEntries
  }
}

Settings

Các cài đặt từ trang web (được lưu trữ trong bảng wp_options) có thể được truy vấn thông qua trường mới Root.option: AnyScalar.

Ví dụ, queries này lấy tên của trang web:

{
  siteName: optionValue(name: "blogname")
}

Các tùy chọn nào có thể truy cập phải được cấu hình rõ ràng trong trang cài đặt:

Xác định các mục cho Settings

Theo mặc định, chỉ có thể truy vấn các tùy chọn sau:

  • "home"
  • "blogname"
  • "blogdescription"

User posts

Người dùng đã đăng nhập có thể lấy các bài đăng của họ, với bất kỳ trạng thái nào (publish, pending, draft hoặc trash), thông qua các trường mới:

  • Root.myPosts: [Post]
  • Root.myPostCount: Int
  • Root.myPost: Post

Ví dụ, giờ chúng ta có thể chạy queries này:

# 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
    }
  }
}

Thêm các trường admin "unrestricted" vào schema GraphQL

Schema GraphQL phải cân bằng giữa các trường công khai và riêng tư, để tránh tiết lộ thông tin riêng tư trong một API công khai.

Module mới Schema for the Admin thêm các trường admin "unrestricted" vào schema GraphQL, có thể hiển thị dữ liệu riêng tư:

Root:

  • unrestrictedPost
  • unrestrictedPosts
  • unrestrictedPostCount
  • unrestrictedCustomPost
  • unrestrictedCustomPosts
  • unrestrictedCustomPostCount
  • unrestrictedGenericCustomPost
  • unrestrictedGenericCustomPosts
  • unrestrictedGenericCustomPostCount
  • unrestrictedPage
  • unrestrictedPages
  • unrestrictedPageCount
  • unrestrictedUsers
  • roles
  • capabilities

User:

  • unrestrictedPosts
  • unrestrictedPostCount
  • unrestrictedCustomPosts
  • unrestrictedCustomPostCount
  • roles
  • capabilities

PostCategory:

  • unrestrictedPosts
  • unrestrictedPostCount

PostTag:

  • unrestrictedPosts
  • unrestrictedPostCount

Ví dụ, để truy cập dữ liệu bài đăng, hiện tại chúng ta có trường posts, chỉ hiển thị dữ liệu công khai bằng cách lấy các bài đăng đã xuất bản.

Từ bây giờ, chúng ta cũng có thể truy cập dữ liệu bài đăng thông qua trường unrestrictedPosts, hiển thị dữ liệu công khai và riêng tư bằng cách lấy các bài đăng với bất kỳ trạng thái nào ("publish", "draft", "pending", "trash").

{
  unrestrictedPosts(status: [draft, pending]) {
    id
    title
    status
    author {
      id
      name
    }
  }
}

Giới thiệu kiểu scalar AnyScalar

Kiểu scalar AnyScalar đại diện cho bất kỳ scalar tích hợp nào (String, Int, Boolean, Float hoặc ID).

Nó được sử dụng trên trường optionmetaValue(s) mới được giới thiệu, vì chúng ta không biết trước kiểu dữ liệu trả về của chúng, và sự kết hợp của các kiểu scalar chưa được đặc tả GraphQL hỗ trợ.

Settings ở định dạng dài

Các tùy chọn trong trang Settings được chia theo tab. Từ v0.8, cũng có thể xem tất cả chúng cùng nhau trong một trang dài duy nhất.

Để bật hành vi này, hãy bỏ chọn mục "Have all options in this Settings page be organized under tabs, one tab per module." trong Settings, và nhấn vào "Save Changes":

Hộp kiểm để bật/tắt tab trong Settings

Sau đó, tất cả các cài đặt sẽ được hiển thị cùng nhau ở định dạng dài:

Settings ở định dạng dài


Các thay đổi không tương thích ngược

Phiên bản v0.8 tạo ra các thay đổi không tương thích ngược với phiên bản trước.

Các thay đổi cấu hình không tương thích ngược

Các CPT sau đây đã có khối "Options" của chúng được xây dựng lại:

  • Schema Configurations
  • Custom Endpoints
  • Persisted Queries

Trong phiên bản trước v0.7, một khối Options duy nhất cho các thực thể này chứa nhiều mục cấu hình. Kể từ v0.8, khối này đã được tách ra thành nhiều khối độc lập, mỗi khối chứa cấu hình riêng của nó.

Ví dụ, trong v0.7, (ngoài việc bật/tắt endpoint) khối Custom Endpoint Options cho phép cấu hình các client GraphiQL và Interactive Schema:

Options in Custom Endpoint

Kể từ v0.8, cấu hình này được thêm thông qua các khối GraphiQL và Interactive Schema:

Options in Custom Endpoint

Cấu hình được lưu trữ trong các khối Options cho cả 3 CPT không được tự động di chuyển sang định dạng mới. Do đó, trước khi nâng cấp lên v0.8, vui lòng ghi lại cấu hình đã lưu trữ của bạn và sao chép lại sau khi nâng cấp lên phiên bản mới.

Chúng tôi xin lỗi vì sự bất tiện này.

Ngoài ra, bạn sẽ cần nhấp vào nút "Reset the template" được hiển thị trong trình soạn thảo WordPress, cho tất cả các mục trong 3 CPT.

Reset the template trong trình soạn thảo WordPress

Các directive không chuẩn đã bị xóa

Các directive không chuẩn đã bị xóa khỏi plugin:

  • @default
  • @removeIfNull
  • @export

Các module đã bị xóa

Các module sau đây đã bị xóa khỏi plugin:

  • Field Deprecation
  • Configuration Cache
  • Schema Cache
  • Multiple Query Execution
  • Proactive Feedback
  • Schema Editing Access
  • Embeddable fields

Lộ trình sắp tới

Bây giờ v0.8 đã được phát hành, chúng ta có thể bắt đầu lên kế hoạch cho con đường phía trước.

Kế hoạch hiện tại như sau:

Phát hành v0.9 vào tháng 9 năm 2021, bao gồm:

  • Custom scalars
  • Một schema GraphQL được cập nhật, sử dụng custom scalars khi thích hợp (ví dụ: Post.date sẽ trả về kiểu Date thay vì String)
  • Các cải tiến thêm để hỗ trợ các extension

Và sau đó, phát hành v1.0 vào cuối năm hoặc đầu năm 2022, bao gồm:

  • Một demo về một extension plugin
  • Hướng dẫn tài liệu đầy đủ về cách tạo các extension
  • Ra mắt plugin Gato GraphQL trên wp.org

Để nhận thông báo về trạng thái hiện tại, bạn có thể đăng ký nhận bản tin.


Gặp phải vấn đề?

Nếu bạn gặp bất kỳ vấn đề nào khi cài đặt hoặc chạy v0.8, vui lòng tạo một issue trong repo.


Đăng ký nhận bản tin của chúng tôi

Cập nhật tất cả những điều mới từ Gato GraphQL.