Thư viện QueriesĐồng bộ bài viết giữa các trang
Đồng bộ bài viết giữa các trang
Query này được minh họa trong bản demo Đồng bộ một bài viết giữa 2 trang, bao gồm siêu dữ liệu Meta Box (và cả Slim SEO).
Query này đồng bộ một bài viết từ một trang WordPress sang trang khác, bao gồm cả siêu dữ liệu.
Nó thực hiện các thao tác sau:
- Lấy một bài viết và tất cả siêu dữ liệu của nó từ trang nguồn
- Tạo mới hoặc cập nhật bài viết hiện có trên trang đích, sao chép dữ liệu bài viết và siêu dữ liệu từ trang gốc
Query này yêu cầu:
- Gato GraphQL + các tiện ích mở rộng PRO trên trang nguồn
- Plugin Gato GraphQL miễn phí trên trang đích
- Nested Mutations được bật trên endpoint của trang đích
Các biến bắt buộc là:
postType: Loại bài viết tùy chỉnh cần đồng bộ giữa các trangpostSlug: Slug của bài viết cần đồng bộ giữa các trangdownstreamServerGraphQLEndpointURL: URL endpoint GraphQL của trang WordPress đíchusername: Tên người dùng của mật khẩu ứng dụng để xác thực trên trang đíchappPassword: Mật khẩu của mật khẩu ứng dụng để xác thực trên trang đíchupdate: Có cập nhật bài viết hiện có (true) hay tạo mới (false)
Nếu cập nhật bài viết, định danh chung giữa trang upstream và downstream là slug của bài viết.
Query GraphQL phải được thực thi trên trang gốc.
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
}
]
}
}
)
}Các biến sẽ trông như thế này:
{
"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 }"
}