使用wp_NAV_MENU的自定义查看器时出现错误“正在尝试获取非对象的属性”

时间:2013-06-16 作者:Rudolf

我正在尝试向wp\\u nav\\u菜单功能添加一些与ARIA相关的内容。为此,我使用自定义walker类:

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";
        }
}
我只是复制粘贴了原来的Walker\\u Nav\\u菜单类并添加了一些内容,但我遇到了错误,因为$args变量被视为对象,实际上是一个数组。但真正奇怪的是,这个错误仍然存在,即使我像这样把原来的助行器传进来:

wp_nav_menu( array(
    \'theme_location\' => \'main-nav\',
    \'walker\'         => new Walker_Nav_Menu,
) );
以下是我收到的错误消息:

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
这些行如下所示(在原始文件中!):

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

2 个回复
最合适的回答,由SO网友:s_ha_dum 整理而成

当没有为位置定义菜单或没有设置菜单时,我会出现此错误Appearance->Menus. 当这种情况发生时wp_nav_menu 使用page walker回退。

fallback (default) for wp_nav_menuwp_walker_pagewp_page_menuwp_list_pageswalk_page_treeWalker_PageWalker_Nav_Menu.显然这两个步行者不兼容。我不知道为什么它没有优雅地失败。对我来说,这似乎是一个错误。

菜单设置为wp-admin->Appearance->Menus, 您的代码工作正常。

在尝试使用该位置之前,可以通过检查是否有分配给该位置的菜单来避免错误。

$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,
  ) );
}
或者,如果您希望使用较少的抗组胺药物代码(感谢@Rarst):

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

SO网友:hannanstd

使用以下代码进行修复:

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

结束

相关推荐

Wordpress Remove Submenus

我在这里找到了一个已回答的问题Remove menus and submenus 2 Answers 对于我的问题,但是否有一种方法可以稍微更改代码,以便删除所有编辑器角色的子菜单。不仅仅针对一个用户?有没有办法改进这段代码?我正在使用3.5.1 WordPress版本code that I am using: add_action(\'_admin_menu\', \'remove_editor_submenu\', 1); function remove_editor_submenu() {&