Come inserire programmaticamente una nuova voce di menu?
Sto sviluppando un plugin e voglio inserire elementi del menu in modo programmatico.
Quando il mio tema crea un menu, utilizza questa chiamata:
wp_nav_menu( array( 'theme_location' => 'primary', 'menu_class' => 'nav-menu' ) );
Che risulta in qualcosa del genere nell'HTML:
<div class="nav-menu"><ul>
<li class="current_page_item"><a href="somewhere">voce-menu-1</a></li>
<li class="page_item page-item-107"><a href="somewhere-else">voce menu 2</a></li>
</ul></div>
Vorrei poter intercettare questo in qualche modo e inserire il mio HTML programmaticamente prima del tag di chiusura </ul>
. Come posso collegarlo?

Prima di essere stampati, tutti gli elementi del menu vengono elaborati da un filtro. Puoi utilizzare il filtro wp_nav_menu_items
per aggiungere elementi al menu:
// Filtra wp_nav_menu() per aggiungere link aggiuntivi e altro output
function new_nav_menu_items($items) {
$homelink = '<li class="home"><a href="' . home_url( '/' ) . '">' . __('Home') . '</a></li>';
// aggiunge il link home alla fine del menu
$items = $items . $homelink;
return $items;
}
add_filter( 'wp_nav_menu_items', 'new_nav_menu_items' );
Oppure, per essere più specifici, puoi indirizzare solo il menu desiderato sostituendo la riga add_filter
sopra con la seguente, e sostituendo $menu->slug
con il nome effettivo dello slug del tuo menu:
add_filter( 'wp_nav_menu_{$menu->slug}_items', 'new_nav_menu_items' );

Grazie, ma non succede nulla. Ho persino provato a inserire il tuo codice alla lettera appena prima della chiamata wp_nav_menu
del mio tema, e ancora nessun effetto.

Cosa intendi con "non succede nulla"? Ho appena ricontrollato e un link Home viene aggiunto come primo elemento nel menu. Devi avere un menu definito per la posizione del menu e non devi cadere nel fallback a wp_page_menu()
. Il codice funziona sicuramente. Se risponda o meno alla tua domanda è un altro discorso perché non ho davvero capito cosa stavi chiedendo.

Ho modificato il codice per aggiungere il link Home alla fine del menu, ma il principio di WordPress rimane lo stesso.

Non funzionava perché non avevo un menu definito dall'utente. Dopo aver creato il mio menu, funziona. Grazie

Puoi impostare container
a false
e usare l'argomento items_wrap
per omettere il ul
, in questo modo la funzione restituirà solo i tag li
, permettendoti di avvolgerli in qualsiasi elemento ti serva.
wp_nav_menu(
array(
'theme_location' => 'primary',
'items_wrap' => '%3$s',
'container' => false
)
);

Grazie, ma cambia solo <div class="nav-menu">...</div> in <div class="menu">...</div> Quindi ancora non riesco a inserire i miei contenuti perché WordPress genera già la chiusura del menu

devi creare un menu e assegnarlo alla posizione del tuo tema, immagino tu non l'abbia fatto. Testato e funzionante con l'ultima versione di WordPress e il tema TwentyThirteen.

Sto usando il tema di WordPress (twentytwelve) e quello che sto cercando di fare è modificare il menu superiore del tema. Quindi il menu appare nell'HTML finale con i link alle mie pagine come voci di menu, ma ho bisogno di inserire la mia voce di menu programmaticamente.

hai creato un menu sotto Appearance > Menus
e lo hai assegnato a quella posizione del tema?
