Crear entradas de Bricks en lote desde un CSV
Esta consulta crea varias entradas de Bricks en lote importando datos desde un archivo CSV.
Esta consulta requiere que la extensión Bricks esté habilitada.
Para crear las entradas debes proporcionar:
- Una plantilla de Bricks a replicar, que contenga variables en su contenido y datos de Bricks
- Un custom post type con Bricks habilitado para crear las nuevas entradas
- La URL de un archivo CSV con el contenido dinámico
El archivo CSV tendrá los nombres de variables como nombres de columnas, y los valores serán los valores de cada variable. La consulta procesará cada fila del archivo CSV para crear entradas de Bricks individuales.
Por ejemplo, este archivo CSV creará 3 entradas:
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"El contenido de la página y los datos de Bricks contendrán esas variables, rodeadas por {...}.
En correspondencia con el CSV anterior, nuestra entrada de Bricks de origen puede utilizar las siguientes variables:
{pageTitle}{heroTitle}{heroDesc}{heroButtonText1}{heroButtonLink1}{heroButtonText2}{heroButtonLink2}
Por ejemplo, el título de la página podría ser "{pageTitle}", o "Welcome to {pageTitle}", etc.
Del mismo modo, un elemento heading de Bricks puede tener su propiedad text configurada como "{heroTitle}", o "Welcome to {heroTitle}", etc.
Y un elemento button tendrá su propiedad Link => URL configurada como "{heroButtonLink1}", o "{heroButtonLink2}".
La consulta requiere las siguientes variables:
$url: La URL del archivo CSV (con cabeceras)$templateId: La plantilla de Bricks (de CPTbricks_template) a utilizar para crear las nuevas entradas$customPostType: El custom post type con Bricks habilitado para crear las nuevas entradas$status: El estado para las entradas creadas (por defecto:"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
}
}
}
}