Lezione 9: Inserire/Rimuovere un blocco (Gutenberg) in blocco
Possiamo aggiornare i post modificando il contenuto HTML dei loro blocchi (Gutenberg).
Tra gli altri casi d'uso, questo è utile per promuovere campagne (ad esempio quando si offre uno sconto durante il Black Friday):
- Prima della campagna, creiamo un blocco personalizzato
mycompany:black-friday-campaign-videocon la nostra Call To Action, ed eseguiamo un'operazione in blocco per aggiungerlo a tutti i post del sito web - Dopo la campagna, eseguiamo un'operazione in blocco per rimuovere il blocco da tutti i post
Affinché le queries GraphQL in questa lezione del tutorial funzionino, la Configurazione dello Schema applicata all'endpoint deve avere le Mutazioni Annidate abilitate
Inserire un blocco in blocco
Questa query GraphQL identifica il 3° blocco paragrafo in un post (cercando <!-- /wp:paragraph -->) e posiziona il contenuto HTML del blocco personalizzato subito dopo:
mutation InjectBlock(
$limit: Int! = 5,
$offset: Int! = 0
) {
posts: posts(
pagination: { limit: $limit, offset: $offset }
sort: { by: ID, order: ASC }
) {
id
rawContent
adaptedRawContent: _strRegexReplace(
in: $__rawContent,
searchRegex: "#(<!-- /wp:paragraph -->[\\s\\S]+<!-- /wp:paragraph -->[\\s\\S]+<!-- /wp:paragraph -->)#U",
replaceWith: "$1<!-- mycompany:black-friday-campaign-video -->\n<figure class=\"wp-block-video\"><video controls src=\"https://mysite.com/videos/BlackFriday2023.mp4\"></video></figure>\n<!-- /mycompany:black-friday-campaign-video -->",
limit: 1
)
update(input: {
contentAs: { html: $__adaptedRawContent },
}) {
status
errors {
__typename
...on ErrorPayload {
message
}
}
post {
id
rawContent
}
}
}
}Inserire il blocco con più opzioni
Questa query GraphQL, simile alla precedente, genera la regex dinamicamente, consentendoci di specificare il tipo di blocco da cercare e dopo quanti di tali blocchi posizionare il blocco personalizzato:
query CreateRegex(
$searchBlockType: String! = "wp:paragraph"
$injectAfterBlockCount: Int!
$injectBlockMarkup: String!
) {
endingBlockMarkup: _sprintf(
string: "<!-- /%s -->",
values: [$searchBlockType]
)
@remove
endingBlockMarkupArray: _arrayPad(
array: [],
length: $injectAfterBlockCount,
value: $__endingBlockMarkup
)
@remove
regexString: _arrayJoin(
array: $__endingBlockMarkupArray,
separator: "[\\s\\S]+"
)
@remove
regex: _sprintf(
string: "#(%s)#U",
values: [$__regexString]
)
@export(as: "regex")
@remove
replaceWith: _sprintf(
string: "$1%s",
values: [$injectBlockMarkup]
)
@export(as: "replaceWith")
@remove
}
mutation InjectBlock(
$limit: Int! = 5,
$offset: Int! = 0
$times: Int! = 1
)
@depends(on: "CreateRegex")
{
posts: posts(
pagination: { limit: $limit, offset: $offset }
sort: { by: ID, order: ASC }
) {
id
rawContent
adaptedRawContent: _strRegexReplace(
in: $__rawContent,
searchRegex: $regex,
replaceWith: $replaceWith,
limit: $times
)
update(input: {
contentAs: { html: $__adaptedRawContent },
}) {
status
errors {
__typename
...on ErrorPayload {
message
}
}
post {
id
rawContent
}
}
}
}Forniamo il dizionario variables in questo modo:
{
"injectBlockMarkup": "<!-- mycompany:black-friday-campaign-video -->\n<figure class=\"wp-block-video\"><video controls src=\"https://mysite.com/videos/BlackFriday2023.mp4\"></video></figure>\n<!-- /mycompany:black-friday-campaign-video -->",
"injectAfterBlockCount": 3
}- Durante lo sviluppo/test della query GraphQL, stampa i pattern regex nella risposta posizionando
#prima delle direttive@remove(per commentarle):
{
field
# @remove <= Adding "#" before will disable the directive
}Rimuovere un blocco in blocco
Questa query GraphQL cerca tutti i post contenenti il blocco personalizzato e lo rimuove dal loro sorgente HTML:
mutation RemoveBlock {
posts(filter: { search: "\"<!-- /mycompany:black-friday-campaign-video -->\"" } ) {
id
rawContent
adaptedRawContent: _strRegexReplace(
in: $__rawContent,
searchRegex: "#(<!-- mycompany:black-friday-campaign-video -->[\\s\\S]+<!-- /mycompany:black-friday-campaign-video -->)#",
replaceWith: ""
)
update(input: {
contentAs: { html: $__adaptedRawContent },
}) {
status
errors {
__typename
...on ErrorPayload {
message
}
}
post {
id
rawContent
}
}
}
}Rimuovere un blocco con più opzioni
Questa query GraphQL, simile alla precedente, genera la regex dinamicamente, consentendoci di specificare il tipo di blocco da rimuovere:
query CreateVars(
$removeBlockType: String!
) {
regex: _sprintf(
string: "#(<!-- %1$s -->[\\s\\S]+<!-- /%1$s -->)#",
values: [$removeBlockType]
)
@export(as: "regex")
@remove
search: _sprintf(
string: "\"<!-- /%1$s -->\"",
values: [$removeBlockType]
)
@export(as: "search")
@remove
}
mutation RemoveBlock
@depends(on: "CreateVars")
{
posts(filter: { search: $search } ) {
id
rawContent
adaptedRawContent: _strRegexReplace(
in: $__rawContent,
searchRegex: $regex,
replaceWith: ""
)
update(input: {
contentAs: { html: $__adaptedRawContent },
}) {
status
errors {
__typename
...on ErrorPayload {
message
}
}
post {
id
rawContent
}
}
}
}Forniamo il dizionario variables in questo modo:
{
"removeBlockType": "mycompany:black-friday-campaign-video"
}