Crear entradas de Bricks en bloque desde un CSV
Crea varias entradas de Bricks a la vez importando datos desde un archivo CSV, ¡perfecto para crear contenido en bloque!

Podemos usar Gato GraphQL con la extensión de Bricks para crear varias entradas de Bricks en bloque importando datos desde un archivo CSV.
Esta consulta crea varias entradas de Bricks en bloque importando datos desde un archivo CSV.
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 donde crear las nuevas entradas
- La URL de un archivo CSV con contenido dinámico
El archivo CSV tendrá 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 {...}.
Correspondiendo al 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.
Asimismo, un elemento heading de Bricks puede tener su propiedad text establecida en "{heroTitle}", o "Welcome to {heroTitle}", etc.
Y un elemento button tendrá su propiedad Link => URL establecida en "{heroButtonLink1}", o "{heroButtonLink2}".
Debemos proporcionar las siguientes variables:
url: La URL del archivo CSV (con encabezados)templateId: La plantilla de Bricks (del CPTbricks_template) a usar para crear las nuevas entradascustomPostType: El custom post type con Bricks habilitado donde crear las nuevas entradasstatus: El estado para las entradas creadas (por defecto:"draft")
Aquí está la consulta 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
}
}
}
}Las variables tendrían un aspecto similar a este:
{
"url": "https://example.com/data.csv",
"templateId": 123,
"customPostType": "page"
}