Libreria di queries
Libreria di queriesCrea articoli Bricks in blocco da un CSV

Crea articoli Bricks in blocco da un CSV

Questa query crea più articoli Bricks in blocco importando dati da un file CSV.

Questa query richiede che l'estensione Bricks sia abilitata.

Per creare gli articoli, è necessario fornire:

  • Un modello Bricks da replicare, contenente variabili nel suo contenuto e nei dati Bricks
  • Un custom post type con Bricks abilitato per creare i nuovi articoli
  • L'URL di un file CSV con il contenuto dinamico

Il file CSV avrà i nomi delle variabili come nomi di colonna, e i valori saranno i valori di ciascuna variabile. La query elaborerà ogni riga del file CSV per creare singoli articoli Bricks.

Ad esempio, questo file CSV creerà 3 articoli:

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"

Il contenuto della pagina e i dati Bricks conterranno quelle variabili, racchiuse tra {...}.

In corrispondenza del CSV precedente, il nostro articolo Bricks di origine può utilizzare le seguenti variabili:

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

Ad esempio, il titolo della pagina potrebbe essere "{pageTitle}", oppure "Welcome to {pageTitle}", ecc.

Allo stesso modo, un elemento heading di Bricks può avere la sua proprietà text impostata su "{heroTitle}", oppure "Welcome to {heroTitle}", ecc.

E un elemento button avrà la sua proprietà Link => URL impostata su "{heroButtonLink1}", oppure "{heroButtonLink2}".

La query richiede le seguenti variabili:

  • $url: L'URL del file CSV (con intestazioni)
  • $templateId: Il modello Bricks (di CPT bricks_template) da utilizzare per creare i nuovi articoli
  • $customPostType: Il custom post type con Bricks abilitato per creare i nuovi articoli
  • $status: Lo stato degli articoli creati (predefinito: "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
      }
    }
  }
}