Come aggiungere sottomenu a un menu generato da wp_nav_menu usando il plugin


11

Ho un menu generato da wp_nav_menucui assomigliano

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

Voglio modificare il menu sopra aggiungendo un sottomenu a "Item 3" usando il mio plugin, quindi di seguito è l'output desiderato.

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

Ho provato a seguire i filtri ma questi non mi hanno aiutato a ottenere l'output di cui sopra.

wp_setup_nav_menu_item
wp_get_nav_menu_items
wp_nav_menu_items

Soluzione 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 soluzione sopra funziona ma penso che non sia un modo corretto di raggiungere il risultato desiderato. Mi piacerebbe avere una buona soluzione da te.


Wow, quindi nessun'altra risposta a questa domanda? Sto anche cercando una soluzione semplice qui. Qualcosa che non comporta l'analisi delle stringhe. Deve esserci un modo più semplice, giusto?
RGIN

Supporto WP su default questa struttura html. Per ovviare al problema, è necessario modificare solo i nomi delle classi dei sottomenu css. Meglio è riscrivere le tue classi css per la struttura del menu wordpress.
Foxsk8,

Risposte:


2

È possibile modificare il menu utilizzando Walker.

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

creare un file subMenu.php nella cartella del tema aggiungere sotto il codice.

<?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";  
    }
}

0

L'hook wp_nav_menu_itemsè giusto se si aggiungono elementi alla struttura del menu WP Nav. Vedi l'esempio seguente per aggiungere un link "Home" statico. Il link è statico, dalla funzione home_url()e l'ho inserito solo negli argomenti del menu WP Nav per i valori prima e dopo. L'elemento li è statico, è chnaged solo in WordPress, se si utilizza un Walker per questo elemento. Il gancio wp_nav_menu_itemsè all'interno dell'elenco ul. Dopo aver definito il var per questo nuovo contenuto dell'articolo, lo aggiungo all'elenco predefinito nel var $items, impostato prima dell'output dell'elenco. Ora solo un ritorno di tutti i contenuti.

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;
}

Sembra che tu non abbia letto la mia dichiarazione di problema, quindi la tua soluzione non è quella che voglio, non ho bisogno di allegare un elemento all'inizio o alla fine del menu, ma ho bisogno di un sottomenu sotto un elemento padre specifico. Si prega di leggere la domanda, tutte le cose sono spiegate molto chiaramente.
Tahir Yasin,

Scusa, sì, hai ragione; ma spesso il problema del linguaggio è in background. Ma vedrò una soluzione.
costruzione
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.