Skip to content

Tutto per WordPress, lo sviluppo web — e non solo

📋 Cheat sheet completo di WordPress

📋 Cheat sheet completo di WordPress

Hai aperto functions.php e non ricordi più come agganciare la sidebar? Succede a chiunque sviluppi a mano un tema WordPress. Ti serve una sola pagina a portata di mano, non dieci schede di developer.wordpress.org.

Qui trovi gli elementi essenziali per lo sviluppo WordPress: 13 file template e la gerarchia per sceglierli, il Loop di base, i tag di inclusione e i parametri di bloginfo(), poi hook e filtri, tag condizionali, accodamento degli script, shortcode, WP_Query, escaping dei dati, REST API e comandi WP-CLI. Tutti gli esempi di codice funzionano. Tieni questa scheda aperta durante lo sviluppo e consultala man mano che procedi.

💡 Panoramica rapida:

  • Aggiungi questa pagina ai segnalibri e tienila aperta in una scheda separata mentre costruisci il tema.
  • Inizia dalla sezione "Anatomia di un tema": crea i file del tema dall'elenco prima di scrivere codice.
  • Copia il WordPress Loop di base in index.php e racchiudilo con i tag di inclusione per header, sidebar e footer.
  • Inserisci i tag bloginfo() e get_bloginfo() dalla tabella direttamente nei template, verificando la colonna "Cosa restituisce".
  • Prima di pubblicare, esegui le regole per style.css: convalida il CSS, minificalo e aggiungi gli stili per la stampa.
  • Più in basso nella pagina, il riferimento: gerarchia dei template, hook e filtri, tag condizionali, accodamento degli script, shortcode, WP_Query, escaping, REST API e WP-CLI.

Anatomia di un tema WordPress

Diagramma della struttura dei file di un tema WordPress

Un tema WordPress è un insieme di file PHP uniti da una logica comune e governati dalla gerarchia dei template. Il componente chiave: style.css, che gestisce lo stile visivo e al tempo stesso funge da identificativo del tema nell'amministrazione. Ma la base di ogni tema classico sono i template PHP: ciascuno gestisce la propria sezione della pagina ed è richiamato nell'ordine stabilito dalla gerarchia di WordPress.

Per creare un tema standard servono i seguenti file, tredici in tutto, ciascuno dedicato a una zona specifica del sito:

  • header.php, la sezione <head> e la parte superiore della pagina: metadati, titolo del sito, inclusione di style.css, tag di apertura <body>.
  • index.php, il template principale, punto di ingresso. Assembla gli altri file in una pagina unificata tramite i tag di inclusione. Se non esiste un template specializzato, WordPress ricorre a index.php.
  • sidebar.php, la barra laterale: widget, categorie, ricerca, menu secondario.
  • footer.php, il piè di pagina: copyright, link social, script di analytics, tag di chiusura </body></html>.
  • page.php, template per le pagine (contenuti statici, "Chi siamo", "Contatti").
  • single.php, template per un singolo articolo del blog.
  • comments.php, blocco dei commenti e modulo di invio.
  • 404.php, pagina di errore 404. Se questo file manca, WordPress mostra un messaggio di sistema predefinito, peggiore per il visitatore.
  • search.php, template per i risultati della ricerca.
  • searchform.php, modulo di ricerca (nei temi classici; quelli moderni usano spesso un widget).
  • archive.php, template per gli archivi: categorie, tag, archivi per data.
  • functions.php, il cuore funzionale del tema: hook personalizzati, accodamento di script e stili, registrazione dei menu, aree widget, tipi di contenuto personalizzati. Tutto ciò che aggiunge funzionalità al tema risiede qui.
  • style.css, l'unico file non PHP dell'elenco, ma senza di esso il tema non esiste: contiene l'intestazione del tema e definisce l'aspetto del sito.

Puoi cavartela con meno template, ad esempio index.php + style.css formano già un tema minimale. Ma per un sito completo è meglio mantenere tutti e tredici i file: ciascuno è ritagliato sul proprio compito e WordPress stesso sceglie quello giusto in base alla gerarchia. Un tipico index.php si presenta così:

1<?php get_header(); ?>
2
3<!-- Main content, including the Loop -->
4
5<?php get_sidebar(); ?>
6<?php get_footer(); ?>

Passiamo al frammento di codice più importante, senza il quale non viene visualizzato nemmeno un articolo.

