Demo Gato GraphQL + Bricks Builder + Nhập CSV

Tạo bài viết Bricks hàng loạt từ CSV

Tạo nhiều bài viết Bricks cùng lúc bằng cách nhập dữ liệu từ tệp CSV, hoàn hảo cho việc tạo nội dung hàng loạt!

Logo
Image
Target Image
Target Image

Chúng ta có thể sử dụng Gato GraphQL với tiện mở rộng Bricks để tạo nhiều bài viết Bricks hàng loạt bằng cách nhập dữ liệu từ tệp CSV.

Query này tạo nhiều bài viết Bricks hàng loạt bằng cách nhập dữ liệu từ tệp CSV.

Để tạo các bài viết, bạn phải cung cấp:

  • Một mẫu Bricks để sao chép, chứa các biến trong nội dung và dữ liệu Bricks của nó
  • Một loại bài đăng tùy chỉnh được bật Bricks để tạo các bài viết mới
  • URL của tệp CSV với nội dung động

Tệp CSV sẽ có tên biến làm tên cột, và các giá trị sẽ là giá trị cho mỗi biến. Query sẽ xử lý từng hàng từ tệp CSV để tạo các bài viết Bricks riêng lẻ.

Ví dụ, tệp CSV này sẽ tạo 3 bài viết:

pageTitle,heroTitle,heroDesc,heroButtonText1,heroButtonLink1,heroButtonText2,heroButtonLink2
"Welcome to Our Site","<h2>Welcome</h2>","<p>This is the main content.</p>","A brief description","https://mysite.com/pricing","Another description","https://mysite.com/more"
"About Us","<h2>About</h2>","<p>Learn more about our company.</p>","Company information","https://mysite.com/about","We are humans","https://mysite.com/humans"
"Contact","<h2>Contact</h2>","<p>Get in touch with us.</p>","Contact details","https://mysite.com/contact","Subscribe to our newsletter","https://mysite.com/newsletter"

Nội dung trang và dữ liệu Bricks sẽ chứa các biến đó, được bao quanh bởi {...}.

Tương ứng với CSV ở trên, bài viết Bricks gốc của chúng ta có thể sử dụng các biến sau:

  • {pageTitle}
  • {heroTitle}
  • {heroDesc}
  • {heroButtonText1}
  • {heroButtonLink1}
  • {heroButtonText2}
  • {heroButtonLink2}

Ví dụ, tiêu đề trang có thể là "{pageTitle}", hoặc "Welcome to {pageTitle}", v.v.

Tương tự, một phần tử heading của Bricks có thể có thuộc tính text được đặt thành "{heroTitle}", hoặc "Welcome to {heroTitle}", v.v.

Và một phần tử button sẽ có thuộc tính Link => URL được đặt thành "{heroButtonLink1}", hoặc "{heroButtonLink2}".

Chúng ta phải cung cấp các biến sau:

  • url: URL của tệp CSV (có tiêu đề)
  • templateId: Mẫu Bricks (của CPT bricks_template) dùng để tạo các bài viết mới
  • customPostType: Loại bài đăng tùy chỉnh được bật Bricks để tạo các bài viết mới
  • status: Trạng thái cho các bài viết được tạo (mặc định: "draft")

Đây là query GraphQL:

query InitializeDynamicVariables(
  $customPostType: CustomPostEnumString!
)
  @configureWarningsOnExportingDuplicateVariable(enabled: false)
{
  emptyBool: _echo(value: false)
    @export(as: "bricksIsEnabledForCustomPostType")
    @export(as: "hasTemplate")
    @remove
 
  emptyList: _echo(value: [])
    @export(as: "adaptedBricksDataTextElementTextsList")
    @export(as: "adaptedBricksDataLinkElementLinksList")
    @export(as: "newCustomPostIds")
    @export(as: "customPostInputs")
    @remove
 
  useWhichPageBuilderWithCustomPostType(customPostType: $customPostType)
  bricksIsEnabledForCustomPostType: _equals(
    value1: $__useWhichPageBuilderWithCustomPostType
    value2: "bricks"
  )
    @export(as: "bricksIsEnabledForCustomPostType")
}
 
