Lavorare con i modelli in WordPress è qualcosa che non è raro. Tutto è una sorta di modello, dal modello di pagina principale, al modello a pagina singola, al modello 404, fino ai modelli personalizzati.
A volte, tuttavia, potresti voler applicare una classe bodyall’elemento in base al modello che viene utilizzato in modo da poter modellare questo particolare modello in modo leggermente diverso rispetto al resto del sito.
Anche se puoi farlo in molti modi diversi, per farlo abbiamo tutti i nostri metodi, quindi ho pensato di condividere il mio.
Classe corporea basata su un modello
Prima di passare al codice per aggiungere una classe body basata su un modello, è importante notare che suppongo che il modello sia denominato nel seguente formato: template-{name-of-template}.php.
Quindi supponiamo che tu stia lavorando su un modello per visualizzare informazioni sul peso perso in un mese e desideri farlo utilizzando un modello per questo. Il modello può essere denominato template-weight-loss.php.
Ecco il punto: applicare il nome della classe a una singola pagina che utilizza questo modello non è un grosso problema. Ma se hai più pagine che utilizzano questo modello (che, se gestisci un sito in cui molte persone potrebbero utilizzare questo modello, ha senso, giusto?), allora vorrai assicurarti di applicare il nome della classe a ogni pagina che come questo modello.
Ma come?
Esistono diversi modi in cui puoi farlo, ma richiede almeno quanto segue:
- Agganciarsi all’hook body_class che WordPress fornisce,
- Leggendo il nome del modello,
- Applicandolo al nome della classe del corpo (se la pagina utilizza il modello)
Fortunatamente, è facile da fare perché l’hook passa un array di classi in una funzione agganciata e i metadati di un determinato post includono se sta usando o meno un modello.
Detto questo, ecco come questo può essere ottenuto:
<?php
add_filter('body_class', 'acme_add_body_class');
/**
* If the current page has a template, apply it's name to the list of classes. This is
* necessary if there are multiple pages with the same template and you want to apply the
* name of the template to the class of the body.
*
* @param array $classes The current array of attributes to be applied to the
*/
function acme_add_body_class($classes)
{
if (!empty(get_post_meta(get_the_ID(), '_wp_page_template', true))) {
// Remove the `template-` prefix and get the name of the template without the file extension.
$templateName = basename(get_page_template_slug(get_the_ID()));
$templateName = str_ireplace('template-', '', basename(get_page_template_slug(get_the_ID()), '.php'));
$classes[] = $templateName;
}
return array_filter($classes);
}
Nota che puoi usare una chiusura per questo piuttosto che un nome di funzione agganciato e una funzione indipendente, ma dato che persone diverse che leggono questo usano versioni diverse di PHP, il modo più semplice per dimostrarlo è usarlo sopra.
Perché farlo?
In generale, se la tua pagina ha lo stesso nome del modello che viene applicato, avrà un nome di classe che corrisponde al nome della pagina.
Cioè, diciamo che hai una pagina e il suo nome è Weight Loss. L’ bodyelemento avrà una weight lossclasse. Ma se usi un secondo, terzo, quarto o giù di lì su una pagina con un titolo diverso, non avrà quella classe.
Se vuoi assicurarti che bodyabbia il nome della classe basato sul modello, il codice sopra assicurerà che funzioni.