Membuat postingan Bricks secara massal dari CSV
Query ini membuat beberapa postingan Bricks secara massal dengan mengimpor data dari file CSV.
Query ini memerlukan ekstensi Bricks untuk diaktifkan.
Untuk membuat postingan, Anda harus menyediakan:
- Sebuah template Bricks untuk direplikasi, yang berisi variabel dalam konten dan data Bricks-nya
- Sebuah custom post type yang diaktifkan Bricks untuk membuat postingan baru
- URL file CSV dengan konten dinamis
File CSV akan memiliki nama variabel sebagai nama kolom, dan nilai-nilainya akan menjadi nilai untuk setiap variabel. Query akan memproses setiap baris dari file CSV untuk membuat postingan Bricks secara individual.
Misalnya, file CSV ini akan membuat 3 postingan:
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"Konten halaman dan data Bricks akan memuat variabel-variabel tersebut, dikelilingi oleh {...}.
Sesuai dengan CSV di atas, postingan Bricks asal kita dapat menggunakan variabel-variabel berikut:
{pageTitle}{heroTitle}{heroDesc}{heroButtonText1}{heroButtonLink1}{heroButtonText2}{heroButtonLink2}
Misalnya, judul halaman bisa berupa "{pageTitle}", atau "Welcome to {pageTitle}", dan sebagainya.
Demikian pula, sebuah elemen heading Bricks dapat memiliki properti text yang diatur ke "{heroTitle}", atau "Welcome to {heroTitle}", dan sebagainya.
Dan sebuah elemen button akan memiliki properti Link => URL yang diatur ke "{heroButtonLink1}", atau "{heroButtonLink2}".
Query memerlukan variabel-variabel berikut:
$url: URL file CSV (dengan header)$templateId: Template Bricks (dari CPTbricks_template) yang digunakan untuk membuat postingan baru$customPostType: Custom post type yang diaktifkan Bricks untuk membuat postingan baru$status: Status untuk postingan yang dibuat (default:"draft")
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
}
}
}
}