บล็อก

🚀 เปิดตัว Gato GraphQL เวอร์ชัน 0.8 แล้ว!

Leonardo Losoviz
โดย Leonardo Losoviz ·

Gato GraphQL เวอร์ชัน 0.8 พร้อมดาวน์โหลดแล้ว! 🎉

นี่เป็นการเปิดตัวครั้งใหญ่ โดยเน้นสามด้านหลัก:

  1. การปรับโครงสร้างโค้ดเบสเพื่อเปิดใช้งานส่วนขยาย
  2. การปฏิบัติตาม GraphQL specification มากยิ่งขึ้น
  3. การทำให้ GraphQL schema สมบูรณ์

นอกจากนี้ ยังรองรับ WordPress 5.8 เวอร์ชันใหม่ และมีการแก้ไขบั๊กและการปรับปรุงมากมาย

โปรดทราบว่าการเปิดตัวนี้มีการเปลี่ยนแปลงที่ไม่รองรับเวอร์ชันเดิม!

ด้านล่างเป็น release notes พร้อมลิงก์ด่วน:


รองรับ WordPress 5.8

WordPress 5.8 ยกเลิกการใช้ filter hooks หลายตัว รวมถึง allowed_block_types และ block_categories (ที่ใช้โดย plugin นี้)

hooks ที่ได้รับผลกระทบถูกแทนที่ด้วย:

  1. allowed_block_types => allowed_block_types_all
  2. block_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:

  1. GRAPHQL_API_ADMIN_CONFIGURABLESCHEMA_ENDPOINT
  2. GRAPHQL_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:

GraphQL schema

มาดูว่ามีองค์ประกอบใหม่อะไรถูกเพิ่มเข้ามาบ้าง

หมวดหมู่

หมวดหมู่ถูก map ผ่าน type PostCategory ใหม่ และฟิลด์ใหม่:

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

ตัวอย่างเช่น query นี้จะดึงหมวดหมู่สำหรับโพสต์:

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

mutation field สำหรับกำหนดหมวดหมู่ให้กับโพสต์ก็ถูกเพิ่มเข้ามาด้วย:

  • MutationRoot.setCategoriesOnPost: Post

และ input categories ถูกเพิ่มเข้าไปใน mutation fields สำหรับโพสต์:

  • MutationRoot.createPost
  • MutationRoot.updatePost
  • Post.update (เมื่อเปิดใช้งาน nested mutations)

Meta

ค่า meta ของ custom post, user, comment และ taxonomy สามารถ query ได้แล้ว ผ่านฟิลด์ใหม่:

  • 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]

ตัวอย่างเช่น 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 ได้:

การกำหนด entries
การกำหนด entries

ตามค่าเริ่มต้น รายการ meta keys ที่อนุญาตจะว่างเปล่า

เมนู

เมนูถูก map ผ่าน type Menu ใหม่ และฟิลด์ใหม่ Root.menu

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

การตั้งค่า

การตั้งค่าจากไซต์ (ที่จัดเก็บในตาราง wp_options) สามารถ query ได้ผ่านฟิลด์ใหม่ Root.option: AnyScalar

ตัวอย่างเช่น query นี้จะดึงชื่อไซต์:

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

ต้องกำหนดค่าอย่างชัดเจนในหน้าการตั้งค่าว่าสามารถเข้าถึง options ใดได้บ้าง:

Defining the entries for the Settings

ตามค่าเริ่มต้น สามารถ query ได้เฉพาะ options ต่อไปนี้เท่านั้น:

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

โพสต์ของผู้ใช้

ผู้ใช้ที่เข้าสู่ระบบแล้วสามารถดึงโพสต์ของตนเองได้ สำหรับทุก status (publish, pending, draft หรือ trash) ผ่านฟิลด์ใหม่:

  • Root.myPosts: [Post]
  • Root.myPostCount: Int
  • Root.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:

  • 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

ตัวอย่างเช่น เมื่อต้องการเข้าถึงข้อมูลโพสต์ ปัจจุบันเรามีฟิลด์ 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":

Checkbox to enable/disable tabs in Settings

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

Settings in long format


การเปลี่ยนแปลงที่ไม่รองรับเวอร์ชันเดิม

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:

Options in Custom Endpoint

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

Options in Custom Endpoint

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

ขออภัยในความไม่สะดวก

นอกจากนี้ คุณจะต้องคลิกปุ่ม "Reset the template" ที่แสดงใน WordPress editor สำหรับ entries ทั้งหมดของ CPTs ทั้ง 3 ตัว

Reset the template in the WordPress editor

การลบ 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


สมัครรับจดหมายข่าวของเรา

ติดตามการอัปเดตทั้งหมดของ Gato GraphQL