检查菜单项的“类型”

时间:2014-09-25 作者:Andrew

The question

我想检查菜单中的每个项目是什么类型的菜单项,即它是页面、类别还是自定义链接。

What I want to achieve

我想创建一个由类别和页面链接组成的菜单。在菜单中的类别中,我只想显示那些包含帖子的类别。页面链接将始终显示。

此菜单将在电子商务网站上使用,其目录会不断变化。制作一个隐藏空类别的动态菜单,无需在管理区域不断更新菜单。

What I have now

基于此的自定义walker菜单SE post 通过向start_el 作用不幸的是,我的逻辑也隐藏了页面链接

完整walker菜单功能:

function cs_modify_nav_menu_args( $args ){
if( \'primary-menu\' == $args[\'theme_location\'] ){
    $args[\'walker\'] = new cs_walker_nav_menu();
}
return $args;
}

class cs_walker_nav_menu extends Walker_Nav_Menu {
// filter empty categories and add main/sub classes to li\'s and links
function start_el(  &$output, $item, $depth = 0, $args = array(), $id = 0 ) {
    global $wp_query;


    if(!is_page($item->ID)){

        $non_empty_categories = get_categories(array(\'taxonomy\' => \'product_cat\'));
        $empty_categories = array();
        $is_empty = true;
        // check menu items are for an empty category
        foreach ( $non_empty_categories as $cat )
            if ($item->object_id === $cat->term_id)
                $is_empty = false;
            // if it is empty add it to array
            if ($is_empty)
                $empty_categories[] = $item->ID;
        // Don\'t build nav item for items in the is_empty array
        foreach( $empty_categories as $category_to_skip )
            if( $item->ID == $category_to_skip )
                return $output;
    }

    $indent = ( $depth > 0 ? str_repeat( "\\t", $depth ) : \'\' ); // code indent

    // depth dependent classes
    $depth_classes = array(
        ( $depth == 0 ? \'main-menu-item\' : \'sub-menu-item\' ),
        ( $depth >=2 ? \'sub-sub-menu-item\' : \'\' ),
        ( $depth % 2 ? \'menu-item-odd\' : \'menu-item-even\' ),
        \'menu-item-depth-\' . $depth
    );
    $depth_class_names = esc_attr( implode( \' \', $depth_classes ) );

    // passed classes
    $classes = empty( $item->classes ) ? array() : (array) $item->classes;
    $class_names = esc_attr( implode( \' \', apply_filters( \'nav_menu_css_class\', array_filter( $classes ), $item ) ) );

    // build html
    $output .= $indent . \'<li id="nav-menu-item-\'. $item->ID . \'" class="\' . $depth_class_names . \' \' . $class_names . \'">\';

    // link 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        ) .\'"\' : \'\';
    $attributes .= \' class="menu-link \' . ( $depth > 0 ? \'sub-menu-link\' : \'main-menu-link\' ) . \'"\';

    $item_output = sprintf( \'%1$s<a%2$s>%3$s%4$s%5$s</a>%6$s\',
        $args->before,
        $attributes,
        $args->link_before,
        apply_filters( \'the_title\', $item->title, $item->ID ),
        $args->link_after,
        $args->after
    );

    // build html
    $output .= apply_filters( \'walker_nav_menu_start_el\', $item_output, $item, $depth, $args );
}
}

Attempted solutions

这个nav_menu_item 对象不提供菜单项类型。

通过$item->ID “to is\\u”页面不返回。我相信$item->ID 菜单项ID不是帖子ID。

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

幸运的是,有一个简单的解决方法。

这个$item 在Walker中,提供类,如果菜单项是存档,则可以获得其中一个:

菜单项类型分类法(常规)以及

如果希望此逻辑适用于各种存档(而不仅仅是product_cat) 您还需要更改分类法-再次,$item 方便地将您的$分类提供为$item->object.

现在您只需更改if 以及Walker

if( $item->type == \'taxonomy\' ) {

    $non_empty_categories = get_categories( array( \'taxonomy\' => $item->object ) );

    // ... The rest of your logic works fine

}
应该可以正常工作:)

结束

相关推荐

Walker导航从某一深度移除子菜单UL

我想删除sub-menu ul和.menu-item-has-children 当菜单深度优于或等于2时初始化。所以,我只想要一个最多有3个子菜单的菜单。其他子项仍将显示在菜单中,但不会显示在子菜单中。使用wp\\U nav\\U菜单(“深度”=>3),它不会附加所有项目。所以,我想我需要使用一个定制的walker导航。我不知道该怎么做start_lvl. 如何计算深度并删除ul和类。。。我的目标是更改此菜单:菜单项具有子菜单项1菜单项2菜单项具有子菜单项3菜单项4菜单项具有子菜单项5菜单项6:菜单