π Gato GraphQL λ²μ 0.8μ μΆμνμ΅λλ€!
Gato GraphQL λ²μ 0.8μ΄ λ€μ΄λ‘λ κ°λ₯ν΄μ‘μ΅λλ€! π
μ΄λ² 릴리μ€λ λ§€μ° λκ·λͺ¨λ‘, λ€μ μΈ κ°μ§ μμμ μ€μ μ λκ³ μμ΅λλ€:
- νμ₯ κΈ°λ₯μ μ§μνκΈ° μν μ½λλ² μ΄μ€ 리ν©ν λ§
- GraphQL μ¬μμ μΆκ° μ€μ
- GraphQL μ€ν€λ§ μμ±
λν μλ‘μ΄ WordPress 5.8μ μ§μνλ©°, λ€μμ λ²κ·Έ μμ λ° κ°μ μ¬νμ΄ ν¬ν¨λμ΄ μμ΅λλ€.
μ΄λ² 릴리μ€μλ νΈνμ±μ κΉ¨λ λ³κ²½ μ¬νμ΄ ν¬ν¨λμ΄ μμΌλ―λ‘ μ£ΌμνμκΈ° λ°λλλ€.
μλλ λ¦΄λ¦¬μ€ λ ΈνΈμ λλ€. λΉ λ₯Έ λ§ν¬:
- WordPress 5.8 μ§μ
- PHP 8.0 μ§μ κ°μ
- 컨ν μ΄λ μλΉμ€λ₯Ό μ λ©΄μ μΌλ‘ μ¬μ©ν μ½λλ² μ΄μ€ κ°μν
wp-contentνμμ μΊμ μ μ₯- WordPress νΈμ§κΈ°λ₯Ό ꡬλνκΈ° μν γκ³ μ μ€ν€λ§γGraphQL μλν¬μΈνΈ λμ
- μ€ν€λ§μμ νλ μ ν μΆκ° μ§μ
- μ λ ₯ κ°μ λ³ν: 리μ€νΈκ° μμλλ κ²½μ° λ¨μΌ κ° νμ©
- WordPress μ€ν€λ§ μΆκ° μμ±
- GraphQL μ€ν€λ§μ γ무μ νγκ΄λ¦¬μ νλ μΆκ°
- μ€μΉΌλΌ μ ν
AnyScalarλμ - κΈ΄ νμμ μ€μ
- νΈνμ±μ κΉ¨λ λ³κ²½ μ¬ν
- ν₯ν λ‘λλ§΅
- λ¬Έμ κ° λ°μνμ ¨λμ?
WordPress 5.8 μ§μ
WordPress 5.8μ μ΄ νλ¬κ·ΈμΈμμ μ¬μ©νλ allowed_block_types λ° block_categoriesλ₯Ό ν¬ν¨ν μ¬λ¬ νν° ν
μ λ μ΄μ μ¬μ©νμ§ μλλ‘ μ§μ νμ΅λλ€.
μν₯μ λ°λ ν μ λ€μκ³Ό κ°μ΄ λ체λμμ΅λλ€:
allowed_block_types=>allowed_block_types_allblock_categories=>block_categories_all
PHP 8.0 μ§μ κ°μ
μ΄λ² 릴리μ€λ PHP 8.0 μ¬μ© μ λ°μνλ λͺ κ°μ§ λ¬Έμ λ₯Ό μμ ν©λλ€.
컨ν μ΄λ μλΉμ€λ₯Ό μ λ©΄μ μΌλ‘ μ¬μ©ν μ½λλ² μ΄μ€ κ°μν
GraphQL μλ²μ μ½λλ² μ΄μ€κ° 리ν©ν λ§λμ΄, μ€ν€λ§μ λͺ¨λ μμ(type resolver, field resolver, interface resolver, custom scalar resolver λ±)λ₯Ό λ±λ‘νκΈ° μν΄ μλΉμ€ 컨ν μ΄λλ₯Ό μ¬μ©νκ² λμμ΅λλ€.
μ΄κ²μ νλμ λ§μΌμ€ν€μΌλ‘, νλ¬κ·ΈμΈκ³Ό κ·Έ νμ₯ κΈ°λ₯ κ°λ°μ μν λ¨μΌ μ κ·Ό λ°©μμ λμ νμ¬ μ½λμ λ¬Έμλ₯Ό ν¬κ² κ°μνν©λλ€.
Gato GraphQLμ 컀μ€ν νμ₯ κΈ°λ₯μ λ§λλ λ°©λ²μ λν λ¬Έμλ₯Ό μ΄μ μμ±ν μ μκ² λμμ΅λλ€. μμ μ κ³§ μμλμ΄ κ°μ΄λ μΉμ μ κ²μλ μμ μ λλ€.
wp-content νμμ μΊμ μ μ₯
νλ¬κ·ΈμΈμ μ±λ₯ μ΅μ νλ₯Ό μν΄ κ²°κ³Όλ₯Ό λμ€ν¬μ μΊμν©λλ€.
μΊμλ νμΌμ μ΄μ μ κ΄λ¦¬μ μ¬μ©μμκ² λ³΄μ΄μ§ μλ μμ€ν
ν΄λ μλμ μ μ₯λμμ΅λλ€. μ΄μ λΆν°λ wp-content/graphql-api/cache/ νμμ μ μ₯λ©λλ€.
WordPress νΈμ§κΈ°λ₯Ό ꡬλνκΈ° μν γκ³ μ μ€ν€λ§γGraphQL μλν¬μΈνΈ λμ
μ΄μ wp-adminμλ λ κ°μ μλν¬μΈνΈκ° μμ΅λλ€:
GRAPHQL_API_ADMIN_CONFIGURABLESCHEMA_ENDPOINTGRAPHQL_API_ADMIN_FIXEDSCHEMA_ENDPOINT
GRAPHQL_API_ADMIN_CONFIGURABLESCHEMA_ENDPOINTμμλ GraphQL μ€ν€λ§κ° λ€μμ€νμ΄μ€ μ¬λΆ, μ ν/λλ ν°λΈ νμ±ν μ¬λΆ λ± μ¬μ©μ μ€μ μ λ°λΌ λ³κ²½λ©λλ€.
GRAPHQL_API_ADMIN_FIXEDSCHEMA_ENDPOINTμμλ GraphQL μ€ν€λ§κ° μ¬μ©μ μ€μ μ λ°λΌ λ³κ²½λμ§ μμΌλ©°, γ무μ νγκ΄λ¦¬μ νλλ₯Ό ν¬ν¨νμ¬ λͺ¨λ μ ν, νλ, λλ ν°λΈλ₯Ό νμ λ
ΈμΆν©λλ€.
κ³ μ μλν¬μΈνΈλ₯Ό ν΅ν΄ Gutenberg λΈλ‘μ μ¬μ©μμ νμ±ν/λΉνμ±ν μ€μ μ κ΄κ³μμ΄ λͺ¨λ νλλ₯Ό 무μ νμΌλ‘ 쿼리ν μ μκ² λ©λλ€.
μ€ν€λ§μμ νλ μ ν μΆκ° μ§μ
νλ μ νμΌλ‘μμ 리μ€νΈ μ§μμ΄ νμ₯λμ΄ λ€μ κΈ°λ₯μ΄ μ§μλ©λλ€:
- nullμ νμ©νμ§ μλ νλͺ©μ 리μ€νΈ:
[String!] - 리μ€νΈμ 리μ€νΈ:
[[String]] - μ΄λ€μ μμ μ‘°ν©:
[[String!]!]
μ λ ₯ κ°μ λ³ν: 리μ€νΈκ° μμλλ κ²½μ° λ¨μΌ κ° νμ©
GraphQL μ¬μμ μ μλ λλ‘, 리μ€νΈκ° μμλλ GraphQL 쿼리 μμΉμ λ¨μΌ κ°μ μ λ ₯ν μ μκ² λμμ΅λλ€.
μλ₯Ό λ€μ΄, λ€μ 쿼리λ€μ μ΄μ λμΌν©λλ€:
query InputSingleValue {
posts(filter: { ids: 1 }) {
title
}
}
query InputListOfSingleItem {
posts(filter: { ids: [1] }) {
title
}
}WordPress μ€ν€λ§ μΆκ° μμ±
WordPress λ°μ΄ν° λͺ¨λΈμ μΆκ° μν°ν°κ° GraphQL μ€ν€λ§μ μΆκ°λμμ΅λλ€:

μΆκ°λ μλ‘μ΄ μμλ€μ μ΄ν΄λ³΄κ² μ΅λλ€.
μΉ΄ν κ³ λ¦¬
μΉ΄ν
κ³ λ¦¬κ° μλ‘μ΄ PostCategory μ νκ³Ό λ€μ μλ‘μ΄ νλλ₯Ό ν΅ν΄ λ§€νλμμ΅λλ€:
Root.postCategories: [PostCategory]Root.postCategory: PostCategoryPost.categories: [PostCategory]
μλ₯Ό λ€μ΄, μ΄ μΏΌλ¦¬λ κ²μλ¬Όμ μΉ΄ν κ³ λ¦¬λ₯Ό κ°μ Έμ΅λλ€:
{
posts {
id
title
categories {
id
name
url
}
}
}κ²μλ¬Όμ μΉ΄ν κ³ λ¦¬λ₯Ό ν λΉνκΈ° μν mutation νλλ μΆκ°λμμ΅λλ€:
MutationRoot.setCategoriesOnPost: Post
λν κ²μλ¬Ό mutation νλμ categories μ
λ ₯μ΄ μΆκ°λμμ΅λλ€:
MutationRoot.createPostMutationRoot.updatePostPost.update(μ€μ²© mutationμ΄ νμ±νλ κ²½μ°)
λ©ν
컀μ€ν κ²μλ¬Ό, μ¬μ©μ, λκΈ, λΆλ₯ 체κ³μ λ©ν κ°μ λ€μ μλ‘μ΄ νλλ₯Ό ν΅ν΄ 쿼리ν μ μκ² λμμ΅λλ€:
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]
μλ₯Ό λ€μ΄, μ΄ μΏΌλ¦¬λ μ¬μ©μμ λ©ν last_nameμ κ°μ Έμ΅λλ€:
{
users {
id
lastName: metaValue(key: "last_name")
}
}λ©ν κ°μ 무μμ΄λ λ μ μμΌλ―λ‘(string, integer, float, λλ boolean), μλ‘κ² λμ
λ μ λ€λ¦ μ€μΉΌλΌ μ ν AnyScalarλ₯Ό ν΅ν΄ λ§€νλμμ΅λλ€.
λ©ν κ°μ κ³΅κ° λλ λΉκ³΅κ°μΌ μ μμ΅λλ€. μ΄λ€ λ©ν ν€λ₯Ό 쿼리ν μ μλμ§λ μ€μ νμ΄μ§μμ λͺ μμ μΌλ‘ ꡬμ±ν΄μΌ ν©λλ€:

