Filtri contenuto
InspectorControl
Questo gruppo di controlli serve ad applicare uno o più filtri al blocco corrente; i filtri saranno applicati nel frontend tramite php. E' importante sapere che i parametri dei filtri saranno passati a questo controllo mediante le globali php $GLOBALS['gpci']['render']: i loro valori sono inizializzati all'applicazione del filtro e azzerati subito dopo (memorizzati per la durata del filtro nelle globali php $GLOBALS['gpci']['render']['callbacks']). Per modificare quindi il contenuto del blocco tramite questo controllo verranno sempre (escluse eccezioni) utilizzate le globali php che corrispondono ai parametri dell'hook selezionato (vedere tabelle ed esempi). I controlli sono:
Hook
Selezionare l'hook php tra:
- pre_render_block
Serve a modificare la stringa html del blocco prima che sia processato dal filtro render_block; se il filtro ritorna null (ossia il comportamento regolare) non verrà applicata alcuna modifica, altrimenti ritorneremo una stringa html e il filtro render_block non sarà processato. Probabilmente sarà usato molto raramente ma se il blocco deve diventare un contenuto fisso probabilmente questa è la scelta migliore. Questo filtro non è ripetibile ai blocchi interni. Tabella parametri e globale corrispondente:
| Parametro | Globale |
|---|
$pre_render | $GLOBALS['gpci']['render']['pre_render'] |
$parsed_block | $GLOBALS['gpci']['render']['parsed_block'] |
$parent_block | $GLOBALS['gpci']['render']['parent_block'] |
- render_block_data
Serve a modificare la configurazione del blocco corrente (o eventualmente un blocco interno) prima che il codice html del blocco stesso sia generato; potrebbero ad esempio essere modificati gli attributi o eliminato un blocco interno. Ricordare che questo filtro deve ritornare un array che descrive la configurazione del blocco gutenberg e non è ripetibile ai blocchi interni. Tabella parametri e globale corrispondente:
| Parametro | Globale |
|---|
$parsed_block | $GLOBALS['gpci']['render']['parsed_block'] |
$source_block | $GLOBALS['gpci']['render']['source_block'] |
$parent_block | $GLOBALS['gpci']['render']['parent_block'] |
- render_block
Serve a modificare la stringa html finale del blocco subito prima che sia inserito e probabilmente sarà il più utilizzato, potrebbero ad esempio essere eliminati degli shortcodes prima di essere convertiti a contenuto oppure eseguite delle modifiche alla fine. Questo filtro è ripetibile ai blocchi interni. Tabella parametri e globale corrispondente:
| Parametro | Globale |
|---|
$block_content | $GLOBALS['gpci']['render']['block_content'] |
$block | $GLOBALS['gpci']['render']['block'] |
$instance | $GLOBALS['gpci']['render']['instance'] |
- query_loop_block_query_vars
Serve a modificare i parametri del blocco query loop e gpci query loop e compare soltanto se il blocco corrente è una query. Deve ritornare un array di parametri per la WP_Query (vedi esempi) e consente di specificare parametri non ancora esistenti oppure forzare una certa query a certi parametri. Questo filtro non è ripetibile ai blocchi interni. Tabella parametri e globale corrispondente:
| Parametro | Globale |
|---|
$query | $GLOBALS['gpci']['render']['query'] |
$block | $GLOBALS['gpci']['render']['block'] |
$page | $GLOBALS['gpci']['render']['page'] |
- non usare
Non aggiunge il filtro: utile per disabilitare il filtro singolo temporaneamente senza perderne la configurazione.
Priorità
Priorità dell'hook, è possibile scegliere un numero tra 1 e 999. Tenere presente che come spiegato qui la maggior parte delle funzioni del framework avvengono a una priorità indicativa di 21 (11 o 31 per i moduli), quindi utilizzare delle priorità corrette in base al risultato desiderato (esempio 5 o 15 o 35). Ad esempio la conversione degli shortcodes avviene alla priorità di 21 nell'hook render_block.
Tipo di valore
Selettore per la conversione dinamica.
Valore di ingresso
Valore inerente la conversione dinamica. Tenere presente che il valore del ritorno sarà differente in base all'hook selezionato, per evitare errori critici o risultati assurdi nel frontend leggere gli esempi e ritornare il valore corretto. E' importante sapere che se la conversione dinamica ritorna null sarà utilizzato il valore del filtro originale: questo può essere utile ad eseguire azioni che non modificano il valore di ritorno (come potrebbe essere un accodamento di stili e script per un singolo blocco) senza stare a scrivere il codice necessario per ottenere il valore originale.
Limitare a questo blocco
Serve a rimuovere il filtro subito appena è stato applicato al blocco corrente per evitare di trascinarselo dietro e rieseguirlo per tutti gli innerBlocks, è selezionato come valore predefinito. In certi casi (come nella rimozione degli shortcodes a tutti i blocchi interni) potrebbe essere necessario invece non selezionarlo. E' utile praticamente soltanto nei blocchi contenitori altrimenti non dovrebbe avere alcun effetto in nessun caso.
Note
Oltre quelle specificate sopra, esistono altre globali php inerenti il render dei blocchi:
| Globale | Descrizione |
|---|
$GLOBALS['gpci']['render']['block_filtered_id'] | Disponibile in render_block, il clientid del blocco che ha il filtro impostato. |
$GLOBALS['gpci']['render']['current_hook'] | Hook corrente primario aggiunto dal filtro contenuto. |
Esempi
Vediamo come ho generato i tag in questa pagina:
//funzione per le sostituzioni
function ReplaceTextWithTag(){
$content = $GLOBALS['gpci']['render']['block_content'];
$content = str_replace(
$search = [
'InspectorControl',
'BlockControl',
'TemplatesBtn'
],
$replace = [
'<div class="inspectorcontrol">InspectorControl</div>',
'<div class="blockcontrol">BlockControl</div>',
'<div class="templatesbtn">TemplatesBtn</div>'
],
$content
);
return $content;
}
Configurazione filtro:
- filtro: render_block
- priorità: 25
- tipo: funzione php
- valore: ReplaceTextWithTag
- limita a questo blocco: si
Applichiamo la funzione strip_shortcodes a un contenitore e tutti i blocchi interni:
Configuriamo il filtro nel blocco contenitore:
- filtro: render_block
- priorità: 15
- tipo: funzione php
- valore: strip_shortcodes,$block_content
- non limitare al blocco corrente
equivalente di:
creare funzione php
function rimuoviShortcodes(){
$block_content = $GLOBALS['gpci']['render']['block_content'];
$block_content = strip_shortcodes( $block_content );
return $block_content;
}
configurazione filtro:
- filtro: render_block
- priorità: 15
- tipo: funzione php
- valore: rimuoviShortcodes
- non limitare al blocco corrente
equivalente di:
configurazione filtro:
- filtro: render_block
- priorità: 15
- tipo: stringa php
- valore:
strip_shortcodes( $GLOBALS['gpci']['render']['block_content'] )
- non limitare al blocco corrente
Ora utilizziamo un filtro personalizzato: modifichiamo l'output dello shortcode render_data per il blocco selezionato e tutti gli interni poi ripristiniamo il rendering normale per i blocchi successivi (altrimenti andrebbe avanti per tutta la pagina). Qui sono utilizzati 2 filtri: uno per l'applicazione del filtro personalizzato e uno per la successiva rimozione:
Funzione php per l'applicazione:
function DisabilitaShortcodes(){
add_filter( 'do_shortcode_tag', $GLOBALS['custom']['callbacks']['disabilita_shortcodes']=function( $output, $tag, $attr, $m ){
if( $tag == 'render_data' ){ $output = 'Output personalizzato!'; }
return $output;
}, $priority=15, $accepted_args=4 );
}
- filtro: render_block
- priorità: 15
- tipo: funzione php
- valore: DisabilitaShortcodes
- limitare a questo blocco: no (deve essere applicato a tutti i blocchi altrimenti il filtro sarebbe applicato solo al contenitore che come spiegato prima viene processato per ultimo)
Funzione php per la rimozione:
function RiabilitaShortcodes(){
remove_filter( $hook_name='do_shortcode_tag', $callback=$GLOBALS['custom']['callbacks']['disabilita_shortcodes'], $priority=15 );
}
- filtro: render_block
- priorità: 25
- tipo: funzione php
- valore: RiabilitaShortcodes
- limitare a questo blocco: no (deve essere applicato a tutti i blocchi altrimenti il filtro sarebbe aggiunto a tutti i blocchi interni e rimosso solo per il contenitore)
Modifichiamo una query al volo:
creare la funzione:
function parametriQueryModificata(){
$query = $GLOBALS['gpci']['render']['query'];
$query['post_type'] = ['post', 'page'];
return $query;
}
configurazione filtro:
- filtro: query_loop_block_query_vars
- priorità: 35
- tipo: funzione php
- valore: parametriQueryModificata
Aggiungiamo codice javascript al blocco corrente senza scriverlo manualmente nel controllo dedicato:
function AggiungeCodiceJs(){
$parsed_block = $GLOBALS['gpci']['render']['parsed_block'];
$parsed_block['attrs']['JsBlock'] = "
...codice javascript...
";
return $parsed_block;
}
configurazione filtro:
- filtro: render_block_data
- priorità: 15
- tipo: funzione php
- valore: AggiungeCodiceJs
- limitare al blocco corrente
Copiamo un attributo da un blocco contenitore a tutti i blocchi interni (anche interni di interni e cosi via). Copieremo l'attributo JsBlock e daremo a ogni blocco contenuto un colore di sfondo casuale (ma senza stare a inserire il codice javascript in ogni blocco):
inseriamo nel controllo Js del blocco più esterno il codice per assegnare al blocco corrente uno sfondo casuale:
colore = '#';
for( let i=0; i<6; i++ ){
colore += Math.floor( Math.random() * 16 ).toString( 16 );
}
GetCurrentBlockFromCurrentScript().style.backgroundColor = colore;
creiamo la funzione php che contiene l'azione da eseguire e sfrutta la funzione del framework BlocksAction:
function CopyAttributeToInnerblocks(){
$parsed_block = $GLOBALS['gpci']['render']['parsed_block'];
$parsed_block = BlocksAction( $action='copy_attribute', $excludeCurrentBlock='notUsed', $updateInnerblocks='notUsed', $name='JsBlock', $value='notUsed' );
return $parsed_block;
}
configurazione filtro:
- filtro: render_block_data
- priorità: 15
- tipo: funzione php
- valore: CopyAttributeToInnerblocks
- limitare al blocco corrente in quanto si occupa BlocksAction di modificare i blocchi interni
Risorse collegate: