Vai al contenuto
Temi

Il template a blocchi non viene applicato? Parti dal database

Fai tornare WordPress a servire il file di template del tuo tema cancellando la copia salvata nel database dall'Editor del sito, poi escludi nomi dei file e cache.

Pubblicato

Il tuo file di template viene quasi certamente ignorato perché sta vincendo una copia nel database. Nel momento in cui apri un template nell’Editor del sito e premi Salva, WordPress scrive un record post wp_template, e da lì in poi serve quel record al posto del file .html nella cartella del tema — quindi ogni modifica che fai al file dopo quel momento è invisibile sul front end. Cancellare quel record è la soluzione, ed è la prima cosa da verificare prima di toccare la gerarchia, il nome del file o la cache.

Verifica che la copia nel database esista

Vai su Aspetto → Editor → Template. Qualsiasi template che WordPress sta servendo dal database è segnalato nell’elenco: a seconda della tua versione di WordPress il badge dice “Personalizzato” oppure il template compare sotto un filtro “Personalizzati”. Quel badge è tutta la risposta. Se c’è, il tuo file non viene usato.

Puoi verificare la stessa cosa da riga di comando, che è più veloce e funziona anche quando l’Editor del sito fa i capricci:

wp post list --post_type=wp_template --fields=ID,post_name,post_status,post_title
wp post list --post_type=wp_template_part --fields=ID,post_name,post_status,post_title

Ogni riga è un override nel database. Il post_name corrisponde allo slug del template, quindi una riga chiamata single sta oscurando templates/single.html.

Un dettaglio che manda fuori strada: questi record sono legati a un tema tramite un termine di tassonomia, non tramite un percorso. Se rinomini la cartella del tuo tema, i template salvati restano nel database ma smettono di corrispondere al tema attivo, e il sito ricade di colpo sui file. Sembra “le mie personalizzazioni sono sparite” invece di “il mio file viene ignorato” — stesso meccanismo, sintomo opposto.

Cancellalo

Nell’Editor del sito, apri il menu di opzioni del template (i tre puntini accanto) e scegli Azzera personalizzazioni — in alcune versioni la voce si chiama Ripristina. Questo elimina il record nel database e il controllo torna al file su disco.

Se il menu offre Elimina invece di Azzera personalizzazioni o Ripristina, quel template esiste soltanto nel database e non ha nessun file dietro. Eliminarlo rimuove del tutto il template e WordPress scende lungo la gerarchia.

Da WP-CLI, usando un ID preso dall’elenco qui sopra:

wp post delete 482 --force

Sii onesto con te stesso sul costo: azzerare le personalizzazioni scarta in modo permanente tutto ciò che hai costruito nell’Editor del sito per quel template, e non si può annullare. Se nella versione dell’Editor del sito c’è del lavoro vero, copiane prima il markup a blocchi — apri il template nell’editor, passa alla vista codice e incolla il risultato nel tuo file .html. Così il file diventa la fonte di verità e non perdi niente.

Come WordPress sceglie un template

I temi a blocchi usano la stessa logica di gerarchia dei temi classici, solo con file .html in templates/ invece di file .php nella radice del tema. WordPress procede dal più specifico al meno specifico e usa il primo file che esiste.

Cosa si sta visualizzandoOrdine di controllo
Un singolo articolosingle-post-{slug}.htmlsingle-post.htmlsingle.htmlsingular.htmlindex.html
Una paginapage-{slug}.htmlpage-{id}.htmlpage.htmlsingular.htmlindex.html
Un archivio di categoriacategory-{slug}.htmlcategory-{id}.htmlcategory.htmlarchive.htmlindex.html
Un tipo di contenuto personalizzatosingle-{post-type}.htmlsingle.htmlsingular.htmlindex.html
La pagina 404404.htmlindex.html

Due cose scavalcano tutto questo. La prima, il record nel database descritto sopra. La seconda, un template assegnato direttamente a un articolo o a una pagina: apri l’editor del contenuto, cerca il pannello Template nella barra laterale e controlla se lì è selezionato qualcosa di specifico. Un’assegnazione esplicita batte la gerarchia ogni volta, ed è invisibile se non vai a cercarla.

I template basati sullo slug sono fragili in un modo che vale la pena interiorizzare. page-about.html corrisponde solo finché lo slug della pagina è about. Rinomina la pagina in about-us e il template smette di applicarsi senza avvisi e senza errori.

Template contro parte di template

Un template renderizza una vista intera ed è scelto dalla gerarchia. Una parte di template è un frammento — intestazione, piè di pagina, barra laterale — che i template richiamano. Le parti stanno in parts/, i template stanno in templates/, e nel database sono salvati separatamente come record wp_template_part.

La confusione tipica: modifichi l’intestazione e la modifica compare su pagine che non volevi toccare. È il comportamento corretto. Una sola parte è condivisa da ogni template che la include. Se vuoi un’intestazione diversa su un solo template, ti serve un secondo file di parte e un template che lo richiami — modificare quella condivisa non ti darà mai una variazione per singolo template.

Capita anche il contrario. Metti il layout di una pagina intera dentro parts/ e ti chiedi perché la gerarchia non lo raccolga mai. Le parti non sono affatto candidate nella gerarchia: niente verrà mai instradato direttamente su di loro.

Nomi dei file e posizione

