Nell’articolo precedente abbiamo visto come assegnare la classe “current” o “active” all’elemento selezionato in un menu tramite la funzione wp_nav_menu.
L’articolo è utile e si collega a questo in quanto contiene un esempio basilare di come è possibile inserire il codice del menu in una variabile per modificarne il contenuto html.
In questo nuovo articolo invece andiamo a scoprire una funzione di PHP davvero eccezionale, preg_replace, di non facile utilizzo, che ci consentirà di “convertire” qualsiasi elemento configurato per non avere alcun link, in un elemento non-cliccabile, trasformandolo quindi da <a> a <p> o <span>.
Supponiamo quindi di avere un menu di questo tipo:
- Servizi
- – Manutenzione
- – Assistenza
il codice sarà più o meno questo:
1 2 3 4 5 6 7 | <ul> <li><a>Servizi</a></li> <ul> <li><a href="/manutenzione">Manutenzione</a></li> <li><a href="/assistenza">Assistenza</a></li> </ul> </ul> |
Come vedete tutti gli elementi sono dentro ad un tag <a>, ma noi vogliamo fare in modo che la voce principale “Servizi”, diventi un elemento che abbia la sola funzione di Titolo o di semplice testo, e che non abbia gli effetti css applicati agli altri link <a>.
Per ottenere questo risultato è necessario anzitutto modificare l’elemento “Servizi” all’interno del menu, andando a togliere qualsiasi link.
Lasciando il campo vuoto infatti, WordPress genererà quell’elemento senza nessun “href” all’interno, proprio come nell’esempio HTML sopra-riportato.
Potremmo così intercettare tutti gli elementi senza un link e convertirli in altri elementi, ad esempio:
1 | <a>Servizi</a> |
può diventare:
1 | <p>Servizi</p> |
Per farlo dobbiamo anzitutto inserire il nostro menu dentro a una variabile ed in seguito utilizzare la funzione preg_replace per fare la sostituzione.
Se prima ad esempio utilizzavate il classico:
wp_nav_menu(array ('theme_location'=> 'main-menu', + eventuali altri parametri originali);
Ora dovete fare in modo che tutto il codice del menu venga inserito in una variabile.
1 2 3 | $menu = wp_nav_menu(array ('theme_location'=> 'main-menu', + eventuali altri parametri originali, 'echo'=> false)); echo preg_replace('(<a>(.*)<\/a>)', '<p>$1</p>', $menu); |
La prima riga inserisce il menu in una variabile, grazie al parametro ‘echo’ impostato su false.
La seconda riga fa una sostituzione di tutti i link <a> trasformandoli in <p>. Ovviamente ciò accade solo quando trova degli elementi <a> senza href, mentre tutte le altre voci rimangono invariate e cliccabili.
Se voleste un tag <span> al posto di <p>, vi basterà modificare l’argomento sostitutivo nel preg_replace, ad esempio:
1 | echo preg_replace('(<a>(.*)<\/a>)', '<span>$1</span>', $menu); |
Spero sia di aiuto a molti di quelli che sviluppano da sé i propri temi WordPress ma si scontrano spesso con la logica del CMS.