Cum să adaugi un sub-meniu într-un meniu generat de wp_nav_menu folosind un plugin
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.

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

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

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.