Il WordPress Loop

Il Loop è il meccanismo centrale per la visualizzazione dei contenuti. Senza di esso dovresti codificare manualmente la visualizzazione di ogni articolo e di ogni pagina nel template del tema. Il Loop fa esattamente ciò che il suo nome promette: scorre tutti gli articoli che corrispondono alla query corrente e applica a ciascuno il markup HTML/PHP da te specificato.

Sintassi di base del Loop:

1<?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>
2 <!-- HTML markup and template tags for each post -->
3<?php endwhile; endif; ?>

have_posts() verifica se ci sono articoli da visualizzare. Se ce ne sono, the_post() inizializza il puntatore interno di WordPress sull'articolo corrente, dopodiché decine di tag template diventano disponibili all'interno del Loop: the_title() per il titolo, the_content() per il testo dell'articolo, the_permalink() per il link, the_excerpt() per l'estratto e molti altri.

Il Loop viene solitamente inserito in index.php per visualizzare un elenco di articoli, ma nulla impedisce di usarlo in single.php, page.php o archive.php, la logica è la stessa, cambia solo il contesto. All'interno del Loop aggiungi qualsiasi contenitore HTML e tag PHP, WordPress li applicherà a ciascun articolo a turno.

Esempio pratico, visualizzazione del titolo e della data di ogni articolo:

1<?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>
2 <article>
3 <h2><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h2>
4 <time><?php echo get_the_date(); ?></time>
5 </article>
6<?php endwhile; endif; ?>

Ora vediamo come il Loop interagisce con il resto del tema, attraverso i tag di inclusione.

Tag di inclusione dei template

I tag di inclusione sono funzioni PHP che caricano il contenuto di un file del tema in un altro. Formano lo scheletro di un tipico index.php: header, contenuto, sidebar, footer. Quattro funzioni di base:

  • <?php get_header(); ?>, include header.php. Di solito è la prima riga in index.php e in qualsiasi altro template che necessiti di un header.
  • <?php get_sidebar(); ?>, include sidebar.php. Se la sidebar non serve, basta rimuovere la chiamata.
  • <?php get_footer(); ?>, include footer.php. Sempre alla fine del template, chiude la pagina.
  • <?php comments_template(); ?>, include comments.php. Si inserisce all'interno di single.php, dopo la visualizzazione del contenuto dell'articolo.

Tutte e quattro le funzioni cercano i file nella cartella del tema attivo. Se il file non esiste, WordPress semplicemente non produce alcun output (tranne get_header() e get_footer(), la cui assenza rompe il layout).

Il livello successivo, tag che non si limitano a includere file ma estraggono dati dal database.

Tag bloginfo

Esempio di output dei dati del sito tramite la funzione bloginfo in WordPress

I tag bloginfo() estraggono informazioni sul sito dal database di WordPress, le stesse informazioni che compili in Impostazioni → Generali e nel profilo utente. La funzione restituisce una stringa e la visualizza immediatamente a schermo. I parametri più usati:

Parametro

Cosa restituisce

<?php bloginfo('name'); ?>

Titolo del sito

<?php bloginfo('url'); ?>

URL del sito

<?php bloginfo('description'); ?>

Sottotitolo (descrizione del sito)

<?php bloginfo('charset'); ?>

Charset (predefinito UTF-8)

<?php bloginfo('stylesheet_url'); ?>

URL del style.css del tema attivo

<?php bloginfo('version'); ?>

Versione di WordPress installata

<?php bloginfo('language'); ?>

Lingua del sito

<?php bloginfo('rss_url'); ?>

URL del feed RSS (RSS 0.92)

<?php bloginfo('rss2_url'); ?>

URL del feed RSS (RSS 2.0)

Questa è solo la punta dell'iceberg, l'elenco completo dei parametri è nella documentazione di WordPress.

Get_bloginfo(), quando serve memorizzare invece di visualizzare

Per i casi in cui le informazioni sul sito devono essere usate nel codice anziché solo mostrate a pagina, si utilizza la funzione get_bloginfo():

