Gato GraphQL + Meta Box demosu

2 site arasında gönderi senkronizasyonu, Meta Box (ve Slim SEO) meta verileri dahil

WordPress için Gato GraphQL kullanarak bir gönderiyi ve Meta Box verilerini (ayrıca Slim SEO) bir WordPress sitesinden diğerine senkronize edin

Leonardo Losoviz
Leonardo Losoviz -
Logo
Image
Target Image
Target Image

Meta Box aracılığıyla yönetilen veya Slim SEO (ya da diğer eklentiler) tarafından eklenen meta veriler dahil, bir gönderiyi bir WordPress sitesinden diğerine senkronize edebiliriz.

Bu demoda, GraphQL kullanarak şunları yapacağız:

  1. Kaynak siteden bir gönderiyi ve tüm meta verilerini çekme
  2. Hedef sitede yeni bir gönderi oluşturma veya mevcut bir gönderiyi güncelleme ve kaynak siteden gönderi verilerini ile meta verilerini kopyalama

Bu query şunları gerektirir:

  • Kaynak sitede Gato GraphQL + PRO uzantıları
  • Hedef sitede ücretsiz Gato GraphQL eklentisi
  • Hedef sitenin endpoint'inde etkinleştirilmiş İç içe Mutations

Aşağıdaki değişkenleri sağlamamız gerekir:

  • postType: Siteler arasında senkronize edilecek gönderinin özel gönderi türü
  • postSlug: Siteler arasında senkronize edilecek gönderinin slug'ı
  • downstreamServerGraphQLEndpointURL: Hedef WordPress sitesinin GraphQL endpoint URL'si
  • username: Hedef sitede kimlik doğrulamak için kullanılacak uygulama şifresinin kullanıcı adı
  • appPassword: Hedef sitede kimlik doğrulamak için kullanılacak uygulama şifresinin parolası
  • update: Mevcut bir gönderiyi güncelleyip güncellemeyeceğiniz (true) veya yeni bir tane oluşturup oluşturmayacağınız (false)

Gönderi güncelleniyorsa, yukarı akış ve aşağı akış siteleri arasındaki ortak tanımlayıcı gönderi slug'ıdır.

GraphQL query'si kaynak sitede çalıştırılmalıdır.

İşte GraphQL query'si:

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

Değişkenler şu şekilde görünecektir:

{
  "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 }"
}

Bültenimize abone olun

Gato GraphQL'deki tüm güncellemelerden haberdar olun.