Démo Gato GraphQL + Bricks Builder + Import CSV

Créer des articles Bricks en masse depuis un CSV

Créez plusieurs articles Bricks en une seule fois en important des données depuis un fichier CSV, idéal pour la création de contenu en masse !

Logo
Image
Target Image
Target Image

Nous pouvons utiliser Gato GraphQL avec l'extension Bricks pour créer plusieurs articles Bricks en masse en important des données depuis un fichier CSV.

Cette requête crée plusieurs articles Bricks en masse en important des données depuis un fichier CSV.

Pour créer les articles, vous devez fournir :

  • Un modèle Bricks à reproduire, contenant des variables dans son contenu et ses données Bricks
  • Un type de publication personnalisé avec Bricks activé pour créer les nouveaux articles
  • L'URL d'un fichier CSV avec du contenu dynamique

Le fichier CSV aura les noms des variables comme noms de colonnes, et les valeurs seront les valeurs de chaque variable. La requête traitera chaque ligne du fichier CSV pour créer des articles Bricks individuels.

Par exemple, ce fichier CSV créera 3 articles :

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"

Le contenu de la page et les données Bricks contiendront ces variables, entourées de {...}.

Correspondant au CSV ci-dessus, notre article Bricks d'origine peut utiliser les variables suivantes :

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

Par exemple, le titre de la page pourrait être "{pageTitle}", ou "Welcome to {pageTitle}", etc.

De même, un élément heading de Bricks peut avoir sa propriété text définie sur "{heroTitle}", ou "Welcome to {heroTitle}", etc.

Et un élément button aura sa propriété Link => URL définie sur "{heroButtonLink1}", ou "{heroButtonLink2}".

Nous devons fournir les variables suivantes :

  • url : L'URL du fichier CSV (avec en-têtes)
  • templateId : Le modèle Bricks (du CPT bricks_template) à utiliser pour créer les nouveaux articles
  • customPostType : Le type de publication personnalisé avec Bricks activé pour créer les nouveaux articles
  • status : Le statut des articles créés (par défaut : "draft")

Voici la requête 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
      }
    }
  }
}

Les variables ressembleraient à ceci :

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

Abonnez-vous à notre newsletter

Restez au courant de toutes les nouveautés de Gato GraphQL.