Cómo agregar un submenú a un menú generado por wp_nav_menu usando el complemento

11

Tengo un menú generado por el wp_nav_menucual parece

<ul class="nav-menu" id="menu-top-nav">
    <li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-43" id="menu-item-43"><a href="http://www.example.com/item1.com">Item 1</a></li>
    <li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-44" id="menu-item-44"><a href="http://www.example.com/item2.com">Item 2</a></li>
    <li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-45" id="menu-item-45"><a href="http://www.example.com/item3.com">Item 3</a></li>
    <li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-46" id="menu-item-46"><a href="http://www.example.com/item4.com">Item 4</a></li>
</ul>

Quiero modificar el menú anterior agregando un submenú al "Elemento 3" usando mi complemento, por lo que a continuación se muestra mi salida deseada.

<ul class="nav-menu" id="menu-top-nav"><li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-43" id="menu-item-43"><a href="http://www.example.com/item1.com">Item 1</a></li>
  <li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-44" id="menu-item-44"><a href="http://www.example.com/item2.com">Item 2</a></li>
  <li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-45" id="menu-item-45"><a href="http://www.example.com/item3.com">Item 3</a>
    <ul class="sub-menu">
      <li class="menu-item" id="menu-item-48"><a href="http://www.example.com/child1.com">child 1</a></li>
      <li class="menu-item" id="menu-item-49"><a href="http://www.example.com/child2.com">child 2</a></li>
      <li class="menu-item" id="menu-item-50"><a href="http://www.example.com/child3.com">child 3</a></li>
   </ul>
  </li>
  <li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-46" id="menu-item-46"><a href="http://www.example.com/item4.com">Item 4</a></li>
</ul>

He intentado seguir los filtros, pero estos no me ayudaron a lograr el resultado anterior.

wp_setup_nav_menu_item
wp_get_nav_menu_items
wp_nav_menu_items

Solución 1:

add_filter('wp_nav_menu_items', 'my_custom_menu_item', 10, 2);

function my_custom_menu_item($items, $args)
{
    $parent_item_number = 3;
    $pos = nth_strpos($items, '</a>', $parent_item_number) + 4;
    $cat_id = 9;
    $args = array('numberposts' => 5, 'category' => $cat_id);
    $myposts = get_posts($args);
    if (!empty($myposts))
    {
        $str_to_insert = '<ul class="sub-menu">';
        global $post;
        foreach ($myposts as $post) : 
            setup_postdata($post);
            $str_to_insert .= '<li><a href="' . get_permalink() . '">' . get_the_title() . '</a></li>';
        endforeach;
        $str_to_insert .= '</ul>';

        $items = substr($items, 0, $pos) . $str_to_insert . substr($items, $pos);
    }
    return $items;
}

function nth_strpos($str, $substr, $n, $stri = false)
{
    if ($stri)
    {
        $str = strtolower($str);
        $substr = strtolower($substr);
    }
    $ct = 0;
    $pos = 0;
    while (($pos = strpos($str, $substr, $pos)) !== false)
    {
        if (++$ct == $n)
        {
            return $pos;
        }
        $pos++;
    }
    return false;
}

La solución anterior funciona, pero creo que no es una forma adecuada de lograr el resultado deseado. Me encantaría tener una buena solución tuya.

Tahir Yasin
fuente
Wow, entonces no hay otra respuesta a esta pregunta? También estoy buscando una solución simple aquí. Algo que no implica analizar cadenas. Tiene que haber una manera más fácil, ¿verdad?
rgin
Soporte de WP para desconfigurar esta estructura html. La solución solo necesita cambiar los nombres de clase de submenú css. Mejor es reescribir sus clases de CSS para la estructura del menú de WordPress.
Foxsk8

Respuestas:

2

Puede modificar su menú utilizando Walker.

include('subMenu.php');
$menu =  wp_nav_menu( array('menu' => 'YOUR-MENU-NAME','menu_class' => 'megamenu','walker' => new subMenu));

cree un archivo subMenu.php en la carpeta del tema y agregue el siguiente código.

<?php
class subMenu extends Walker_Nav_Menu {
    function end_el(&$output, $item, $depth=0, $args=array()) {

    if( 'Item 3' == $item->title ){
        $output .= '<ul class="sub-menu">
        <li class="menu-item" id="menu-item-48"><a href="http://www.example.com/child1.com">child 1</a></li>
        <li class="menu-item" id="menu-item-49"><a href="http://www.example.com/child2.com">child 2</a></li>
        <li class="menu-item" id="menu-item-50"><a href="http://www.example.com/child3.com">child 3</a></li>
        </ul>';
    }
    $output .= "</li>\n";  
    }
}
Addy
fuente
0

El gancho wp_nav_menu_itemses correcto si va a agregar elementos a la estructura del menú de navegación de WP. Vea el ejemplo a continuación para agregar un enlace estático "Inicio". El enlace es estático, desde la función home_url()y lo enfocé solo en los argumentos del menú de navegación de WP para los valores anteriores y posteriores. El elemento li es estático, solo se cambia en WordPress, si usa un Walker para este elemento. El gancho wp_nav_menu_itemsestá dentro de la lista ul. Después de definir la var para este nuevo contenido del elemento, lo agrego a la lista predeterminada en la var $items, establecida antes de la salida de la lista. Ahora solo un retorno de todo el contenido.

add_filter( 'wp_nav_menu_items', 'fb_add_home_link', 10, 2 );
function fb_add_home_link( $items, $args ) {

    $home_item =
            '<li>' .
            $args->before .
            '<a href="' . home_url( '/' ) . '" title="Home">' .
            $args->link_before . __( 'Home' ) . $args->link_after .
            '</a>' .
            $args->after .
            '</li>';

    $items = $home_item . $items;

    return $items;
}
bueltge
fuente
Parece que no leyó mi enunciado del problema, por lo que su solución no es lo que quiero, no necesito adjuntar un elemento al inicio o al final del menú, pero necesito un submenú debajo de un elemento principal específico. Lea la pregunta, todas las cosas se explican muy claramente.
Tahir Yasin
Lo siento, sí, tienes derecho; pero a menudo es el problema del idioma el trasfondo. Pero buscaré una solución.
bueltge