κΈ°λ³Έμ μΌλ‘ νμ©λ λ©ν ν€ λͺ©λ‘μ λΉμ΄ μμ΅λλ€.
λ©λ΄
λ©λ΄κ° μλ‘μ΄ Menu μ νκ³Ό μλ‘μ΄ νλ Root.menuλ₯Ό ν΅ν΄ λ§€νλμμ΅λλ€.
{
menu(by: { id: 176 }) {
itemDataEntries
}
}μ€μ
μ¬μ΄νΈ μ€μ (ν
μ΄λΈ wp_optionsμ μ μ₯λ¨)μ μλ‘μ΄ νλ Root.option: AnyScalarλ₯Ό ν΅ν΄ 쿼리ν μ μκ² λμμ΅λλ€.
μλ₯Ό λ€μ΄, μ΄ μΏΌλ¦¬λ μ¬μ΄νΈ μ΄λ¦μ κ°μ Έμ΅λλ€:
{
siteName: optionValue(name: "blogname")
}μ΄λ€ μ΅μ μ μ κ·Όν μ μλμ§λ μ€μ νμ΄μ§μμ λͺ μμ μΌλ‘ ꡬμ±ν΄μΌ ν©λλ€:

κΈ°λ³Έμ μΌλ‘ λ€μ μ΅μ λ§ μΏΌλ¦¬ν μ μμ΅λλ€:
"home""blogname""blogdescription"
μ¬μ©μ κ²μλ¬Ό
λ‘κ·ΈμΈν μ¬μ©μλ λ€μ μλ‘μ΄ νλλ₯Ό ν΅ν΄ μμμ μν(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
}
}
}GraphQL μ€ν€λ§μ γ무μ νγκ΄λ¦¬μ νλ μΆκ°
GraphQL μ€ν€λ§λ κ³΅κ° APIμμ κ°μΈ μ λ³΄κ° λ ΈμΆλμ§ μλλ‘ κ³΅κ° νλμ λΉκ³΅κ° νλ κ°μ κ· νμ μ μ§ν΄μΌ ν©λλ€.
μλ‘μ΄ λͺ¨λ Schema for the Adminμ κ°μΈ λ°μ΄ν°λ₯Ό λ
ΈμΆν μ μλ γ무μ νγκ΄λ¦¬μ νλλ₯Ό 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 μ¬μμμ μμ§ μ§μλμ§ μκΈ° λλ¬Έμ
λλ€.
κΈ΄ νμμ μ€μ
μ€μ νμ΄μ§μ μ΅μ
μ νμΌλ‘ ꡬλΆλμ΄ μμ΅λλ€. v0.8λΆν°λ λͺ¨λλ₯Ό νλμ κΈ΄ νμ΄μ§μ ν¨κ» νμνλ κ²λ κ°λ₯ν©λλ€.
μ΄ λμμ νμ±ννλ €λ©΄ μ€μ μμ "Have all options in this Settings page be organized under tabs, one tab per module."μ 체ν¬λ₯Ό ν΄μ νκ³ "Save Changes"λ₯Ό λλ₯΄μμμ€:

κ·Έλ¬λ©΄ λͺ¨λ μ€μ μ΄ κΈ΄ νμμΌλ‘ ν¨κ» νμλ©λλ€:

νΈνμ±μ κΉ¨λ λ³κ²½ μ¬ν
λ¦΄λ¦¬μ€ v0.8μ μ΄μ λ²μ κ³Όμ νΈνμ±μ κΉ¨λ λ³κ²½ μ¬νμ ν¬ν¨ν©λλ€.
μ€μ νΈνμ± λ³κ²½
λ€μ CPTμ γOptionsγ λΈλ‘μ΄ μ¬κ΅¬μ±λμμ΅λλ€:
- Schema Configurations
- Custom Endpoints
- Persisted Queries
μ΄μ v0.7μμλ μ΄λ¬ν μν°ν°μ λ¨μΌ Options λΈλ‘μ λ§μ κ΅¬μ± νλͺ©μ΄ ν¬ν¨λμμ΅λλ€. v0.8λΆν° μ΄ λΈλ‘μ κ°μμ ꡬμ±μ κ°μ§ μ¬λ¬ λ
립μ μΈ λΈλ‘μΌλ‘ λΆλ¦¬λμμ΅λλ€.
μλ₯Ό λ€μ΄ v0.7μμλ (μλν¬μΈνΈ νμ±ν/λΉνμ±ν μΈμλ) Custom Endpoint Options λΈλ‘μμ GraphiQL λ° Interactive Schema ν΄λΌμ΄μΈνΈλ₯Ό ꡬμ±ν μ μμμ΅λλ€:

v0.8λΆν°λ μ΄ κ΅¬μ±μ΄ GraphiQL λ° Interactive Schema λΈλ‘μ ν΅ν΄ μΆκ°λ©λλ€:

μΈ CPT λͺ¨λμ Options λΈλ‘μ μ μ₯λ ꡬμ±μ μλ‘μ΄ νμμΌλ‘ μλμΌλ‘ λ§μ΄κ·Έλ μ΄μ
λμ§ μμ΅λλ€. λ°λΌμ v0.8λ‘ μ
κ·Έλ μ΄λνκΈ° μ μ μ μ₯λ ꡬμ±μ κΈ°λ‘ν΄ λμκ³ , μ λ²μ μΌλ‘ μ
κ·Έλ μ΄λν νμ λ€μ μ
λ ₯νμκΈ° λ°λλλ€.
λΆνΈμ λλ €μ μ£μ‘ν©λλ€.
λν μΈ CPTμ λͺ¨λ νλͺ©μ λν΄ WordPress νΈμ§κΈ°μ νμλλ γReset the templateγ λ²νΌμ ν΄λ¦ν΄μΌ ν©λλ€.

λΉνμ€ λλ ν°λΈ μ κ±°
λΉνμ€ λλ ν°λΈκ° νλ¬κ·ΈμΈμμ μ κ±°λμμ΅λλ€:
@default@removeIfNull@export
μ κ±°λ λͺ¨λ
λ€μ λͺ¨λμ΄ νλ¬κ·ΈμΈμμ μ κ±°λμμ΅λλ€:
- Field Deprecation
- Configuration Cache
- Schema Cache
- Multiple Query Execution
- Proactive Feedback
- Schema Editing Access
- Embeddable fields
ν₯ν λ‘λλ§΅
v0.8μ΄ μΆμλμμΌλ―λ‘, μμΌλ‘μ κ³νμ μΈμΈ μ μκ² λμμ΅λλ€.
νμ¬ κ³νμ λ€μκ³Ό κ°μ΅λλ€:
2021λ
9μμ v0.9 μΆμ μμ , λ΄μ©:
- Custom scalars
- μ μ ν κ²½μ° custom scalarsλ₯Ό μ¬μ©ν μ
λ°μ΄νΈλ GraphQL μ€ν€λ§ (μ:
Post.dateλStringλμDateμ νμ λ°ννκ² λ©λλ€) - νμ₯ κΈ°λ₯ μ§μμ μν μΆκ° κ°μ μ¬ν
κ·Έ ν, μ°λ§ λλ 2022λ
μ΄μ v1.0 μΆμ μμ , λ΄μ©:
- νμ₯ νλ¬κ·ΈμΈ λ°λͺ¨
- νμ₯ κΈ°λ₯ μμ±μ κ΄ν μμ ν λ¬Έμ κ°μ΄λ
wp.orgμμ Gato GraphQL νλ¬κ·ΈμΈ μΆμ
νμ¬ μνμ λν μλ¦Όμ λ°μΌλ €λ©΄ λ΄μ€λ ν°λ₯Ό ꡬλ νμΈμ.
λ¬Έμ κ° λ°μνμ ¨λμ?
v0.8μ μ€μΉνκ±°λ μ€ννλ λ° λ¬Έμ κ° μμΌμλ©΄ μ μ₯μμμ μ΄μλ₯Ό μμ±ν΄ μ£ΌμΈμ.