Chuyển trang hoặc mẫu Bricks giữa các site
Lấy một trang hoặc mẫu Bricks từ site WordPress này và sao chép sang site WordPress khác ở phía hạ nguồn

Chúng ta có thể sử dụng Gato GraphQL với tiện ích mở rộng Bricks để xuất một trang hoặc mẫu Bricks từ site WordPress này và sao chép sang site WordPress khác ở phía hạ nguồn.
Query này xuất một trang hoặc mẫu Bricks từ site WordPress này sang site WordPress khác ở phía hạ nguồn.
Plugin Gato GraphQL (phiên bản miễn phí) phải được cài đặt trên site hạ nguồn. Site đó phải công khai một endpoint với tùy chọn "Nested mutations" được bật.
Cả hai site đều phải cho phép truy cập vào custom post type tương ứng, bricks_template và/hoặc page.
Tham số $update chỉ định việc tạo mới hay cập nhật một trang/mẫu trên site hạ nguồn.
Nếu cập nhật trang/mẫu, định danh chung giữa site thượng nguồn và hạ nguồn là slug.
Chúng ta cần cung cấp các biến sau:
postSlug: Slug của trang hoặc mẫu Bricks cần chuyểndownstreamServerGraphQLEndpointURL: URL của endpoint GraphQL trên site WordPress hạ nguồnupdate: Tạo mới (false) hay cập nhật (true) trang/mẫu trên site hạ nguồnusername: Tên đăng nhập để xác thực trên site hạ nguồnappPassword: Mật khẩu ứng dụng để xác thực trên site hạ nguồn
Đây là GraphQL query:
query GetPostData(
$postTypes: [String!]! = ["bricks_template", "page"]
$postSlug: String!
) {
customPost(by: { slug: $postSlug }, customPostTypes: $postTypes, status: any)
@fail(
message: "There is no Bricks page or template in the upstream site with the provided slug"
data: {
slug: $postSlug
}
)
{
rawTitle
@export(as: "postTitle")
rawContent
@export(as: "postContent")
rawExcerpt
@export(as: "postExcerpt")
status
@export(as: "postStatus")
customPostType
@export(as: "postType")
metaKeys(filter: { exclude: ["_edit_last", "_edit_lock", "_pingme", "_encloseme", "_trackbackme", "enclosure", "_thumbnail_id", "_wp_trash_meta_status", "_wp_trash_meta_time", "_wp_desired_post_slug", "_wp_old_slug", "_wp_old_date"] })
meta(keys: $__metaKeys)
@export(as: "postMeta")
}
isMissingPostInUpstream: _isNull(value: $__customPost)
@export(as: "isMissingPostInUpstream")
}
query ExportDownstreamGraphQLQuery
@depends(on: "GetPostData")
@skip(if: $isMissingPostInUpstream)
{
query: _echo(value: """
mutation UpdatePost(
$update: Boolean! = false
$postSlug: String!
$postTitle: String!
$postContent: String!
$postExcerpt: String!
$postStatus: CustomPostStatusEnum!
$postType: String!
$postMeta: JSONObject!
) {
customPost(by: { slug: $postSlug }, customPostTypes: [$postType], status: any)
@include(if: $update)
{
id
update(input: {
title: $postTitle,
contentAs: { html: $postContent },
excerpt: $postExcerpt,
status: $postStatus,
meta: $postMeta
}) {
status
errors {
__typename
...on ErrorPayload {
message
}
}
...on GenericCustomPostUpdateMutationPayload {
customPost {
...CustomPostData
}
}
...on PostUpdateMutationPayload {
post {
...CustomPostData
}
}
...on PageUpdateMutationPayload {
page {
...CustomPostData
}
}
}
}
createCustomPost(input: {
title: $postTitle,
slug: $postSlug,
contentAs: { html: $postContent },
excerpt: $postExcerpt,
status: $postStatus,
customPostType: $postType,
meta: $postMeta
})
@skip(if: $update)
{
status
errors {
__typename
...on ErrorPayload {
message
}
}
customPost {
...CustomPostData
}
}
}
fragment CustomPostData on CustomPost {
id
title
slug
content
excerpt
status
meta(keys: [
"_bricks_editor_mode",
"_bricks_template_type",
"_bricks_page_content_2",
"_bricks_page_header_2",
"_bricks_page_footer_2",
])
}
"""
)
@export(as: "query")
@remove
}
query ExportPostToWPSite(
$downstreamServerGraphQLEndpointURL: String!
$update: Boolean! = false
$username: String!
$appPassword: String!
$postSlug: String!
)
@depends(on: "ExportDownstreamGraphQLQuery")
@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: "update",
value: $update
},
{
name: "postType",
value: $postType
},
{
name: "postSlug",
value: $postSlug
},
{
name: "postTitle",
value: $postTitle
},
{
name: "postContent",
value: $postContent
},
{
name: "postExcerpt",
value: $postExcerpt
},
{
name: "postStatus",
value: $postStatus
},
{
name: "postMeta",
value: $postMeta
}
],
options: {
headers: [
{
name: "Authorization",
value: $__loginCredentialsHeaderValue
}
]
}
}
)
}Các biến sẽ có dạng như sau:
{
"postSlug": "my-bricks-page",
"downstreamServerGraphQLEndpointURL": "https://downstream-site.com/graphql",
"update": false,
"username": "admin",
"appPassword": "your-app-password"
}