query GetBricksCustomPostAndExportData($templateId: ID!)
  @depends(on: "InitializeDynamicVariables")
  @include(if: $bricksIsEnabledForCustomPostType)
{
  bricksTemplate: customPost(by: { id: $templateId }, customPostTypes: "bricks_template", status: any) {
    # Fields to be duplicated
    author @export(as: "authorID") {
      id
    }
    rawContent @export(as: "rawContent")
    rawExcerpt @export(as: "excerpt")
    featuredImage @export(as: "featuredImageID") {
      id
    }
    rawTitle @export(as: "title")
 
    metaKeys(filter: { exclude: [
      "_thumbnail_id",
      "_edit_last",
      "_edit_lock",
      "_pingme",
      "_encloseme",
      "_trackbackme",
      "enclosure",
      "_wp_trash_meta_status",
      "_wp_trash_meta_time",
      "_wp_desired_post_slug",
      "_wp_old_slug",
      "_wp_old_date",
    ] })
    meta(keys: $__metaKeys) 
      @export(as: "meta")
 
    bricksDataTextElements: bricksData(filterBy: {include: [
      "heading",
      "text",
      "text-basic",
      "button",
      "dropdown",
    ]})
      @underEachArrayItem(
        affectDirectivesUnderPos: [1, 3]
      )
        @underJSONObjectProperty(by: { key: "id" })
          @export(as: "bricksDataTextElementIDs")
        @underJSONObjectProperty(
          by: { path: "settings.text" }
          failIfNonExistingKeyOrPath: false
        )
          @export(as: "bricksDataTextElementTexts")
 
    bricksDataLinkElements: bricksData(filterBy: {include: [
      "text-link",
      "button",
    ]})
      @underEachArrayItem(
        affectDirectivesUnderPos: [1, 3]
      )
        @underJSONObjectProperty(by: { key: "id" })
          @export(as: "bricksDataLinkElementIDs")
        @underJSONObjectProperty(
          by: { path: "settings.link.url" }
          failIfNonExistingKeyOrPath: false
        )
          @export(as: "bricksDataLinkElementLinks")
  }
 
  hasTemplate: _notNull(value: $__bricksTemplate)
    @export(as: "hasTemplate")
}
 
query GetAndFormatDataFromCSV(
  $url: URL!
)
  @depends(on: "GetBricksCustomPostAndExportData")
  @include(if: $bricksIsEnabledForCustomPostType)
  @include(if: $hasTemplate)
{
  _sendHTTPRequest(input: {
    url: $url,
    method: GET
  }) {
    body
    csv: _strParseCSV(
      string: $__body
    )
      @export(as: "csvPostEntries")
      @underArrayItem(
        index: 0
        passOnwardsAs: "csvPostEntry"
        affectDirectivesUnderPos: [1, 2]
      )
        @applyField(
          name: "_objectProperties",
          arguments: {
            object: $csvPostEntry,
          },
          passOnwardsAs: "csvKeys"
        )
        @exportFrom(
          scopedDynamicVariable: $csvKeys,
          as: "csvKeys"
        )      
  }
}
 
query GenerateVariablePlaceholderNames
  @depends(on: "GetAndFormatDataFromCSV")
  @include(if: $bricksIsEnabledForCustomPostType)
  @include(if: $hasTemplate)
{
    csvKeyPlaceholderNames: _echo(value: $csvKeys)
      @underEachArrayItem(passValueOnwardsAs: "entryKey")
        @applyField(
          name: "_sprintf",
          arguments: {
            string: "{%s}",
            values: [$entryKey],
          },
          setResultInResponse: true
        )
      @export(as: "csvKeyPlaceholderNames")
}
 
