¿Cómo insertar programáticamente un nuevo elemento de menú?

5 nov 2013, 17:10:32
Vistas: 23.3K
Votos: 8

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?

1
Comentarios

Un blog detallado: http://goo.gl/TbxqDy

Suresh Kamrushi Suresh Kamrushi
30 sept 2015 08:27:03
Todas las respuestas a la pregunta 2
5
20

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' );

Tutorial Fuente

5 nov 2013 18:06:24
Comentarios

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.

august7cbfa7b7 august7cbfa7b7
5 nov 2013 18:31:44

¿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.

helgatheviking helgatheviking
5 nov 2013 18:48:23

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

helgatheviking helgatheviking
5 nov 2013 18:50:40

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

august7cbfa7b7 august7cbfa7b7
5 nov 2013 20:00:48

Si preguntabas cómo añadir enlaces a tu menú y esto respondió tu pregunta, entonces deberías aceptar esto como la respuesta.

helgatheviking helgatheviking
5 nov 2013 23:08:20
5

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
    )
);
5 nov 2013 17:23:20
Comentarios

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ú

august7cbfa7b7 august7cbfa7b7
5 nov 2013 18:29:11

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.

Milo Milo
5 nov 2013 18:40:02

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.

august7cbfa7b7 august7cbfa7b7
5 nov 2013 18:46:37

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

Milo Milo
5 nov 2013 18:52:43

OK, ahora funciona después de crear un menú personalizado. ¡Muchas gracias!

august7cbfa7b7 august7cbfa7b7
5 nov 2013 19:59:50