Blog
Padroneggiare i Blocchi Dinamici di WordPress: Unire PHP e JavaScript per Contenuti Interattivi
Scopri come creare blocchi WordPress dinamici che sfruttano sia PHP che JavaScript per offrire esperienze di contenuto interattive e guidate dai dati ai tuoi utenti.

Riepilogo
I blocchi dinamici di WordPress offrono un modo potente per creare contenuti che vanno oltre l'HTML statico, consentendo l'integrazione di dati in tempo reale e elementi interattivi. A differenza dei blocchi statici, i blocchi dinamici eseguono il rendering del loro output sul lato server utilizzando PHP, consentendo loro di recuperare e visualizzare informazioni aggiornate. Questo articolo fornisce una guida pratica allo sviluppo dei tuoi blocchi dinamici, coprendo i concetti essenziali di registrazione dei blocchi, callback di rendering lato server e gestione degli attributi lato client. Esamineremo un esempio passo dopo passo, dimostrando come creare un blocco dinamico che visualizza gli ultimi post, offrendo una base per componenti interattivi più complessi.
Padroneggiare i Blocchi Dinamici di WordPress: Unire PHP e JavaScript per Contenuti Interattivi
WordPress, nella sua essenza, è un robusto Content Management System (CMS) costruito su un'architettura PHP modulare e un database MySQL. La sua estensibilità è un punto di forza chiave, ottenuto principalmente tramite temi e plugin. L'avvento di Gutenberg, l'editor a blocchi, ha rivoluzionato la creazione di contenuti introducendo un'interfaccia modulare guidata da JavaScript. Mentre i blocchi Gutenberg statici sono eccellenti per contenuti strutturati e immutabili, molti scenari reali richiedono contenuti dinamici, interattivi e guidati dai dati. È qui che entrano in gioco i blocchi dinamici, offrendo un potente ponte tra la logica lato server di PHP e l'interattività lato client di JavaScript.
Comprendere la Potenza dei Blocchi Dinamici
I blocchi statici, predefiniti in Gutenberg, generano HTML sul lato client al momento del salvataggio. Questo HTML viene quindi memorizzato direttamente nel contenuto del post. Sebbene efficiente per contenuti statici, questo approccio presenta limitazioni quando si tratta di dati che cambiano frequentemente o richiedono elaborazione lato server. I blocchi dinamici, d'altra parte, risolvono questo problema eseguendo il rendering del loro output sul lato server utilizzando PHP. Quando un utente visualizza una pagina contenente un blocco dinamico, WordPress esegue una funzione PHP (il render_callback) per generare l'HTML del blocco al volo. Ciò consente al blocco di recuperare dati in tempo reale dal database, interagire con altre funzionalità di WordPress e presentare informazioni sempre aggiornate.
Questo rendering lato server è cruciale per diversi motivi:
- Dati in tempo reale: Visualizzazione degli ultimi post, eventi imminenti, prezzi delle azioni o qualsiasi altro dato che cambia frequentemente.
- Logica complessa: Esecuzione di calcoli, interrogazione di tipi di post personalizzati o integrazione con API esterne prima di eseguire il rendering dell'output.
- Sicurezza: Sanificazione e convalida dei dati prima che vengano visualizzati, specialmente quando si tratta di contenuti generati dagli utenti o fonti esterne.
- Prestazioni: Scaricare attività di rendering complesse sul server può talvolta migliorare le prestazioni lato client.
L'Anatomia di un Blocco Dinamico
Un blocco dinamico, come qualsiasi altro blocco Gutenberg, è definito dai suoi metadati e dalla registrazione JavaScript. Tuttavia, la sua caratteristica unica risiede nell'attributo render_callback specificato durante la registrazione. Questa funzione di callback è responsabile della generazione dell'output HTML del blocco sul server.
Ecco una ripartizione dei componenti chiave:
- Registrazione del Blocco (JavaScript): Devi comunque registrare il tuo blocco utilizzando
registerBlockType()nel tuo file JavaScript. Questo dice a Gutenberg che il tuo blocco esiste e come gestire i suoi attributi e l'interfaccia dell'editor. - Attributi: Questi sono i campi dati associati al tuo blocco, memorizzati nel contenuto del post. Per i blocchi dinamici, gli attributi vengono utilizzati principalmente per configurare il comportamento e le impostazioni del blocco nell'editor. Il contenuto effettivo visualizzato viene generato dal
render_callback. render_callback(PHP): Questo è il cuore di un blocco dinamico. È una funzione PHP che riceve gli attributi del blocco come argomento e restituisce la stringa HTML da eseguire sul front-end.- Interfaccia Editor (JavaScript): Costruirai comunque l'interfaccia del blocco all'interno dell'editor Gutenberg utilizzando componenti React. Questa interfaccia consente agli utenti di configurare gli attributi del blocco e vedere un'anteprima (spesso una rappresentazione semplificata) di come apparirà il contenuto dinamico.
Passo dopo Passo: Creazione di un Blocco Dinamico "Ultimi Post"
Creiamo un esempio pratico: un blocco dinamico che visualizza un elenco degli ultimi post dal tuo sito WordPress.
Prerequisiti:
- Un ambiente di sviluppo WordPress locale.
- Conoscenza di base di PHP e JavaScript.
- Un plugin o un tema in cui aggiungerai il codice del tuo blocco.
Passaggio 1: Configura il tuo Plugin/Tema per Blocchi
Se non hai un plugin o un tema personalizzato, creane uno semplice. Per questo esempio, assumeremo che tu lo stia aggiungendo a un plugin.
Passaggio 2: Registra il Blocco (JavaScript)
Nel file JavaScript del tuo plugin (ad esempio, src/index.js), registrerai il blocco. Utilizzeremo @wordpress/blocks e @wordpress/i18n per l'internazionalizzazione.
// src/index.js
import { registerBlockType } from '@wordpress/blocks';
import { __ } from '@wordpress/i18n';
// Importa il componente di modifica del tuo blocco
import Edit from './edit';
registerBlockType( 'my-dynamic-blocks/recent-posts', {
title: __( 'Ultimi Post', 'my-dynamic-blocks' ),
icon: 'list-view',
category: 'widgets',
attributes: {
numberOfPosts: {
type: 'number',
default: 5,
},
showExcerpt: {
type: 'boolean',
default: true,
},
},
edit: Edit,
// La funzione save() NON è necessaria per i blocchi dinamici
// Il render_callback lato server gestirà l'output
} );
Passaggio 3: Crea il Componente Editor (JavaScript)
Ora, crea il file src/edit.js. Questo componente definirà come il blocco appare e si comporta all'interno dell'editor Gutenberg.
// src/edit.js
import { useBlockProps, InspectorControls } from '@wordpress/block-editor';
import { PanelBody, RangeControl, ToggleControl } from '@wordpress/components';
import { __ } from '@wordpress/i18n';
import ServerSideRender from '@wordpress/server-side-render';
export default function Edit( { attributes, setAttributes } ) {
const blockProps = useBlockProps();
const { numberOfPosts, showExcerpt } = attributes;
return (
<div { ...blockProps }>
<InspectorControls>
<PanelBody title={ __( 'Impostazioni Post', 'my-dynamic-blocks' ) }>
<RangeControl
label={ __( 'Numero di Post', 'my-dynamic-blocks' ) }
value={ numberOfPosts }
onChange={ ( value ) => setAttributes( { numberOfPosts: value } ) }
min={ 1 }
max={ 10 }
/>
<ToggleControl
label={ __( 'Mostra Estratto', 'my-dynamic-blocks' ) }
checked={ showExcerpt }
onChange={ ( value ) => setAttributes( { showExcerpt: value } ) }
/>
</PanelBody>
</InspectorControls>
{
// Usa ServerSideRender per visualizzare un'anteprima del blocco dinamico
<ServerSideRender
block="my-dynamic-blocks/recent-posts"
attributes={ attributes }
/>
}
</div>
);
}
Nota che non stiamo definendo una funzione save(). Questa è la differenza chiave per i blocchi dinamici. Il componente ServerSideRender viene utilizzato per visualizzare un'anteprima dell'output del blocco direttamente nell'editor, effettuando una richiesta al server.
Passaggio 4: Accoda Script e Registra il Rendering Lato Server (PHP)
Nel file PHP principale del tuo plugin (ad esempio, my-dynamic-blocks.php), devi accodare il tuo file JavaScript e registrare il tipo di blocco, incluso il render_callback.
<?php
/**
* Nome Plugin: My Dynamic Blocks
* Descrizione: Un semplice plugin per blocchi Gutenberg dinamici.
* Versione: 1.0
* Autore: Il Tuo Nome
*/
function my_dynamic_blocks_register_block() {
// Registra il tipo di blocco
register_block_type( 'my-dynamic-blocks/recent-posts', array(
'editor_script' => 'my-dynamic-blocks-editor-script',
'render_callback' => 'my_dynamic_blocks_render_recent_posts',
'attributes' => array(
'numberOfPosts' => array(
'type' => 'number',
'default' => 5,
),
'showExcerpt' => array(
'type' => 'boolean',
'default' => true,
),
),
) );
}
add_action( 'init', 'my_dynamic_blocks_register_block' );
function my_dynamic_blocks_enqueue_editor_scripts() {
wp_enqueue_script(
'my-dynamic-blocks-editor-script',
plugins_url( 'build/index.js', __FILE__ ), // Supponendo che tu abbia un processo di build
array( 'wp-blocks', 'wp-element', 'wp-editor', 'wp-components', 'wp-i18n', 'wp-server-side-render' ),
filemtime( plugin_dir_path( __FILE__ ) . 'build/index.js' )
);
}
add_action( 'enqueue_block_editor_assets', 'my_dynamic_blocks_enqueue_editor_scripts' );
/**
* Callback di rendering per il blocco dinamico Ultimi Post.
*
* @param array $attributes Attributi del blocco.
* @return string Output HTML.
*/
function my_dynamic_blocks_render_recent_posts( $attributes ) {
$number_of_posts = isset( $attributes['numberOfPosts'] ) ? (int) $attributes['numberOfPosts'] : 5;
$show_excerpt = isset( $attributes['showExcerpt'] ) ? (bool) $attributes['showExcerpt'] : true;
$args = array(
'posts_per_page' => $number_of_posts,
'post_status' => 'publish',
'orderby' => 'date',
'order' => 'DESC',
'ignore_sticky_posts' => true,
);
$recent_posts_query = new WP_Query( $args );
$output = '';
if ( $recent_posts_query->have_posts() ) {
$output .= '<ul class="wp-block-my-dynamic-blocks-recent-posts">'; // Usa una classe per lo stile
while ( $recent_posts_query->have_posts() ) {
$recent_posts_query->the_post();
$output .= '<li>';
$output .= '<a href="' . esc_url( get_permalink() ) . '">' . esc_html( get_the_title() ) . '</a>';
if ( $show_excerpt ) {
$output .= '<p>' . get_the_excerpt() . '</p>';
}
$output .= '</li>';
}
$output .= '</ul>';
wp_reset_postdata(); // Importante: reimposta i dati del post dopo il loop personalizzato
} else {
$output = '<p>' . __( 'Nessun post trovato.', 'my-dynamic-blocks' ) . '</p>';
}
return $output;
}
Spiegazione del codice PHP:
my_dynamic_blocks_register_block(): Questa funzione si aggancia ainitper registrare il nostro tipo di blocco. Fondamentalmente, definisce ilrender_callbackcomemy_dynamic_blocks_render_recent_postse passa anche gli attributi del blocco, rispecchiando ciò che è definito in JavaScript.my_dynamic_blocks_enqueue_editor_scripts(): Questa funzione si aggancia aenqueue_block_editor_assetsper caricare il nostro file JavaScript specificamente per l'editor. Includewp-server-side-rendercome dipendenza.my_dynamic_blocks_render_recent_posts(): Questo è il nostrorender_callback. Riceve l'array$attributes, lo sanifica e lo converte nei tipi corretti, quindi utilizzaWP_Queryper recuperare gli ultimi post. Costruisce un elenco HTML<ul>e lo restituisce.wp_reset_postdata()è fondamentale dopo un loopWP_Querypersonalizzato per evitare conflitti con la query principale di WordPress.
Passaggio 5: Compila il tuo JavaScript
Se stai utilizzando un processo di build JavaScript moderno (come @wordpress/scripts), dovrai compilare i tuoi asset. Esegui npm run build (o yarn build) nella directory del tuo plugin.
Passaggio 6: Attiva e Testa
Attiva il tuo plugin. Ora, quando aggiungi il blocco 'Ultimi Post' a un post o a una pagina, vedrai l'interfaccia dell'editor. L'area di anteprima mostrerà l'output generato dalla tua callback PHP. Quando pubblichi o aggiorni il post, la stessa callback PHP verrà eseguita sul front-end per visualizzare il contenuto dinamico.
Migliori Pratiche e Avvertenze
- La Sicurezza Prima di Tutto: Sanifica e convalida sempre qualsiasi dato proveniente da attributi o fonti esterne prima di utilizzarlo nel tuo
render_callback. Utilizza funzioni di WordPress comeesc_html(),esc_url(),sanitize_text_field(), ecc. wp_reset_postdata(): Se il tuorender_callbackutilizzaWP_Queryo modifica l'oggetto globale$post, chiama semprewp_reset_postdata()in seguito per ripristinare la query originale e i dati del post.- Considerazioni sulle Prestazioni: Sebbene i blocchi dinamici siano potenti, un rendering lato server eccessivo o complesso può influire sui tempi di caricamento della pagina. Ottimizza le tue query e la logica di rendering. Considera meccanismi di caching se le prestazioni diventano un problema.
- Anteprima Editor: Il componente
ServerSideRenderfornisce una buona anteprima, ma si basa sull'effettuazione di una richiesta al server. Per blocchi molto complessi, questo potrebbe non essere istantaneo. Assicurati che il tuorender_callbacksia efficiente. - Gestione degli Attributi: Gli attributi servono principalmente per configurare il blocco nell'editor. Il
render_callbackè responsabile del recupero e della visualizzazione del contenuto dinamico effettivo. Evita di memorizzare grandi quantità di dati dinamici direttamente negli attributi. - Convenzioni di Nomenclatura: Utilizza prefissi univoci per i nomi dei tuoi blocchi (ad esempio,
my-plugin-slug/block-name) e i nomi delle funzioni PHP per evitare conflitti con altri plugin o temi. - Internazionalizzazione: Utilizza
__()e_n()per le stringhe traducibili sia nel tuo codice JavaScript che PHP.
Oltre gli Ultimi Post: Espandere le Capacità dei Blocchi Dinamici
L'esempio "Ultimi Post" è solo la punta dell'iceberg. Puoi sfruttare i blocchi dinamici per:
- Visualizzare tipi di post personalizzati: Mostrare prodotti, elementi del portfolio o eventi.
- Contenuti specifici per l'utente: Visualizzare contenuti pertinenti all'utente connesso.
- Moduli interattivi: Sebbene moduli complessi possano ancora beneficiare di plugin dedicati, è possibile creare moduli dinamici semplici.
- Visualizzazione dati: Recuperare dati da un'API ed eseguire il rendering di grafici o diagrammi (anche se ciò spesso comporta librerie JavaScript più avanzate).
- Integrazione con altri plugin: Visualizzare dinamicamente dati gestiti da altri plugin.
Conclusione
I blocchi dinamici di WordPress sono uno strumento indispensabile per gli sviluppatori che cercano di creare esperienze veramente interattive e guidate dai dati all'interno dell'editor Gutenberg. Comprendendo come registrare blocchi con funzioni render_callback e gestire efficacemente gli attributi, puoi creare componenti potenti che recuperano e visualizzano informazioni in tempo reale. Mentre i blocchi statici servono al loro scopo per contenuti strutturati, i blocchi dinamici sbloccano un nuovo livello di funzionalità, consentendoti di colmare il divario tra la logica lato server e la presentazione front-end. Seguendo le migliori pratiche per la sicurezza, le prestazioni e l'organizzazione del codice, puoi sviluppare con sicurezza blocchi dinamici robusti e utili che migliorano i tuoi siti web WordPress.
Sources (5)
- WordPress Architecture: A Complete Guide - Liquid Web
- Explaining WordPress Hooks with Actions and Filters - Hey Reliable
- WordPress Hooks, Actions, and Filters: What They Do and How They Work
- Getting Started with Gutenberg: WordPress Block Development Essentials
- Gutenberg Block Development Step by Step Guide - White Label IQ