start_lvl Wird im benutzerdefinierten walker_nav_menu ignoriert


8

Dies ist mein erstes Projekt mit WordPress, und ich habe versucht, einen benutzerdefinierten Walker für ein Fußzeilenmenü zu erstellen.

Grundsätzlich möchte ich das Menü von der <ul> <li></li> </ul>Struktur in eine <p> <span></span> </p>Struktur ändern .

Das Menü und das Zeug zeigen eine Datei an und ich konnte die start_elund end_elFunktionen ohne Probleme anpassen , so dass ich jetzt Folgendes bekomme:

<ul> <span>*link*</span> <span>*link*</span> </ul>

Was offensichtlich auf halbem Weg ist, ich habe die start_lvl()und end_lvl()Tags wie unten gezeigt geschrieben, aber sie werden von WordPress ignoriert - nichts, was ich in sie (sogar die()) eingefügt habe, wird ausgeführt (was ein bisschen verdächtig ist), aber ich weiß, dass die Klasse wegen aufgerufen wird die start_el()Funktion.

function start_lvl(&$output, $depth = 0, $args = array()) {
    $output = "\n<p class=\"sub-menu\">\n";
}

function end_lvl(&$output, $depth = 0, $args = array()) {
    $output .= "\n</p>\n";
}

Weiß jemand, warum das passiert - habe ich etwas wirklich Offensichtliches verpasst?

Ich verwende die neueste Version von WordPress auf Apache mit PHP, 5.3.6wenn es hilft.

Danke im Voraus,

Felix :)


1
Basierend auf dem, was Sie gezeigt haben, sehen alle offensichtlichen Dinge korrekt aus.
Totels

Antworten:


8

Ihre my_extended_walker-Klasse ist in Ordnung, aber wenn Sie die Funktion wp_nav_menu aufrufen , verwenden Sie den Parameter items_wrap .

wp_nav_menu( array( 'items_wrap' => '<p>%3$s</p>', 'walker'=>new my_extended_walker() ) );

Das start_lvl wird für untergeordnete Elemente verwendet.


2
Das start_lvl wird für untergeordnete Elemente verwendet. Sie haben gerade eine Menge Dinge in meinem Leben gerettet
Ashutosh

3

Ok, ich bin mir nicht sicher, was ich falsch gelesen habe, als ich das gepostet habe, aber deine ganze Klasse sollte ungefähr so ​​aussehen:

class my_extended_walker extends Walker_Nav_Menu {
    function start_lvl(&$output, $depth = 0, $args = array()) {
        $output .= "\n<p class=\"sub-menu\">\n";
    }

    function end_lvl(&$output, $depth = 0, $args = array()) {
        $output .= "\n</p>\n";
    }
}

Und übergeben Sie dann beim Aufruf den 'Walker' als Parameter wp_nav_menu

wp_nav_menu( array( 'walker'=>new my_extended_walker() ) );

Wenn Sie das haben, sollte es Ihnen gut gehen. Ich schaue auf Arbeitscode, der genau das tut. Ich weiß allerdings nicht, wie man dort <p>Tags einfügt. Möglicherweise erhalten Sie ein ungültiges Markup.


Hallo, ja, ich habe getan, dass unten die volle Klasse ist,
fenfe1

Klasse BB_Nav_Footer_Walker erweitert Walker_Nav_Menu {Funktion start_lvl (& $ output, $ depth = 0, $ args = array ()) {$ output = "\ n <p class = \" Untermenü \ "> \ n"; } function end_lvl (& $ output, $ depth = 0, $ args = array ()) {$ output. = "\ n </ p> \ n"; }}
fenfe1

Ich habe versucht, <div>anstatt <p>nur zu sehen, ob ich diese Funktionen dazu bringen kann, etwas zu tun, aber bisher keine Freude :(
fenfe1

Das <div>und <p>sollte den Walker nicht beschädigen, kann aber zu einem ungültigen Markup führen. Du hast $output =und nicht $output .=in deinem start_lvl. Das könnte Ärger verursachen. Ist das der komplette Walker, den du gepostet hast?
s_ha_dum

Hallo ja Ich reparierte das .=Bit dies nun die komplette Klasse (I die entfernt start_lvl()und end_lvl()Funktionen zu sehen , ob sie einen Unterschied gemacht) - pastebin.com/zfcBxHd8
fenfe1

2

Haben Sie darüber nachgedacht, alle Navigationsmenüelemente mit der integrierten Funktion wp_get_nav_menu_items();abzurufen und den Inhalt manuell auszugeben?

Beispiel :: Erstellen einer einfachen Menüliste

    // Get the nav menu based on $menu_name (same as 'theme_location' or 'menu' arg to wp_nav_menu)
    // This code based on wp_nav_menu's code to get Menu ID from menu slug

    $menu_name = 'custom_menu_slug';

    if ( ( $locations = get_nav_menu_locations() ) && isset( $locations[ $menu_name ] ) ) {
    $menu = wp_get_nav_menu_object( $locations[ $menu_name ] );

    $menu_items = wp_get_nav_menu_items($menu->term_id);

    $menu_list = '<ul id="menu-' . $menu_name . '">';

    foreach ( (array) $menu_items as $key => $menu_item ) {
        $title = $menu_item->title;
        $url = $menu_item->url;
        $menu_list .= '<li><a href="' . $url . '">' . $title . '</a></li>';
    }
    $menu_list .= '</ul>';
    } else {
    $menu_list = '<ul><li>Menu "' . $menu_name . '" not defined.</li></ul>';
    }
    // $menu_list now ready to output
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.