1<?php $info = get_bloginfo( $show, $filter ); ?>
  • $show, la parola chiave. I valori supportati sono 'name' (titolo), 'url' (indirizzo), 'description' (sottotitolo), 'admin_email' (email dell'amministratore) e altri; elenco completo nella documentazione.
  • $filter, modalità di filtraggio: 'raw' (valore "così com'è", predefinito) o 'display' (il valore passa attraverso wptexturize(), converte virgolette, trattini, caratteri).

Esempio: recupera la descrizione del sito e visualizzala con un prefisso:

1<?php $site_description = get_bloginfo( 'description' ); ?>
2<?php echo 'Your site tagline: ' . esc_html( $site_description ); ?>

Risultato: «Your site tagline: Best premium WordPress themes».

Oltre a bloginfo, WordPress dispone di un ampio sistema di tag di template: tag generali, tag per l'autore, tag per le miniature, tag per le categorie, tag per i link, tutti funzionano sia all'interno che all'esterno del Loop e le loro combinazioni offrono il pieno controllo sull'output dei contenuti.

Foglio di stile del tema

style.css ha due ruoli. Il primo è l’identificazione: l’intestazione in cima al file comunica a WordPress nome del tema, autore, versione, licenza. Il secondo è visivo: tutte le regole CSS che controllano l’aspetto del sito. Un’intestazione standard ha questo aspetto:

1/*
2Theme Name: Theme Name
3Theme URI: https://www.example.com/theme
4Author: Your Name
5Author URI: https://www.example.com/
6Description: Responsive WordPress theme with support for...
7Version: 1.0
8License: GNU General Public License v2 or later
9License URI: http://www.gnu.org/licenses/gpl-2.0.html
10Tags: responsive, two-columns, right-sidebar, custom-header
11Text Domain: mythemename
12*/

Buone pratiche quando si lavora con style.css:

  • Segui gli standard di codifica CSS di WordPress, uno stile coerente semplifica la manutenzione.
  • Convalida il CSS tramite il validatore W3C.
  • Minimizza il CSS in produzione, ma conserva una sorgente leggibile per lo sviluppo.
  • Aggiungi stili per la stampa (@media print), molti lettori stampano gli articoli.
  • Applica stili a tutti gli elementi HTML standard che possono comparire nel contenuto di un articolo.

Gerarchia dei template di WordPress

Per ogni richiesta WordPress decide autonomamente quale file PHP del tema includere, questa è la gerarchia dei template. Una regola: dal file più specifico a quello più generale, con index.php come ultimo fallback per ogni ramo. Conoscere l’ordine elimina la domanda «perché la mia modifica a single.php non compare nella pagina di categoria».

1Single post → single-{post_type}-{slug}.php → single-{post_type}.php → single.php → singular.php → index.php
2Page → {template from editor}.php → page-{slug}.php → page-{id}.php → page.php → singular.php → index.php
3Category → category-{slug}.php → category-{id}.php → category.php → archive.php → index.php
4Archive → archive-{post_type}.php → archive.php → index.php
5Search → search.php → index.php
6404 error → 404.php → index.php
7Front page → front-page.php → home.php → index.php

WordPress prende il primo file esistente da sinistra a destra. Quindi single-product.php sovrascriverà single.php solo per gli articoli del post type product, lasciando intatto il resto.

Hook: azioni e filtri

Gli hook sono punti di estensione di WordPress: permettono di agganciarsi alle funzionalità core senza modificarne i file. Le azioni eseguono un effetto collaterale (accodare uno script, inviare un’email), i filtri ricevono un valore, lo modificano e devono restituirlo. Un return dimenticato in un filtro è la causa più comune di contenuto vuoto.

1// Registration
2add_action( 'hook_name', 'callback', 10, 1 ); // priority, number of arguments
3add_filter( 'hook_name', 'callback', 10, 1 );
4
5// Execution (in core or your code)
6do_action( 'hook_name', $arg ); // action: returns nothing
7apply_filters( 'hook_name', $value, $arg ); // filter: RETURNS value
8
9// Removal (priority must match the one used when adding)
10remove_action( 'hook_name', 'callback', 10 );

Esempio, aggiungere un paragrafo alla fine di ogni articolo:

1add_filter( 'the_content', 'my_append_note', 20 );
2function my_append_note( $content ) {
3 return $content . '<p>Thanks for reading!</p>'; // without return content disappears
4}

Hook principali per i temi:

  • after_setup_theme, registra il supporto alle funzionalità (add_theme_support()), menu, dimensioni delle miniature.
  • wp_enqueue_scripts, l’unico posto corretto per accodare CSS e JS del frontend.
  • init, inizializzazione anticipata: registra post type e shortcode.
  • the_content, filtra l’HTML dell’articolo prima dell’output.

Una priorità più bassa viene eseguita prima (default 10). Per fare in modo che una callback riceva più di un argomento, aumenta il quarto parametro accepted_args.

Tag condizionali

I tag condizionali sono funzioni che restituiscono true o false a seconda della pagina attualmente aperta. Costruiscono la logica del tipo «mostra la sidebar qui, ma non nella pagina 404».

1is_home() // blog post feed
2is_front_page() // site front page
3is_single() // single post
4is_page() // single page
5is_singular() // any single post/page/CPT
6is_archive() // any archive
7is_category() // category archive
8is_search() // search results page
9is_404() // 404 error page
10is_user_logged_in() // user is logged in
11is_admin() // request is in admin (NOT "user is administrator")

Trappola principale: i tag condizionali di query (is_single, is_page, is_home e altri) funzionano solo dopo che la query principale è stata formata, cioè dentro i file di template e il Loop o a partire dall’hook template_redirect. Chiamarli presto in functions.php o su init è troppo presto: WordPress emetterà _doing_it_wrong() e restituirà un risultato errato. Le eccezioni sono is_admin() e is_user_logged_in(), che non dipendono dalla query e sono disponibili prima. E ricorda: is_admin() verifica il contesto (amministrazione o frontend), non il ruolo; per il ruolo usa current_user_can( 'manage_options' ).

Accodamento di script e stili

La tentazione di scrivere <link> e <script> direttamente in header.php è forte, ma è un errore: perdi la gestione delle dipendenze, il versionamento per il cache busting, le strategie defer/async e la protezione contro il doppio caricamento (due plugin possono facilmente accodare jQuery due volte). Il percorso corretto è la coda di WordPress sull’hook wp_enqueue_scripts.

1add_action( 'wp_enqueue_scripts', 'my_theme_assets' );
2function my_theme_assets() {
3 // Theme style with version from style.css header
4 wp_enqueue_style(
5 'my-theme',
6 get_stylesheet_uri(),
7 array(),
8 wp_get_theme()->get( 'Version' )
9 );
10
11 // Script with dependency and modern syntax (WP 6.3+)
12 wp_enqueue_script(
13 'my-app',
14 get_theme_file_uri( 'assets/js/app.js' ),
15 array( 'jquery' ), // dependencies
16 '1.0.0', // version → cache busting
17 array(
18 'in_footer' => true,
19 'strategy' => 'defer',
20 )
21 );
22}

A partire da WordPress 6.3 l’ultimo parametro di wp_enqueue_script() è un array $args (in_footer, strategy), anche se la vecchia forma con il booleano true per il footer funziona ancora. Per il frontend usa wp_enqueue_scripts, per l’amministrazione usa admin_enqueue_scripts, per la pagina di login usa login_enqueue_scripts.

Shortcode

Gli shortcode trasformano una breve voce tra parentesi quadre in HTML arbitrario, comodo per pulsanti, gallerie e form dentro il contenuto. Il gestore deve restituire una stringa, non emetterla tramite echo, altrimenti il risultato «salterà fuori» all’inizio della pagina.

1add_shortcode( 'btn', 'my_button_shortcode' );
2function my_button_shortcode( $atts, $content = null, $tag = '' ) {
3 $a = shortcode_atts(
4 array( 'url' => '#', 'label' => 'Button' ),
5 $atts,
6 $tag
7 );
8 return sprintf(
9 '<a class="btn" href="%s">%s</a>',
10 esc_url( $a['url'] ), // escape on output
11 esc_html( $a['label'] )
12 );
13}
14// Usage in post: [btn url="https://example.com" label="Buy"]

shortcode_atts() sovrappone gli attributi dell’utente ai valori predefiniti. Se devi eseguire shortcode dentro una stringa o un template, avvolgili in do_shortcode(), ma per chiamare la tua funzione chiamala direttamente, senza intermediari.

WP_Query e query personalizzate

WP_Query è la classe per qualsiasi selezione di articoli: ultime notizie nella sidebar, raccolta di categoria, feed di un post type personalizzato. Dopo il tuo loop chiama sempre wp_reset_postdata(), altrimenti i tag di template più avanti nella pagina otterranno l’articolo sbagliato.

1$q = new WP_Query( array(
2 'post_type' => 'post',
3 'posts_per_page' => 5,
4 'category_name' => 'news',
5 'orderby' => 'date',
6 'order' => 'DESC',
7) );
8
9if ( $q->have_posts() ) {
10 while ( $q->have_posts() ) {
11 $q->the_post();
12 the_title( '<h3>', '</h3>' );
13 }
14 wp_reset_postdata(); // restore global $post
15}

Per modificare la query della pagina principale (ad esempio, il numero di articoli in prima pagina), non usare il deprecato query_posts(), esegue una query aggiuntiva al database e rompe la paginazione. L’approccio corretto è l’hook pre_get_posts, che modifica la query prima della sua esecuzione:

1add_action( 'pre_get_posts', 'my_main_query' );
2function my_main_query( $query ) {
3 if ( ! is_admin() && $query->is_main_query() && $query->is_home() ) {
4 $query->set( 'posts_per_page', 12 );
5 }
6}

Sicurezza: escaping e sanitizzazione

La regola d'oro di WordPress: sanitizzare in input, fare l'escape in output, validare ovunque. Qualsiasi dato utente viene pulito prima di essere salvato nel database e sottoposto a escape prima dell'output in HTML, anche se era già stato pulito.

1// Escaping ON OUTPUT
2echo esc_html( $text ); // text inside tag
3echo esc_attr( $value ); // attribute value
4echo esc_url( $href ); // href/src links
5echo wp_kses_post( $rich_html ); // safe HTML set for content
6
7// Sanitization ON INPUT (before writing to DB)
8$clean = sanitize_text_field( $_POST['name'] );
9$email = sanitize_email( $_POST['email'] );
10$num = absint( $_POST['count'] );

Proteggi form e azioni con i nonce, token monouso contro il CSRF:

1// In form:
2wp_nonce_field( 'my_save_action', 'my_nonce' );
3
4// During processing:
5if ( ! isset( $_POST['my_nonce'] ) ||
6 ! wp_verify_nonce( $_POST['my_nonce'], 'my_save_action' ) ) {
7 return; // request rejected
8}

Nella pratica, la maggior parte delle vulnerabilità di temi e plugin è proprio la mancata esecuzione dell'escape in output. Rendi l'abitudine: nessuna variabile va in HTML senza esc_*.

WordPress REST API

La REST API restituisce i dati del sito in formato JSON, utilizzata da app mobile, frontend headless e integrazioni. L'indirizzo base è /wp-json/wp/v2/.

1GET /wp-json/wp/v2/posts // posts
2GET /wp-json/wp/v2/pages // pages
3GET /wp-json/wp/v2/media // media files
4GET /wp-json/wp/v2/users // users
5GET /wp-json/wp/v2/posts/123 // single post
6GET /wp-json/wp/v2/posts?per_page=5&search=theme&_embed

Le route personalizzate si registrano sull'hook rest_api_init. Il parametro permission_callback è obbligatorio, senza di esso WordPress emetterà un avviso; per la lettura pubblica usa '__return_true'.

1add_action( 'rest_api_init', function () {
2 register_rest_route( 'myplugin/v1', '/items/(?P<id>\d+)', array(
3 'methods' => 'GET',
4 'callback' => 'my_get_item',
5 'permission_callback' => '__return_true',
6 ) );
7} );

WP-CLI: comandi a portata di mano

WP-CLI gestisce il sito dal terminale, più veloce e affidabile che cliccare nell'admin, specialmente quando si mantengono più siti. I comandi più comuni:

1wp core update # update WordPress core
2wp core version # what version is installed
3wp plugin install akismet --activate # install and activate plugin
4wp plugin list # plugin list with status and version
5wp theme activate twentytwentyfive # switch active theme
6wp db export backup.sql # database dump to file
7wp search-replace 'old.com' 'new.com' --dry-run # always dry run first
8wp user create bob [email protected] --role=editor # create user
9wp cache flush # flush object cache

wp search-replace comprende i dati serializzati, quindi cambia in sicurezza il dominio durante la migrazione di un sito, a differenza di una query SQL diretta che rompe la serializzazione. Prima di qualsiasi operazione pericolosa esegui wp db export.

Temi classici e a blocchi nel 2026

A metà 2026 (versione attuale: WordPress 7.0 "Armstrong", PHP 8.3+ raccomandato) i temi PHP classici sono ancora pienamente supportati e restano la tipologia più diffusa. Ma tutto il nuovo tooling core sviluppa temi a blocchi e full site editing (Full Site Editing): theme.json al posto di parte delle impostazioni di functions.php, template HTML invece di PHP. Il Loop, bloginfo(), i tag condizionali e gli hook restano rilevanti nei temi ibridi e in qualsiasi frammento PHP all'interno dei temi FSE, quindi questo cheat sheet non perde valore. Il percorso pratico nel 2026 è una base classica più il supporto mirato ai blocchi dove serve realmente.

⁉️🤔 Domande frequenti

È obbligatorio creare tutti e 13 i file per un tema?

No, il tema minimo funzionante è index.php + style.css. Ma per un sito completo è meglio mantenere il set completo: ogni file dà a WordPress la capacità di scegliere il template ottimale. Per esempio, senza single.php un articolo verrà renderizzato tramite index.php e perderà il blocco dei commenti.

Qual è la differenza tra get_bloginfo() e bloginfo()?

bloginfo() invia immediatamente il valore a schermo (echo). get_bloginfo() restituisce una stringa a una variabile, puoi elaborarla, concatenarla o usarla dentro un'altra espressione prima dell'output effettivo.

Dove posiziono il Loop se la pagina ha più tipi di contenuto?

Il Loop può essere lanciato più volte. Scenario tipico: un Loop per l'elenco principale degli articoli, un secondo per un widget "ultime notizie" nella sidebar. Prima del secondo Loop resetta il puntatore tramite wp_reset_postdata(), altrimenti il codice successivo nella pagina otterrà il contesto dell'articolo sbagliato.

Questo cheat sheet funziona per i temi a blocchi (FSE)?

Parzialmente. I temi a blocchi (Full Site Editing) usano theme.json invece di functions.php per molte impostazioni e template in HTML anziché PHP. Ma il Loop, bloginfo() e i tag di inclusione restano rilevanti per i temi ibridi e qualsiasi template PHP all'interno di temi FSE.

Cosa fare se functions.php diventa troppo grande?

Suddividi la logica in file separati e includili da functions.php tramite require_once o include. Per esempio: require_once get_template_directory() . '/inc/custom-post-types.php';. Questo migliora la leggibilità e semplifica la manutenzione, una best practice per qualsiasi tema con più di 20-30 hook.

Qual è la differenza tra un'action e un filter?

Un'action esegue un effetto collaterale e non restituisce nulla (accodare uno script, inviare un'email). Un filter riceve un valore, lo modifica e deve restituirlo, un return dimenticato in un filter azzererà il contenuto. Si registrano in modo identico: add_action() e add_filter().