Controlla queste cose prima di ipotizzare qualcosa di più esotico:

  • La cartella è templates/, al plurale, nella radice del tema. Non template/, non block-templates/. block-templates/ era il nome corretto all’epoca del plugin Gutenberg, prima che i temi a blocchi arrivassero nel core, e parecchi tutorial lo mostrano ancora — nelle versioni attuali di WordPress non funziona.
  • Le parti di template vanno in parts/, non in template-parts/ (che è la convenzione dei temi classici per i partial PHP).
  • L’estensione è .html. Un file .php dentro templates/ viene ignorato.
  • I nomi dei file sono in minuscolo e usano i trattini. single-Post.html o single_post.html non corrisponderanno. Su un filesystem che non distingue maiuscole e minuscole come quello di macOS la cosa funziona in locale e si rompe su un server Linux — il classico fallimento “sulla mia macchina funziona”.
  • templates/index.html deve esistere. Senza, WordPress non classifica il tema come tema a blocchi e l’Editor del sito potrebbe non comparire affatto.
  • Se stai lavorando in un tema child, i suoi template hanno la priorità su quelli del parent. Un file dimenticato nel tema child batterà in silenzio il file del parent che stai modificando.

I template personalizzati che devono essere selezionabili nell’editor dei contenuti vanno anche dichiarati in theme.json sotto customTemplates, indicando il nome base del file, un titolo leggibile e i tipi di contenuto a cui si applica. Senza quella voce il file esiste ma non compare mai nel pannello Template.

Cache — controllala per ultima

La cache è una cosa reale, ma è la causa meno probabile, e partire da lì è il modo migliore per perdere un pomeriggio.

Svuota la cache di pagina e, se usi una cache oggetti persistente come Redis o Memcached, svuota anche quella: i risultati della risoluzione dei template possono restare lì. Poi ricarica bypassando la cache del browser.

Cosa non aiuterà: svuotare OPcache. I template a blocchi sono file .html e non vengono mai compilati da PHP, quindi OPcache non c’entra nulla. Se una volta ti è sembrato che svuotare OPcache risolvesse il problema, nello stesso momento era cambiato qualcos’altro.

Ancora bloccato?

Se non c’è nessun record nel database, il nome del file è corretto, non c’è nessuna assegnazione esplicita di template sul contenuto e le cache sono già state svuotate, guarda ai plugin. Qualsiasi cosa filtri la risoluzione dei template — un page builder, un plugin di membership, un plugin multilingua, un LMS — può sostituire il proprio template alla fine della richiesta. Passa a un tema a blocchi predefinito e prova con i plugin disattivati, poi riattivali uno alla volta.

E se il template viene applicato ma renderizza vuoto, quello è un problema diverso: verifica che il markup a blocchi nel file sia valido, perché un commento di blocco malformato può portare l’editor a rimuovere il contenuto in silenzio invece di segnalare un errore.

FAQ

Domande

Perché il mio template a blocchi non viene applicato in WordPress?

Di solito perché una copia salvata nel database sta prevalendo sul file. Nel momento in cui modifichi un template nell'Editor del sito e premi Salva, WordPress crea un record post wp_template e serve quello al posto del file .html nella cartella del tema. Da quel punto in poi ogni modifica al file è invisibile sul front end.

Come faccio a far usare a WordPress il file del tema invece della versione dell'Editor del sito?

Apri Aspetto, poi Editor, poi Template, trova il template e usa il suo menu di opzioni per azzerare le personalizzazioni o ripristinarlo. Questo elimina il record nel database e restituisce il controllo al file su disco. Se il menu offre Elimina invece di Ripristina, quel template esiste solo nel database e non ha nessun file dietro.

Dove vanno i file dei template a blocchi in un tema WordPress?

I template completi vanno in una cartella templates nella radice del tema, e le sezioni riutilizzabili in una cartella parts. Entrambe usano l'estensione .html, nomi di file in minuscolo e trattini invece di trattini bassi. Un tema a blocchi richiede inoltre che esista templates/index.html, altrimenti WordPress non lo considera affatto un tema a blocchi.

Qual è la differenza tra un template e una parte di template?

Un template renderizza un'intera pagina e viene scelto dalla gerarchia dei template in base a cosa si sta visualizzando. Una parte di template è un frammento, per esempio un'intestazione o un piè di pagina, che un template richiama. Modificare la parte dell'intestazione cambia ogni template che la include: è per questo che le modifiche alle parti sembrano spesso essersi applicate nel posto sbagliato.

La cache può impedire l'aggiornamento dei template a blocchi?

A volte, ma è la causa meno probabile e va controllata per ultima. Le cache di pagina e le cache oggetti persistenti possono trattenere markup vecchio, quindi svuotale entrambe prima di trarre conclusioni. Svuotare OPcache qui non serve a niente, perché i template a blocchi sono file .html e non vengono mai compilati da PHP.

Perché il mio template legato allo slug della pagina ha smesso di funzionare?

I template basati sullo slug vengono confrontati con lo slug del contenuto al momento della richiesta. Rinominare una pagina ne cambia lo slug, quindi page-about.html smette in silenzio di corrispondere non appena la pagina diventa about-us. Lo stesso vale per i template di categoria e di tag. O rinomini il file perché combaci con il nuovo slug, oppure assegni il template esplicitamente nella barra laterale dell'editor.