Gato GraphQL + Bricks Builder เดโม

การถ่ายโอนหน้าหรือเทมเพลต Bricks ข้ามเว็บไซต์

ดึงข้อมูลหน้าหรือเทมเพลต Bricks จากเว็บไซต์ WordPress นี้ และทำซ้ำในเว็บไซต์ WordPress ปลายทาง

Leonardo Losoviz
Leonardo Losoviz -
Logo
Image
Target Image

เราสามารถใช้ Gato GraphQL ร่วมกับ Bricks extension เพื่อส่งออกหน้าหรือเทมเพลต Bricks จากเว็บไซต์ WordPress นี้ และทำซ้ำในเว็บไซต์ WordPress ปลายทาง

queries นี้ส่งออกหน้าหรือเทมเพลต Bricks จากเว็บไซต์ WordPress นี้ไปยังเว็บไซต์ WordPress ปลายทาง

ต้องติดตั้งปลั๊กอิน Gato GraphQL (เวอร์ชันฟรี) บนเว็บไซต์ปลายทาง และต้องเปิดใช้งาน endpoint ที่เปิดใช้ "Nested mutations"

ทั้งสองเว็บไซต์ต้องอนุญาตการเข้าถึง custom post type ที่เกี่ยวข้อง ได้แก่ bricks_template และ/หรือ page

พารามิเตอร์ $update ระบุว่าจะสร้างหรืออัปเดตหน้า/เทมเพลตในเว็บไซต์ปลายทาง

หากอัปเดตหน้า/เทมเพลต ตัวระบุร่วมระหว่างเว็บไซต์ต้นทางและปลายทางคือ slug

เราต้องระบุตัวแปรดังต่อไปนี้:

  • postSlug: Slug ของหน้าหรือเทมเพลต Bricks ที่ต้องการถ่ายโอน
  • downstreamServerGraphQLEndpointURL: URL ของ GraphQL endpoint บนเว็บไซต์ WordPress ปลายทาง
  • update: จะสร้าง (false) หรืออัปเดต (true) หน้า/เทมเพลตในเว็บไซต์ปลายทาง
  • username: ชื่อผู้ใช้สำหรับการยืนยันตัวตนบนเว็บไซต์ปลายทาง
  • appPassword: รหัสผ่านแอปพลิเคชันสำหรับการยืนยันตัวตนบนเว็บไซต์ปลายทาง

ต่อไปนี้คือ GraphQL queries:

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
          }
        ]
      }
    }
  )
}

ตัวแปรจะมีลักษณะดังนี้:

{
  "postSlug": "my-bricks-page",
  "downstreamServerGraphQLEndpointURL": "https://downstream-site.com/graphql",
  "update": false,
  "username": "admin",
  "appPassword": "your-app-password"
}

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

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