Lỗi cố gắng lấy tài sản của phi đối tượng, với Walker tùy chỉnh cho wp_nav_menu


8

Tôi đang cố gắng thêm một số nội dung liên quan đến ARIA vào hàm wp_nav_menu. Tôi sử dụng một lớp walker tùy chỉnh cho mục đích này:

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

Tôi chỉ sao chép-dán lớp Walker_Nav_Mothy ban đầu và thêm công cụ, nhưng tôi gặp lỗi vì biến $ args được xử lý như một đối tượng thực sự là một mảng. Nhưng điều thực sự kỳ lạ là lỗi này vẫn tồn tại, ngay cả khi tôi vượt qua trong máy đi bộ ban đầu như thế này:

wp_nav_menu( array(
    'theme_location' => 'main-nav',
    'walker'         => new Walker_Nav_Menu,
) );

Đây là những thông báo lỗi tôi nhận được:

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

Các dòng trông như thế này (Trong tệp gốc!):

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

Bạn có nhận được lỗi nếu không vượt qua walker không? Đối số nên là đối tượng, tôi nghĩ rằng đó là những gì tài liệu nội tuyến nói và những gì wp_nav_menu()vượt qua.
Rarst

Không, nếu tôi chỉ sử dụng wp_nav_menu()chức năng mặc định mà không có máy đi bộ, nó hoạt động hoàn hảo. Vâng, nhưng tại sao nó là một mảng sau đó? Tôi thậm chí var_dump'ed nó, không có đối tượng.
Rudolf

Tôi không chắc chắn những gì đang xảy ra sau đó, bởi vì đi qua new Walker_Nav_Menunên cư xử giống hệt nhau để không vượt qua walker. Có bất cứ điều gì khác đang xảy ra, bất kỳ plugin nào nối vào / thao tác chức năng menu không?
Rarst

Tôi mới thực hiện một số thử nghiệm bổ sung và tôi chắc chắn đây là lỗi của WordPress. Trong trường hợp của tôi, menu điều hướng tôi sử dụng không được chỉ định trong phần phụ trợ. Do đó, các trang danh sách dự phòng đã được sử dụng, có vẻ như sau đó biến args là một mảng. Tôi sẽ theo dõi điều này đến nguồn bây giờ, sau đó cho bạn biết những gì tôi tìm thấy.
Rudolf

Nếu tôi chỉ định một menu chính xác, nó hoạt động!
Rudolf

Câu trả lời:


18

Tôi gặp lỗi này khi không có menu nào được xác định hoặc không có menu nào được đặt cho vị trí tại Appearance->Menus. Khi điều đó xảy ra wp_nav_menusử dụng một dự phòng walker trang.

  1. Dự phòng (mặc định) chowp_nav_menuwp_walker_page
  2. trong đó sử dụng wp_page_menu
  3. trong đó sử dụng wp_list_pages
  4. trong đó sử dụng walk_page_tree
  5. mà sử dụng Walker_Pagekhông Walker_Nav_Menu.

Và rõ ràng hai người đi bộ không tương thích. Tôi không biết tại sao nó không thất bại một cách duyên dáng. Đó dường như là một lỗi với tôi.

Với một menu được đặt tại wp-admin->Appearance->Menus, mã của bạn hoạt động.

Bạn có thể tránh lỗi bằng cách kiểm tra xem có một menu được gán cho vị trí trước khi thử sử dụng vị trí đó không.

$locations = get_nav_menu_locations();
if (0 !== $locations['main-nav']) {
  wp_nav_menu( array(
      'theme_location' => 'main-nav',
      'walker'         => new Walker_Nav_Menu_With_Aria,
  ) );
}

Hoặc, nếu bạn thích mã bổ sung kháng histamine ít hơn (cảm ơn @Rarst):

if (has_nav_menu('primary')) {
  wp_nav_menu( array(
      'theme_location' => 'primary',
      'walker'         => new Walker_Nav_Menu_With_Aria,
  ) );
}

Dự phòng chỉ được sử dụng khi tất cả các trang khác không hiển thị trang. Nếu menu hoạt động đúng, các mục được walk_nav_menu_tree()sử dụng Walker_Nav_Menutheo mặc định.
Rarst

Cập nhật tốt đẹp! Không xảy ra với tôi chức năng sai có thể là lấy walker (đó là meh). Ngoài ra còn có has_nav_menu()cho kiểm tra đó.
Rarst

Đó chính xác là những gì tôi muốn đăng: D Menu điều hướng $argsđược chuyển đổi thành một đối tượng wp-includes/nav-menu-template.phptrên dòng 145 theo wp_nav_menu()chức năng. Các wp_page_menu()chức năng được sử dụng như một fallback không làm điều đó, nhưng thay vào đó chỉ cần vượt qua các mảng đến Walker từ menu nav mà cần đối tượng. Nếu bạn chỉ thêm một phần $args = (object) $argstrên cùng của start_elchức năng của lớp Walker, bạn có thể sửa lỗi này. Đâu sẽ là nơi thích hợp để báo cáo điều này với nhóm WordPress?
Rudolf

Các lỗi cốt lõi của @Rudolf nên được báo cáo tại core.trac.wordpress.org
Rarst

Đối WP_Posttượng được truyền $itemlà khác nhau (Vì điều này, các trang không có tên và danh sách chỉ bao gồm các <li>thành phần trống ). Một số tái cấu trúc nghiêm túc sẽ là cần thiết để làm cho hai người đi bộ này tương thích.
Rudolf

0

sử dụng mã dưới đây để sửa chữa:

add_filter( 'wp_get_nav_menu_object', 'override_wp_get_nav_menu_object', 10, 2 );
function override_wp_get_nav_menu_object( $menu_obj, $menu ) {

    if ( ! is_object( $menu_obj ) ) {
        $menu_obj = (object) array( 'name' => '' );
    }

    return $menu_obj;
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.