🚀 เปิดตัว Gato GraphQL เวอร์ชัน 0.8 แล้ว!
Gato GraphQL เวอร์ชัน 0.8 พร้อมดาวน์โหลดแล้ว! 🎉
นี่เป็นการเปิดตัวครั้งใหญ่ โดยเน้นสามด้านหลัก:
- การปรับโครงสร้างโค้ดเบสเพื่อเปิดใช้งานส่วนขยาย
- การปฏิบัติตาม GraphQL specification มากยิ่งขึ้น
- การทำให้ GraphQL schema สมบูรณ์
นอกจากนี้ ยังรองรับ WordPress 5.8 เวอร์ชันใหม่ และมีการแก้ไขบั๊กและการปรับปรุงมากมาย
โปรดทราบว่าการเปิดตัวนี้มีการเปลี่ยนแปลงที่ไม่รองรับเวอร์ชันเดิม!
ด้านล่างเป็น release notes พร้อมลิงก์ด่วน:
- รองรับ WordPress 5.8
- การปรับปรุงการรองรับ PHP 8.0
- ทำให้โค้ดเบสเรียบง่ายขึ้น โดยใช้ container services ทั่วทั้งระบบ
- บันทึกแคชไว้ใต้
wp-content - การเปิดตัว GraphQL endpoint แบบ "fixed schema" เพื่อขับเคลื่อน WordPress editor
- การรองรับประเภทฟิลด์ใน schema เพิ่มเติม
- Input coercion: รับค่าเดียวเมื่อคาดหวัง list
- ทำให้ WordPress schema สมบูรณ์มากขึ้น
- เพิ่มฟิลด์ผู้ดูแลระบบแบบ "unrestricted" ใน GraphQL schema
- แนะนำ scalar type
AnyScalar - การตั้งค่าในรูปแบบยาว
- การเปลี่ยนแปลงที่ไม่รองรับเวอร์ชันเดิม
- แผนงานที่กำลังจะมาถึง
- พบปัญหา?
รองรับ WordPress 5.8
WordPress 5.8 ยกเลิกการใช้ filter hooks หลายตัว รวมถึง allowed_block_types และ block_categories (ที่ใช้โดย plugin นี้)
hooks ที่ได้รับผลกระทบถูกแทนที่ด้วย:
allowed_block_types=>allowed_block_types_allblock_categories=>block_categories_all
การปรับปรุงการรองรับ PHP 8.0
การเปิดตัวนี้แก้ไขปัญหาบางอย่างเมื่อใช้ PHP 8.0
ทำให้โค้ดเบสเรียบง่ายขึ้น โดยใช้ container services ทั่วทั้งระบบ
โค้ดเบสของ GraphQL server ได้รับการปรับโครงสร้างใหม่ เพื่อใช้ service container สำหรับการลงทะเบียนองค์ประกอบทั้งหมดของ schema (type resolvers, field resolvers, interface resolvers, custom scalar resolvers และอื่นๆ)
นี่เป็นเหตุการณ์สำคัญที่แนะนำแนวทางเดียวสำหรับการพัฒนา plugin และส่วนขยาย ซึ่งทำให้โค้ดและเอกสารง่ายขึ้นอย่างมาก
ในที่สุดก็สามารถเขียนเอกสารเกี่ยวกับวิธีการสร้างส่วนขยายที่กำหนดเองสำหรับ Gato GraphQL ได้แล้ว การดำเนินงานจะเริ่มต้นเร็วๆ นี้ และจะเผยแพร่ในส่วนคู่มือ
บันทึกแคชไว้ใต้ wp-content
plugin จะแคชผลลัพธ์ลงดิสก์เพื่อเพิ่มประสิทธิภาพการทำงาน
ไฟล์ที่แคชไว้ก่อนหน้านี้ถูกจัดเก็บไว้ในโฟลเดอร์ระบบที่ผู้ดูแลระบบมองไม่เห็น จากนี้ไปจะถูกจัดเก็บไว้ใต้ wp-content/graphql-api/cache/
การเปิดตัว GraphQL endpoint แบบ "fixed schema" เพื่อขับเคลื่อน WordPress editor
ขณะนี้มี 2 endpoint ใน wp-admin:
GRAPHQL_API_ADMIN_CONFIGURABLESCHEMA_ENDPOINTGRAPHQL_API_ADMIN_FIXEDSCHEMA_ENDPOINT
ด้วย GRAPHQL_API_ADMIN_CONFIGURABLESCHEMA_ENDPOINT GraphQL schema จะถูกปรับเปลี่ยนตามความชอบของผู้ใช้ เช่น การใช้ namespace หรือไม่ การเปิด/ปิด types/directives และอื่นๆ
ด้วย GRAPHQL_API_ADMIN_FIXEDSCHEMA_ENDPOINT GraphQL schema จะไม่ถูกปรับเปลี่ยนตามความชอบของผู้ใช้ โดยจะเปิดเผย types, fields และ directives ทั้งหมดเสมอ รวมถึงฟิลด์ผู้ดูแลระบบแบบ "unrestricted"
endpoint แบบ fixed ช่วยให้ Gutenberg blocks สามารถ query ฟิลด์ทั้งหมดได้ โดยไม่คำนึงว่าผู้ใช้เปิดหรือปิดใช้งานไว้หรือไม่ และด้วยการเข้าถึงแบบไม่จำกัด
การรองรับประเภทฟิลด์ใน schema เพิ่มเติม
การรองรับ lists เป็น field types ได้รับการขยาย โดยรองรับฟีเจอร์ต่อไปนี้:
- Lists ที่มี items ที่ไม่เป็น null:
[String!] - Lists ของ lists:
[[String]] - การรวมกันใดๆ:
[[String!]!]
Input coercion: รับค่าเดียวเมื่อคาดหวัง list
ตอนนี้เราสามารถใส่ค่าเดียวใน GraphQL query ได้ในที่ที่คาดหวัง list ตามที่กำหนดไว้ใน GraphQL spec
ตัวอย่างเช่น queries เหล่านี้ตอนนี้เทียบเท่ากัน:
query InputSingleValue {
posts(filter: { ids: 1 }) {
title
}
}
query InputListOfSingleItem {
posts(filter: { ids: [1] }) {
title
}
}ทำให้ WordPress schema สมบูรณ์มากขึ้น
entities เพิ่มเติมจาก WordPress data model ถูกเพิ่มเข้าไปใน GraphQL schema:

