Demo Gato GraphQL + Meta Box
Menyinkronkan postingan antar 2 situs, termasuk metadata Meta Box (dan juga Slim SEO)
Sinkronkan postingan beserta data Meta Box (dan juga Slim SEO) dari satu situs WordPress ke situs lainnya, menggunakan Gato GraphQL untuk WordPress
Leonardo Losoviz -


Kita dapat menyinkronkan postingan dari satu situs WordPress ke situs lainnya, termasuk metadata yang dikelola melalui Meta Box, atau yang ditambahkan oleh Slim SEO (atau plugin lainnya).
Dalam demo ini, kita akan menggunakan GraphQL untuk:
- Mengambil sebuah postingan beserta semua metadatanya dari situs sumber
- Membuat postingan baru atau memperbarui postingan yang sudah ada di situs target, dan menyalin data postingan serta metadata dari situs asal
Query ini memerlukan:
- Gato GraphQL + ekstensi PRO di situs sumber
- Plugin Gato GraphQL gratis di situs target
- Nested Mutations diaktifkan pada endpoint situs target
Kita harus menyediakan variabel berikut:
postType: Custom post type dari postingan yang akan disinkronkan antar situspostSlug: Slug dari postingan yang akan disinkronkan antar situsdownstreamServerGraphQLEndpointURL: URL endpoint GraphQL dari situs WordPress targetusername: Nama pengguna application password untuk autentikasi di situs targetappPassword: Kata sandi application password untuk autentikasi di situs targetupdate: Apakah akan memperbarui postingan yang sudah ada (true) atau membuat yang baru (false)
Jika memperbarui postingan, pengenal bersama antara situs upstream dan downstream adalah slug postingan.
Query GraphQL harus dieksekusi di situs asal.
Berikut adalah query GraphQL-nya:
query CheckHasCustomPost($postSlug: String!, $postType: String! = post)
{
customPost(by: { slug: $postSlug }, status: any, customPostTypes: [$postType])
@fail(
message: "There is no post in the upstream site with the provided slug"
data: {
slug: $postSlug
}
)
{
rawTitle
@export(as: "postTitle")
rawContent
@export(as: "postContent")
rawExcerpt
@export(as: "postExcerpt")
metaKeys(filter: { exclude: [
"_thumbnail_id",
"_edit_last",
] })
meta(keys: $__metaKeys)
@export(as: "postMeta")
}
isMissingPostInUpstream: _isNull(value: $__customPost)
@export(as: "isMissingPostInUpstream")
}
query ExportCreateCustomPostOnTargetSiteGraphQLQuery(
$update: Boolean! = false
)
@depends(on: "CheckHasCustomPost")
@skip(if: $isMissingPostInUpstream)
@skip(if: $update)
{
query: _echo(value: """
mutation CreateCustomPost(
$postType: String! = post
$postSlug: String!
$postTitle: String!
$postExcerpt: String!
$postContent: String!
$postMeta: NullableListValueJSONObject!
) {
createCustomPost(input: {
customPostType: $postType
title: $postTitle,
excerpt: $postExcerpt,
slug: $postSlug,
contentAs: { html: $postContent },
status: draft,
meta: $postMeta,
}) {
status
errors {
__typename
...on ErrorPayload {
message
}
}
customPost {
__typename
...on CustomPost {
customPostType
title
excerpt
slug
content
status
}
}
}
}
"""
)
@export(as: "query")
@remove
}
query ExportUpdateCustomPostOnTargetSiteGraphQLQuery(
$update: Boolean! = false
)
@depends(on: "CheckHasCustomPost")
@skip(if: $isMissingPostInUpstream)
@include(if: $update)
{
query: _echo(value: """
mutation UpdateCustomPost(
$postType: String! = post
$postSlug: String!
$postTitle: String!
$postContent: String!
$postExcerpt: String!
$postMeta: NullableListValueJSONObject!
) {
customPost(by: { slug: $postSlug }, status: any, customPostTypes: [$postType]) {
update(input: {
title: $postTitle,
excerpt: $postExcerpt,
contentAs: { html: $postContent },
meta: $postMeta,
}) {
status
errors {
__typename
...on ErrorPayload {
message
}
}
customPost {
__typename
...on CustomPost {
customPostType
title
excerpt
slug
content
status
}
}
}
}
}
"""
)
@export(as: "query")
@remove
}
query CreateOrUpdateCustomPostOnTargetSite(
$downstreamServerGraphQLEndpointURL: String!
$postSlug: String!
$username: String!
$appPassword: String!
$postType: String! = post
)
@depends(on: [
"ExportCreateCustomPostOnTargetSiteGraphQLQuery",
"ExportUpdateCustomPostOnTargetSiteGraphQLQuery",
])
@skip(if: $isMissingPostInUpstream)
{
loginCredentials: _sprintf(
string: "%s:%s",
values: [$username, $appPassword]
)
@remove
base64EncodedLoginCredentials: _strBase64Encode(
string: $__loginCredentials
)
@remove
loginCredentialsHeaderValue: _sprintf(
string: "Basic %s",
values: [$__base64EncodedLoginCredentials]
)
@remove
_sendGraphQLHTTPRequest(
input: {
endpoint: $downstreamServerGraphQLEndpointURL,
query: $query,
variables: [
{
name: "postSlug",
value: $postSlug
},
{
name: "postTitle",
value: $postTitle
},
{
name: "postContent",
value: $postContent
},
{
name: "postExcerpt",
value: $postExcerpt
},
{
name: "postMeta",
value: $postMeta
},
{
name: "postType",
value: $postType
}
],
options: {
headers: [
{
name: "Authorization",
value: $__loginCredentialsHeaderValue
}
]
}
}
)
}Variabelnya akan terlihat seperti ini:
{
"postType": "post",
"postSlug": "hello-world",
"downstreamServerGraphQLEndpointURL": "https://target-site.com/graphql",
"update": false,
"username": "admin",
"appPassword": "{ application password, eg: cNEp BVPy QVxF eVqH lggt BTb4 }"
}