Hinzufügen eines Untermenüs zu einem von wp_nav_menu mithilfe des Plugins generierten Menü

11

Ich habe ein Menü erstellt, von wp_nav_menudem aussehen

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

Ich möchte das obige Menü ändern, indem ich mit meinem Plugin ein Untermenü zu "Punkt 3" hinzufüge. Nachfolgend ist meine gewünschte Ausgabe aufgeführt.

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

Ich habe versucht, den Filtern zu folgen, aber diese haben mir nicht geholfen, die obige Ausgabe zu erzielen.

wp_setup_nav_menu_item
wp_get_nav_menu_items
wp_nav_menu_items

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

Die obige Lösung funktioniert, aber ich denke, es ist kein geeigneter Weg, um das gewünschte Ergebnis zu erzielen. Ich hätte gerne eine gute Lösung von Ihnen.

Tahir Yasin
quelle
Wow, also keine andere Antwort auf diese Frage? Ich suche auch nach einer einfachen Problemumgehung hier. Etwas, bei dem keine Zeichenfolgen analysiert werden. Es muss doch einen einfacheren Weg geben, oder?
14.
WP-Unterstützung beim Entschärfen dieser HTML-Struktur. Problemumgehung: Sie müssen nur die Namen der Untermenüs ändern. Besser ist es, die CSS-Klassen für die WordPress-Menüstruktur neu zu schreiben.
Foxsk8

Antworten:

2

Sie können Ihr Menü mit walker ändern.

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

erstelle eine Datei subMenu.php im Theme-Ordner und füge den folgenden Code hinzu.

<?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
quelle
0

Der Haken wp_nav_menu_itemsist richtig, wenn Sie der Struktur von WP Nav Menu Elemente hinzufügen möchten. Im folgenden Beispiel finden Sie einen statischen "Home" -Link. Der Link ist statisch, von der Funktion home_url()und ich habe dies nur in den Argumenten von WP Nav Menu für die Werte davor und danach erklärt. Das Li-Item ist statisch, wird in WordPress nur geändert, wenn Sie einen Walker für dieses Element verwenden. Der Haken wp_nav_menu_itemsbefindet sich in der Liste ul. Nachdem ich die Variable für diesen neuen Elementinhalt definiert habe, füge ich diese der Standardliste in der Variable hinzu $items, die vor der Listenausgabe festgelegt wurde. Jetzt nur noch eine Rückgabe aller Inhalte.

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
quelle
Anscheinend haben Sie meine Problembeschreibung nicht gelesen, sodass Ihre Lösung nicht meinen Wünschen entspricht. Ich muss am Anfang oder Ende des Menüs kein Element anfügen, aber ich benötige ein Untermenü unter einem bestimmten übergeordneten Element. Bitte lesen Sie die Frage, alle Dinge werden sehr klar erklärt.
Tahir Yasin
Sorry, ja du hast recht; aber oft ist das sprachproblem der hintergrund. Aber ich werde nach einer Lösung suchen.
Bueltge