Cum să adaugi un sub-meniu într-un meniu generat de wp_nav_menu folosind un plugin

5 nov. 2012, 09:57:31
Vizualizări: 22.9K
Voturi: 13

Am un meniu generat de wp_nav_menu care arată astfel:

<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">Element 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">Element 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">Element 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">Element 4</a></li>
</ul>

Vreau să modific meniul de mai sus adăugând un sub-meniu la "Element 3" folosind plugin-ul meu. Mai jos este rezultatul dorit:

<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">Element 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">Element 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">Element 3</a>
    <ul class="sub-menu">
      <li class="menu-item" id="menu-item-48"><a href="http://www.example.com/child1.com">copil 1</a></li>
      <li class="menu-item" id="menu-item-49"><a href="http://www.example.com/child2.com">copil 2</a></li>
      <li class="menu-item" id="menu-item-50"><a href="http://www.example.com/child3.com">copil 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">Element 4</a></li>
</ul>

Am încercat următoarele filtre, dar acestea nu m-au ajutat să obțin rezultatul de mai sus:

wp_setup_nav_menu_item
wp_get_nav_menu_items
wp_nav_menu_items

Soluție alternativă 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;
}

Soluția de mai sus funcționează, dar cred că nu este cea mai potrivită modalitate de a obține rezultatul dorit. Mi-ar plăcea să primesc o soluție mai bună de la voi.

2
Comentarii

Wow, deci nu există alt răspuns la această întrebare? Și eu caut o soluție simplă aici. Ceva care să nu implice parsarea stringurilor. Trebuie să existe o cale mai ușoară, nu?

rgin rgin
14 nov. 2013 19:58:41

Suportul WP implicit acceptă această structură HTML. Soluția necesită doar modificarea numelor claselor CSS pentru submeniu. Mai bine este să rescrieți clasele CSS pentru structura de meniu WordPress.

Foxsk8 Foxsk8
21 feb. 2014 23:44:05
Toate răspunsurile la întrebare 2
0

Puteți modifica meniul utilizând un walker.

include('subMenu.php');
$menu = wp_nav_menu(array('menu' => 'NUMELE-MENIULUI-TĂU', 'menu_class' => 'megamenu', 'walker' => new subMenu));

Creați un fișier subMenu.php în folderul temei și adăugați următorul cod.

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

    if('Elementul 3' == $item->title){
        $output .= '<ul class="sub-menu">
        <li class="menu-item" id="menu-item-48"><a href="http://www.example.com/copil1.com">copil 1</a></li>
        <li class="menu-item" id="menu-item-49"><a href="http://www.example.com/copil2.com">copil 2</a></li>
        <li class="menu-item" id="menu-item-50"><a href="http://www.example.com/copil3.com">copil 3</a></li>
        </ul>';
    }
    $output .= "</li>\n";  
    }
}
11 sept. 2014 13:45:47
2

Hook-ul wp_nav_menu_items este potrivit dacă dorești să adaugi elemente în structura meniului de navigare WP.

Vezi exemplul de mai jos pentru a adăuga un link static "Acasă". Link-ul este static, provenind din funcția home_url() și l-am încorporat doar în argumentele din WP Nav Menu pentru valorile before și after. Elementul li este static, modificându-se în WordPress doar dacă folosești un Walker pentru acest element. Hook-ul wp_nav_menu_items este în interiorul listei ul. După definirea variabilei pentru conținutul noului element, îl adaug în lista implicită din variabila $items, setată înainte de afișarea listei. Acum rămâne doar returnarea întregului conținut.

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="Acasă">' .
            $args->link_before . __( 'Acasă' ) . $args->link_after .
            '</a>' .
            $args->after .
            '</li>';

    $items = $home_item . $items;

    return $items;
}
5 nov. 2012 15:40:05
Comentarii

Se pare că nu ai citit enunțul problemei mele, așa că soluția ta nu este ceea ce doresc. Nu am nevoie să atașez un element la începutul sau sfârșitul meniului, ci am nevoie de un sub-meniu sub un anumit element părinte. Te rog să citești întrebarea, toate detaliile sunt explicate foarte clar.

Tahir Yasin Tahir Yasin
5 nov. 2012 16:11:56

Scuze, ai dreptate; dar deseori problema de fundal este cea lingvistică. Dar voi căuta o soluție.

bueltge bueltge
6 nov. 2012 00:49:35