Perché is_single() non funziona in functions.php?

I tag condizionali di query sono disponibili solo dopo che la query principale è stata formata, cioè nei file di template o a partire dall'hook template_redirect. All'inizio di functions.php la query non è ancora pronta, quindi WordPress emetterà _doing_it_wrong(). Solo is_admin() e is_user_logged_in() funzionano senza dipendenza dalla query.

Cosa tenere a portata di mano quando si sviluppa su WordPress

Questo cheat sheet è l'ossatura da cui parte lo sviluppo WordPress. I file del tema e la gerarchia dei template, il Loop, i tag di inclusione e bloginfo() assemblano il tema, mentre hook e filtri, tag condizionali, accodamento degli script, shortcode, WP_Query, escaping, REST API e WP-CLI coprono la stragrande maggioranza delle attività di routine. Il resto è pratica e documentazione.

Per l'approfondimento l'handbook sullo sviluppo dei temi su developer.wordpress.org è il primo riferimento. Anche il riferimento dei tag di template con centinaia di funzioni per ogni occasione è lì. Se stai passando da un layout HTML a un tema finito, inizia con la guida passo passo per creare un tema WordPress da HTML, dove il Loop e i tag sono spiegati in contesto operativo, dal layout al tema funzionante.

Aggiungi questo cheat sheet ai preferiti e tienilo a portata di mano durante lo sviluppo.

Quale tag o hook consulti più spesso? Scrivi nei commenti quale task WordPress hai incontrato e condividi il tuo caso d'uso, lo scambio di esperienze dal vivo vale una dozzina di guide ufficiali.