มาดูว่ามีองค์ประกอบใหม่อะไรถูกเพิ่มเข้ามาบ้าง
หมวดหมู่
หมวดหมู่ถูก map ผ่าน type PostCategory ใหม่ และฟิลด์ใหม่:
Root.postCategories: [PostCategory]Root.postCategory: PostCategoryPost.categories: [PostCategory]
ตัวอย่างเช่น query นี้จะดึงหมวดหมู่สำหรับโพสต์:
{
posts {
id
title
categories {
id
name
url
}
}
}mutation field สำหรับกำหนดหมวดหมู่ให้กับโพสต์ก็ถูกเพิ่มเข้ามาด้วย:
MutationRoot.setCategoriesOnPost: Post
และ input categories ถูกเพิ่มเข้าไปใน mutation fields สำหรับโพสต์:
MutationRoot.createPostMutationRoot.updatePostPost.update(เมื่อเปิดใช้งาน nested mutations)
Meta
ค่า meta ของ custom post, user, comment และ taxonomy สามารถ query ได้แล้ว ผ่านฟิลด์ใหม่:
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]
ตัวอย่างเช่น query นี้จะดึง meta last_name ของผู้ใช้:
{
users {
id
lastName: metaValue(key: "last_name")
}
}เนื่องจากค่า meta สามารถเป็นอะไรก็ได้ (string, integer, float หรือ boolean) จึงถูก map ผ่าน scalar type AnyScalar แบบ generic ที่เพิ่งเปิดตัว
ค่า meta อาจเป็นสาธารณะหรือส่วนตัวก็ได้ ต้องกำหนดค่าอย่างชัดเจนในหน้าการตั้งค่าว่า meta keys ใดสามารถ query ได้:

ตามค่าเริ่มต้น รายการ meta keys ที่อนุญาตจะว่างเปล่า
เมนู
เมนูถูก map ผ่าน type Menu ใหม่ และฟิลด์ใหม่ Root.menu
{
menu(by: { id: 176 }) {
itemDataEntries
}
}การตั้งค่า
การตั้งค่าจากไซต์ (ที่จัดเก็บในตาราง wp_options) สามารถ query ได้ผ่านฟิลด์ใหม่ Root.option: AnyScalar
ตัวอย่างเช่น query นี้จะดึงชื่อไซต์:
{
siteName: optionValue(name: "blogname")
}ต้องกำหนดค่าอย่างชัดเจนในหน้าการตั้งค่าว่าสามารถเข้าถึง options ใดได้บ้าง:

ตามค่าเริ่มต้น สามารถ query ได้เฉพาะ options ต่อไปนี้เท่านั้น:
"home""blogname""blogdescription"
โพสต์ของผู้ใช้
ผู้ใช้ที่เข้าสู่ระบบแล้วสามารถดึงโพสต์ของตนเองได้ สำหรับทุก status (publish, pending, draft หรือ trash) ผ่านฟิลด์ใหม่:
Root.myPosts: [Post]Root.myPostCount: IntRoot.myPost: Post
ตัวอย่างเช่น ตอนนี้เราสามารถรัน query นี้ได้:
# 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 schema
GraphQL schema ต้องสร้างสมดุลระหว่างฟิลด์สาธารณะและส่วนตัว เพื่อหลีกเลี่ยงการเปิดเผยข้อมูลส่วนตัวใน API สาธารณะ
โมดูลใหม่ Schema for the Admin เพิ่มฟิลด์ผู้ดูแลระบบแบบ "unrestricted" ใน GraphQL schema ซึ่งอาจเปิดเผยข้อมูลส่วนตัวได้:
Root:
unrestrictedPostunrestrictedPostsunrestrictedPostCountunrestrictedCustomPostunrestrictedCustomPostsunrestrictedCustomPostCountunrestrictedGenericCustomPostunrestrictedGenericCustomPostsunrestrictedGenericCustomPostCountunrestrictedPageunrestrictedPagesunrestrictedPageCountunrestrictedUsersrolescapabilities
User:
unrestrictedPostsunrestrictedPostCountunrestrictedCustomPostsunrestrictedCustomPostCountrolescapabilities
PostCategory:
unrestrictedPostsunrestrictedPostCount
PostTag:
unrestrictedPostsunrestrictedPostCount
ตัวอย่างเช่น เมื่อต้องการเข้าถึงข้อมูลโพสต์ ปัจจุบันเรามีฟิลด์ posts ซึ่งเปิดเผยข้อมูลสาธารณะเท่านั้น โดยดึงโพสต์ที่เผยแพร่แล้ว
จากนี้ไป เราสามารถเข้าถึงข้อมูลโพสต์ผ่านฟิลด์ unrestrictedPosts ได้เช่นกัน ซึ่งจะเปิดเผยข้อมูลทั้งสาธารณะและส่วนตัว โดยดึงโพสต์ที่มี status ใดก็ได้ ("publish", "draft", "pending", "trash")
{
unrestrictedPosts(status: [draft, pending]) {
id
title
status
author {
id
name
}
}
}แนะนำ scalar type AnyScalar
Scalar type AnyScalar แสดงถึง scalars ในตัวใดๆ (String, Int, Boolean, Float หรือ ID)
ใช้กับฟิลด์ option และ metaValue(s) ที่เพิ่งเปิดตัว เนื่องจากเราไม่สามารถทราบล่วงหน้าได้ว่าข้อมูลที่ส่งกลับมีประเภทใด และ union ของ scalar types ยังไม่ได้รับการรองรับโดย GraphQL spec
การตั้งค่าในรูปแบบยาว
ตัวเลือกในหน้าการตั้งค่าถูกแบ่งตาม tabs จาก v0.8 เป็นต้นไป ยังสามารถแสดงทั้งหมดรวมกันในหน้าเดียวแบบยาวได้
เพื่อเปิดใช้งานพฤติกรรมนี้ ให้ยกเลิกการเลือก "Have all options in this Settings page be organized under tabs, one tab per module." ในการตั้งค่า แล้วกด "Save Changes":

จากนั้น การตั้งค่าทั้งหมดจะแสดงรวมกันในรูปแบบยาว:

การเปลี่ยนแปลงที่ไม่รองรับเวอร์ชันเดิม
release v0.8 มีการเปลี่ยนแปลงที่ไม่รองรับเวอร์ชันก่อนหน้า
การเปลี่ยนแปลงการกำหนดค่าที่ไม่รองรับเวอร์ชันเดิม
CPTs ต่อไปนี้มีบล็อก "Options" ที่ถูกสร้างใหม่:
- Schema Configurations
- Custom Endpoints
- Persisted Queries
ใน v0.7 ก่อนหน้า บล็อก Options เดียวสำหรับ entities เหล่านี้มีรายการการกำหนดค่าหลายอย่าง ตั้งแต่ v0.8 บล็อกนี้ถูกแยกออกเป็นบล็อกอิสระหลายตัว แต่ละตัวมีการกำหนดค่าของตัวเอง
ตัวอย่างเช่น ใน v0.7 (นอกจากการเปิด/ปิด endpoint) บล็อก Custom Endpoint Options อนุญาตให้กำหนดค่า GraphiQL และ Interactive Schema clients:

ตั้งแต่ v0.8 การกำหนดค่านี้ถูกเพิ่มผ่านบล็อก GraphiQL และ Interactive Schema:

การกำหนดค่าที่จัดเก็บไว้ในบล็อก Options สำหรับ CPTs ทั้ง 3 ตัวจะไม่ถูกย้ายไปยังรูปแบบใหม่โดยอัตโนมัติ ดังนั้น ก่อนอัปเกรดเป็น v0.8 โปรดจดบันทึกการกำหนดค่าที่จัดเก็บไว้ และทำซ้ำหลังจากอัปเกรดเป็นเวอร์ชันใหม่
ขออภัยในความไม่สะดวก
นอกจากนี้ คุณจะต้องคลิกปุ่ม "Reset the template" ที่แสดงใน WordPress editor สำหรับ entries ทั้งหมดของ CPTs ทั้ง 3 ตัว

การลบ directive ที่ไม่ได้มาตรฐาน
directives ที่ไม่ได้มาตรฐานถูกลบออกจาก plugin:
@default@removeIfNull@export
โมดูลที่ถูกลบออก
โมดูลต่อไปนี้ถูกลบออกจาก plugin:
- Field Deprecation
- Configuration Cache
- Schema Cache
- Multiple Query Execution
- Proactive Feedback
- Schema Editing Access
- Embeddable fields
แผนงานที่กำลังจะมาถึง
ตอนนี้ที่ v0.8 ออกมาแล้ว เราสามารถเริ่มวางแผนเส้นทางข้างหน้าได้
แผนปัจจุบันมีดังนี้:
เปิดตัว v0.9 ในเดือนกันยายน 2021 ซึ่งรวมถึง:
- Custom scalars
- GraphQL schema ที่อัปเดตแล้ว โดยใช้ custom scalars เมื่อเหมาะสม (เช่น:
Post.dateจะส่งคืนประเภทDateแทนString) - การปรับปรุงเพิ่มเติมเพื่อรองรับส่วนขยาย
จากนั้น เปิดตัว v1.0 ราวปลายปีหรือต้นปี 2022 ซึ่งรวมถึง:
- การสาธิต extension plugin
- คู่มือเอกสารที่สมบูรณ์เกี่ยวกับการสร้างส่วนขยาย
- การเปิดตัว Gato GraphQL plugin ใน
wp.org
เพื่อรับการแจ้งเตือนเกี่ยวกับสถานะปัจจุบัน คุณสามารถสมัครรับจดหมายข่าว
พบปัญหา?
หากคุณมีปัญหาในการติดตั้งหรือรัน v0.8 โปรดสร้าง issue ใน repo