¿Cómo insertar programáticamente un nuevo elemento de menú?
Estoy desarrollando un plugin y quiero insertar elementos de menú programáticamente.
Cuando mi tema crea un menú, utiliza esta llamada:
wp_nav_menu( array( 'theme_location' => 'primary', 'menu_class' => 'nav-menu' ) );
Lo cual resulta en algo como esto en el HTML:
<div class="nav-menu"><ul>
<li class="current_page_item"><a href="somewhere">elemento-menu-1</a></li>
<li class="page_item page-item-107"><a href="somewhere-else">elemento menu 2</a></li>
</ul></div>
Quiero poder interceptar esto de alguna manera e insertar mi propio HTML programáticamente antes del cierre de </ul>
. ¿Cómo puedo conectarlo?

Antes de ser impresos, todos los elementos del menú pasan por un filtro. Puedes utilizar el filtro wp_nav_menu_items
para agregar elementos al menú:
// Filtrar wp_nav_menu() para agregar enlaces adicionales y otros elementos
function new_nav_menu_items($items) {
$homelink = '<li class="home"><a href="' . home_url( '/' ) . '">' . __('Inicio') . '</a></li>';
// agregar el enlace de inicio al final del menú
$items = $items . $homelink;
return $items;
}
add_filter( 'wp_nav_menu_items', 'new_nav_menu_items' );
O, para ser más específico, puedes apuntar solo al menú deseado reemplazando la línea add_filter
de arriba con lo siguiente, y sustituyendo $menu->slug
con el nombre real del slug de tu menú:
add_filter( 'wp_nav_menu_{$menu->slug}_items', 'new_nav_menu_items' );

Gracias, pero no pasa nada. Incluso intenté poner tu código textualmente justo antes de la llamada wp_nav_menu
de mi tema, y aún así no hay efecto.

¿Qué quieres decir con que no pasa nada? Acabo de verificar nuevamente y se agrega un enlace de Inicio como primer elemento en el menú. Debes tener un menú definido para la ubicación del menú y no estar recurriendo a wp_page_menu()
. El código definitivamente funciona. Si responde o no a tu pregunta es otra cuestión porque realmente no pude entender lo que estabas preguntando.

He editado el código para agregar el enlace de Inicio al final del menú, pero el principio de WordPress sigue siendo el mismo.

No funcionaba porque no tenía un menú definido por el usuario. Después de crear mi propio menú, funciona. Gracias

Puedes establecer container
a false
y usar el argumento items_wrap
para omitir el ul
, entonces la función solo generará las etiquetas li
, permitiéndote envolverlo en lo que necesites.
wp_nav_menu(
array(
'theme_location' => 'primary',
'items_wrap' => '%3$s',
'container' => false
)
);

Gracias, pero solo cambia <div class="nav-menu">...</div> a <div class="menu">...</div> Así que todavía no pude poner mis contenidos porque WordPress ya genera el final del menú

necesitas crear un menú y asignarlo a la ubicación de tu tema, supongo que no has hecho eso. Probado y funciona con la última versión de WordPress y el tema TwentyThirteen.

Estoy usando el tema de WordPress (twentytwelve) y lo que intento hacer es cambiar el menú superior del tema. Así que el menú aparece en el HTML final con enlaces a mis páginas como elementos del menú, pero necesito poner mi propio elemento de menú programáticamente.

¿creaste un menú en Apariencia > Menús
y lo asignaste a esa ubicación del tema?
