Saya mencoba menambahkan beberapa hal terkait ARIA ke fungsi wp_nav_menu. Saya menggunakan kelas walker khusus untuk tujuan ini:
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";
}
}
Saya hanya menyalin-paste kelas Walker_Nav_Menu asli dan menambahkan hal-hal, tetapi saya mendapatkan kesalahan karena variabel $ args diperlakukan seperti objek benar-benar sebuah array. Tetapi hal yang sangat aneh adalah kesalahan ini tetap ada, bahkan jika saya meneruskan walker asli seperti ini:
wp_nav_menu( array(
'theme_location' => 'main-nav',
'walker' => new Walker_Nav_Menu,
) );
Ini adalah pesan kesalahan yang saya dapatkan:
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
Garis-garisnya terlihat seperti ini (Dalam file asli!):
(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()
lolos.wp_nav_menu()
fungsi default tanpa alat bantu jalan, itu berfungsi dengan baik. Ya, tapi mengapa itu array? Saya bahkanvar_dump
menyuntingnya, tidak ada objek.new Walker_Nav_Menu
harus berperilaku identik dengan tidak melewati walker. Apakah ada hal lain yang terjadi, plugin yang menghubungkan / memanipulasi fungsi menu?Jawaban:
Saya mendapatkan kesalahan ini ketika tidak ada menu yang ditentukan atau tidak ada menu yang ditetapkan untuk lokasi di
Appearance->Menus
. Ketika itu terjadiwp_nav_menu
gunakan mundur halaman walker.wp_nav_menu
yaituwp_walker_page
wp_page_menu
wp_list_pages
walk_page_tree
Walker_Page
tidakWalker_Nav_Menu
.Dan ternyata kedua walker itu tidak kompatibel. Saya tidak tahu mengapa itu tidak gagal dengan anggun. Bagi saya itu seperti bug.
Dengan set menu di
wp-admin->Appearance->Menus
, kode Anda berfungsi.Anda dapat menghindari kesalahan dengan memeriksa untuk melihat bahwa ada menu yang ditetapkan ke lokasi sebelum mencoba menggunakan lokasi.
Atau, jika Anda lebih suka kode tambahan antihistamin (terima kasih @Rarst):
sumber
walk_nav_menu_tree()
yang digunakanWalker_Nav_Menu
secara default.has_nav_menu()
cek itu.$args
dikonversi menjadi objekwp-includes/nav-menu-template.php
pada baris 145 olehwp_nav_menu()
fungsi. Thewp_page_menu()
Fungsi yang digunakan sebagai fallback tidak melakukan itu, tapi malah melewati array ke Walker dari menu nav yang membutuhkan objek. Jika Anda baru saja menambahkan a$args = (object) $args
di atasstart_el
fungsi kelas Walker, Anda dapat memperbaikinya. Di mana tempat yang tepat untuk melaporkan ini ke tim WordPress?WP_Post
objek yang dilewatkan sebagai$item
berbeda, juga (Karena ini, halaman tidak memiliki nama dan daftar hanya terdiri dari kosong<li>
elemen). Diperlukan beberapa refactoring serius untuk membuat kedua alat bantu ini kompatibel.gunakan kode di bawah ini untuk memperbaiki:
sumber