Ich versuche, der Funktion wp_nav_menu einige ARIA-bezogene Dinge hinzuzufügen. Zu diesem Zweck verwende ich eine benutzerdefinierte Walker-Klasse:
class Walker_Nav_Menu_With_Aria extends Walker_Nav_Menu {
function start_lvl( &$output, $depth = 0, $args = array() ) {
$indent = str_repeat("\t", $depth);
$output .= "\n$indent<ul class=\"sub-menu\" role=\"group\">\n";
}
function end_lvl( &$output, $depth = 0, $args = array() ) {
$indent = str_repeat("\t", $depth);
$output .= "$indent</ul>\n";
}
function start_el( &$output, $item, $depth = 0, $args = array(), $id = 0 ) {
$indent = ( $depth ) ? str_repeat( "\t", $depth ) : '';
$class_names = $value = '';
$classes = empty( $item->classes ) ? array() : (array) $item->classes;
$classes[] = 'menu-item-' . $item->ID;
$class_names = join( ' ', apply_filters( 'nav_menu_css_class', array_filter( $classes ), $item, $args ) );
$class_names = $class_names ? ' class="' . esc_attr( $class_names ) . '"' : '';
$id = apply_filters( 'nav_menu_item_id', 'menu-item-'. $item->ID, $item, $args );
$id = $id ? ' id="' . esc_attr( $id ) . '"' : '';
// Add attributes for <li>
$li_attributes = ' role="treeitem"';
$li_attributes .= ' aria-expanded="false"';
$output .= $indent . '<li' . $id . $value . $class_names . $li_attributes .'>';
$attributes = ! empty( $item->attr_title ) ? ' title="' . esc_attr( $item->attr_title ) .'"' : '';
$attributes .= ! empty( $item->target ) ? ' target="' . esc_attr( $item->target ) .'"' : '';
$attributes .= ! empty( $item->xfn ) ? ' rel="' . esc_attr( $item->xfn ) .'"' : '';
$attributes .= ! empty( $item->url ) ? ' href="' . esc_attr( $item->url ) .'"' : '';
// Add attributes for <a>
$attributes .= $depth == 0 ? ' tabindex="0"' : ' tabindex="-1"';
$item_output = $args->before;
$item_output .= '<a'. $attributes .'>';
$item_output .= $args->link_before . apply_filters( 'the_title', $item->title, $item->ID ) . $args->link_after;
$item_output .= '</a>';
$item_output .= $args->after;
$output .= apply_filters( 'walker_nav_menu_start_el', $item_output, $item, $depth, $args );
}
function end_el( &$output, $item, $depth = 0, $args = array() ) {
$output .= "</li>\n";
}
}
Ich habe gerade die ursprüngliche Walker_Nav_Menu-Klasse kopiert und hinzugefügt, aber es werden Fehler angezeigt, da die Variable $ args, die wie ein Objekt behandelt wird, wirklich ein Array ist. Aber das wirklich Seltsame ist, dass dieser Fehler weiterhin besteht, selbst wenn ich den ursprünglichen Walker wie folgt übergebe:
wp_nav_menu( array(
'theme_location' => 'main-nav',
'walker' => new Walker_Nav_Menu,
) );
Dies sind die Fehlermeldungen, die ich erhalte:
NOTICE: TRYING TO GET PROPERTY OF NON-OBJECT IN /USERS/RUDOLF/SITES/LOCALHOST/WP/WP-INCLUDES/NAV-MENU-TEMPLATE.PHP ON LINE 88
NOTICE: TRYING TO GET PROPERTY OF NON-OBJECT IN /USERS/RUDOLF/SITES/LOCALHOST/WP/WP-INCLUDES/NAV-MENU-TEMPLATE.PHP ON LINE 90
NOTICE: TRYING TO GET PROPERTY OF NON-OBJECT IN /USERS/RUDOLF/SITES/LOCALHOST/WP/WP-INCLUDES/NAV-MENU-TEMPLATE.PHP ON LINE 90
NOTICE: TRYING TO GET PROPERTY OF NON-OBJECT IN /USERS/RUDOLF/SITES/LOCALHOST/WP/WP-INCLUDES/NAV-MENU-TEMPLATE.PHP ON LINE 92
Die Zeilen sehen folgendermaßen aus (In der Originaldatei!):
(88) $item_output = $args->before;
(89) $item_output .= '<a'. $attributes .'>';
(90) $item_output .= $args->link_before . apply_filters( 'the_title', $item->title, $item->ID ) . $args->link_after;
(91) $item_output .= '</a>';
(92) $item_output .= $args->after;
wp_nav_menu()
passiert.wp_nav_menu()
ohne Gehhilfe verwende, funktioniert sie perfekt. Ja, aber warum ist es dann ein Array? Ich habe es sogarvar_dump
bearbeitet, kein Objekt.new Walker_Nav_Menu
sollte sich genauso verhalten wie das Nicht-Passieren des Walkers. Ist noch etwas los, irgendwelche Plugins, die sich in die Menüfunktion einbinden / diese manipulieren?Antworten:
Ich erhalte diese Fehlermeldung, wenn für den Standort unter keine Menüs definiert oder keine Menüs festgelegt sind
Appearance->Menus
. In diesem Fallwp_nav_menu
wird ein Page Walker-Fallback verwendet.wp_nav_menu
istwp_walker_page
wp_page_menu
wp_list_pages
walk_page_tree
Walker_Page
nichtWalker_Nav_Menu
.Und anscheinend sind die beiden Wanderer nicht kompatibel. Ich weiß nicht, warum es nicht anmutig scheitert. Das scheint mir ein Fehler zu sein.
Wenn ein Menü auf eingestellt ist
wp-admin->Appearance->Menus
, funktioniert Ihr Code.Sie können den Fehler vermeiden, indem Sie überprüfen, ob dem Standort ein Menü zugewiesen ist, bevor Sie versuchen, den Standort zu verwenden.
Oder wenn Sie weniger Antihistamin-Code bevorzugen (danke @Rarst):
quelle
walk_nav_menu_tree()
dieWalker_Nav_Menu
standardmäßig verwendet werden.has_nav_menu()
für diesen Scheck.$args
inwp-includes/nav-menu-template.php
Zeile 145 in ein Objekt konvertiertwp_nav_menu()
. Diewp_page_menu()
Funktion, die als Fallback verwendet wird, tut dies nicht, sondern übergibt das Array einfach über das Navigationsmenü, das das Objekt benötigt, an den Walker. Wenn Sie$args = (object) $args
oben in derstart_el
Funktion der Walker-Klasse nur ein hinzufügen , können Sie dies beheben. Wo wäre der richtige Ort, um dies dem WordPress-Team zu melden?WP_Post
Objekt$item
ist ebenfalls unterschiedlich (Aus diesem Grund haben die Seiten keine Namen und die Liste besteht nur aus leeren<li>
Elementen). Einige ernsthafte Umgestaltungen wären erforderlich, um diese beiden Wanderer kompatibel zu machen.Verwenden Sie den folgenden Code zur Reparatur:
quelle