query GenerateCustomPostInputs(
  $customPostType: CustomPostEnumString!
  $status: CustomPostStatusEnum! = draft
)
  @depends(on: "GenerateVariablePlaceholderNames")
  @include(if: $bricksIsEnabledForCustomPostType)
  @include(if: $hasTemplate)
{
  customPostInputs: _echo(value: $csvPostEntries)
    @underEachArrayItem(
      passValueOnwardsAs: "csvPostEntry"
      affectDirectivesUnderPos: [1, 2, 3, 4, 5, 6, 7, 8]
    )
      @applyField(
        name: "_objectValues",
        arguments: {
          object: $csvPostEntry,
        },
        passOnwardsAs: "replaceTo"
      )
      @applyField(
        name: "_strReplaceMultiple",
        arguments: {
          search: $csvKeyPlaceholderNames,
          replaceWith: $replaceTo,
          in: $title
        },
        passOnwardsAs: "adaptedTitle"
      )
      @applyField(
        name: "_strReplaceMultiple",
        arguments: {
          search: $csvKeyPlaceholderNames,
          replaceWith: $replaceTo,
          in: $excerpt
        },
        passOnwardsAs: "adaptedExcerpt"
      )
      # Already create (and export) the inputs for the mutation
      @applyField(
        name: "_echo",
        arguments: {
          value: {
            status: $status,
            customPostType: $customPostType,
            authorBy: {
              id: $authorID
            },
            title: $adaptedTitle,
            excerpt: $adaptedExcerpt
            contentAs: {
              html: $rawContent
            },
            featuredImageBy: {
              id: $featuredImageID
            },
            meta: $meta
          }
        },
        setResultInResponse: true
      )
      # Already export the inputs to update the Bricks data
      @applyField(
        name: "_strArrayReplaceMultiple",
        arguments: {
          search: $csvKeyPlaceholderNames,
          replaceWith: $replaceTo,
          in: $bricksDataTextElementTexts
        },
        passOnwardsAs: "adaptedBricksDataTextElementTextsList"
      )
      @exportFrom(
        scopedDynamicVariable: $adaptedBricksDataTextElementTextsList,
        as: "adaptedBricksDataTextElementTextsList"
      )
      @applyField(
        name: "_strArrayReplaceMultiple",
        arguments: {
          search: $csvKeyPlaceholderNames,
          replaceWith: $replaceTo,
          in: $bricksDataLinkElementLinks
        },
        passOnwardsAs: "adaptedBricksDataLinkElementLinksList"
      )
      @exportFrom(
        scopedDynamicVariable: $adaptedBricksDataLinkElementLinksList,
        as: "adaptedBricksDataLinkElementLinksList"
      )
    @export(as: "customPostInputs")
}
 
query AdaptBricksDataElementsFormat
  @depends(on: "GenerateCustomPostInputs")
  @include(if: $bricksIsEnabledForCustomPostType)
  @include(if: $hasTemplate)
{
  adaptedBricksDataTextElementsList: _echo(value: $adaptedBricksDataTextElementTextsList)
    @underEachArrayItem
      @underEachArrayItem(
        passIndexOnwardsAs: "index"
        passValueOnwardsAs: "bricksDataTextElementText"
        affectDirectivesUnderPos: [1, 2]
      )
        @applyField(
          name: "_arrayItem"
          arguments: {
            array: $bricksDataTextElementIDs,
            position: $index
          }
          passOnwardsAs: "bricksElementID"
        )
        @applyField(
          name: "_echo"
          arguments: {
            value: {
              id: $bricksElementID,
              settings: {
                text: $bricksDataTextElementText
              }
            }
          },
          setResultInResponse: true
        )
      @export(as: "adaptedBricksDataTextElementsList")
 
  adaptedBricksDataLinkElementsList: _echo(value: $adaptedBricksDataLinkElementLinksList)
    @underEachArrayItem
      @underEachArrayItem(
        passIndexOnwardsAs: "index"
        passValueOnwardsAs: "bricksDataLinkElementLink"
        affectDirectivesUnderPos: [1, 2]
      )
        @applyField(
          name: "_arrayItem"
          arguments: {
            array: $bricksDataLinkElementIDs,
            position: $index
          }
          passOnwardsAs: "bricksElementID"
        )
        @applyField(
          name: "_echo"
          arguments: {
            value: {
              id: $bricksElementID,
              settings: {
                link: {
                  url: $bricksDataLinkElementLink
                }
              }
            }
          },
          setResultInResponse: true
        )
      @export(as: "adaptedBricksDataLinkElementsList")
}
 
mutation CreatePostsFromCSVEntries
  @depends(on: "AdaptBricksDataElementsFormat")
  @include(if: $bricksIsEnabledForCustomPostType)
  @include(if: $hasTemplate)
{
  createCustomPosts(inputs: $customPostInputs) {
    status
    errors {
      __typename
      ...on ErrorPayload {
        message
      }
    }
    customPost {
      # Fields not to be duplicated
      id
        @export(
          as: "newCustomPostIds",
          type: LIST,
        )
      slug
      date
      status
 
      # Fields to be duplicated
      customPostType
      author {
        id
      }
      rawContent
      excerpt
      featuredImage {
        id
      }
      title
      
      metaKeys
      meta(keys: $__metaKeys)
      bricksData
    }
  }
}
 
query CreateUpdateBricksDataInputs
  @depends(on: "CreatePostsFromCSVEntries")
  @include(if: $bricksIsEnabledForCustomPostType)
  @include(if: $hasTemplate)
{
  bricksMergeCustomPostTextElementDataItemInputs: _echo(value: $newCustomPostIds)
    @underEachArrayItem(
      passIndexOnwardsAs: "index"
      passValueOnwardsAs: "newCustomPostId"
      affectDirectivesUnderPos: [1, 2]
    )
      @applyField(
        name: "_arrayItem"
        arguments: {
          array: $adaptedBricksDataTextElementsList,
          position: $index
        }
        passOnwardsAs: "adaptedBricksDataTextElements"
      )
      @applyField(
        name: "_echo",
        arguments: {
          value: {
            customPostID: $newCustomPostId
            elements: $adaptedBricksDataTextElements
          }
        },
        setResultInResponse: true
      )
    @export(as: "bricksMergeCustomPostTextElementDataItemInputs")
 
  bricksMergeCustomPostLinkElementDataItemInputs: _echo(value: $newCustomPostIds)
    @underEachArrayItem(
      passIndexOnwardsAs: "index"
      passValueOnwardsAs: "newCustomPostId"
      affectDirectivesUnderPos: [1, 2]
    )
      @applyField(
        name: "_arrayItem"
        arguments: {
          array: $adaptedBricksDataLinkElementsList,
          position: $index
        }
        passOnwardsAs: "adaptedBricksDataLinkElements"
      )
      @applyField(
        name: "_echo",
        arguments: {
          value: {
            customPostID: $newCustomPostId
            elements: $adaptedBricksDataLinkElements
          }
        },
        setResultInResponse: true
      )
    @export(as: "bricksMergeCustomPostLinkElementDataItemInputs")
 
  bricksRegenerateCustomPostElementIDSetInputs: _echo(value: $newCustomPostIds)
    @underEachArrayItem(passValueOnwardsAs: "newCustomPostId")
      @applyField(
        name: "_echo",
        arguments: {
          value: {
            customPostID: $newCustomPostId
          }
        },
        setResultInResponse: true
      )
    @export(as: "bricksRegenerateCustomPostElementIDSetInputs")
}
 
query AdaptBricksDataInputs
  @depends(on: "CreateUpdateBricksDataInputs")
  @include(if: $bricksIsEnabledForCustomPostType)
  @include(if: $hasTemplate)
{
  bricksMergeCustomPostElementDataItemInputs: _arrayMerge(arrays: [
    $bricksMergeCustomPostTextElementDataItemInputs,
    $bricksMergeCustomPostLinkElementDataItemInputs
  ])
    @export(as: "bricksMergeCustomPostElementDataItemInputs")
}
 
mutation UpdateAndRegenerateBricksData
  @depends(on: "AdaptBricksDataInputs")
  @include(if: $bricksIsEnabledForCustomPostType)
  @include(if: $hasTemplate)
{
  bricksMergeCustomPostElementDataItems(inputs: $bricksMergeCustomPostElementDataItemInputs) {
    status
    errors {
      __typename
      ...on ErrorPayload {
        message
      }
    }
    customPost {
      __typename
      ...on CustomPost {
        id
        bricksData
      }
    }
  }
 
  bricksRegenerateCustomPostElementIDSets(inputs: $bricksRegenerateCustomPostElementIDSetInputs) {
    status
    errors {
      __typename
      ...on ErrorPayload {
        message
      }
    }
    customPost {
      __typename
      ...on CustomPost {
        id
        bricksData
      }
    }
  }
}

Các biến sẽ trông như thế này:

{
  "url": "https://example.com/data.csv",
  "templateId": 123,
  "customPostType": "page"
}

Đăng ký nhận bản tin của chúng tôi

Cập nhật tất cả những điều mới từ Gato GraphQL.