自定义帖子类型和自定义菜单查看器,用于为活动的帖子类型附加自定义类

时间:2012-01-12 作者:NetConstructor.com

我有一个有趣的问题,我正在试图解决这里关于自定义导航菜单。

本质上,我已经为我的nav菜单创建了一个自定义walker类,并且手动添加了一个菜单项,将用户定向到“/文章”,这是一个自定义的post类型归档页面。(顺便说一句,据我所知,没有办法将这些自定义帖子类型的归档页面包含在左侧选择中是否正确?)

无论如何因此,我使用“自定义链接”对话框添加了菜单项,当您单击/访问“/文章”页面时,我的自定义walker会正确地突出显示导航菜单项。

我在这里遇到的问题是,当您选择一个新闻项目时,将不再选择此“/文章”菜单链接。因此,这里的问题是:当您打开这些帖子页面时,我需要在自定义walker类中更改什么(下面包括我正在使用的代码),以便将类附加到菜单中。

在我看来,这个功能应该内置到wordpress中,用于定制帖子类型。例如,如果您访问某个子页面,则会将类“current\\u page\\u parent”附加到父页面。我原以为会有“current\\u post\\u parent”或“current\\u custom\\u post\\u parent”之类的内容,但据我所知,这似乎并不存在。

团队,你知道我如何添加这个功能吗?

My Custom Walker Menu

// COMPANY - RIGHT MENU - CUSTOM MENU WALKER
class Company_Menu_Bar_Walker extends Walker_Nav_Menu {
function start_el(&$output, $item, $depth, $args) {
    global $wp_query;
    $indent = ( $depth ) ? str_repeat( "\\t", $depth ) : \'\';
    $class_names = $value = \'\';
    $classes = empty( $item->classes ) ? array() : (array) $item->classes;
    $current_indicators = array(\'current-menu-item\', \'current-menu-parent\', \'current_page_item\', \'current_page_parent\');
    $newClasses = array();
    foreach($classes as $original_class) {
    //check if it\'s indicating the current page, otherwise we don\'t need the class
        if (in_array($original_class, $current_indicators)) {
            array_push($newClasses, $original_class);
        }
    }
    $class_names = join( \' \', apply_filters( \'nav_menu_css_class\', array_filter( $newClasses), $item ) );
    if($class_names!=\'\') $class_names = \' class="\'. esc_attr( $class_names ) . \'"\';
    $output .= "\\t" . \'<li\' . $value . $class_names .\'>\';
    $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        ) .\'"\' : \'\';
    if($depth != 0) {
    //option to store things like sub-menus
    }
    $item_output = $args->before;
    $item_output .= \'<a\'. $attributes .\'>\';
    $item_output .= $args->link_before .apply_filters( \'the_title\', $item->title, $item->ID );
    $item_output .= \'</a>\';
    $item_output .= $args->after;
    $output .= apply_filters( \'walker_nav_menu_start_el\', $item_output, $item, $depth, $args );
}
}

Template Code which calls the custom walker*

<div class="rightbar-widgets" id="submenu">
<span id="title">select a page</span>
<?php wp_nav_menu( array(
\'theme_location\'    => \'company-menu\',
\'container\'         => \'\', 
\'container_class\'   => \'\', 
\'container_id\'      => \'\',
\'menu_class\'        => \'\',
\'menu_id\'           => \'\',
\'echo\'              => true,
\'before\'            => \'\',
\'after\'             => \'\',
\'link_before\'       => \'\',
\'link_after\'        => \'\',
\'fallback_cb\'       => \'\',
\'items_wrap\'        => \'<ul id="company-right-menu">\' . "\\n" . \'%3$s</ul>\' . "\\n",
\'depth\'             => 2,
\'walker\'            => new Company_Menu_Bar_Walker
)); 
?>
</div>

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

当我想添加class当前菜单项和当前页面祖先时,我总是使用wp\\u nav\\u菜单,而不使用任何自定义walker。如果我想改变,我只会建造自己的助行器,比如说,将类改为“sel”。

所以我添加了如下菜单:

<?php
  wp_nav_menu( 
    array(
    \'theme_location\' => \'company-menu\',
    \'container\' => false,
    \'menu_class\' => \'\',
    \'echo\' => true,
    \'before\' => \'\',
    \'after\' => \'\',
    \'link_before\' => \'\',
    \'link_after\' => \'\',
    \'depth\' => 2,
    \'items_wrap\' => \'<ul id="company-right-menu">\' . "\\n" . \'%3$s</ul>\' . "\\n"
    )
  );
?> 
然后我将这个动作添加到我的函数中。php文件:

function additional_active_item_classes($classes = array(), $menu_item = false){
    global $wp_query;

    if( in_array(\'current-menu-item\', $menu_item->classes) ){
        $classes[] = \'current-menu-item\';
    }

    // add class current-menu-item to archive
    if ( $menu_item->post_name == \'my_custom_post\' && is_post_type_archive(\'my_custom_post\') ) {
        $classes[] = \'current-menu-item\';
    }

    // add class current-menu-item to single
    if ( $menu_item->post_name == \'my_custom_post\' && is_singular(\'my_custom_post\') ) {
        $classes[] = \'current-menu-item\';
    }


    return $classes;
}
add_filter( \'nav_menu_css_class\', \'additional_active_item_classes\', 10, 2 );
如果这是在正确的方向,我可以帮助你更多,如果你想。

结束

相关推荐

Admin Theme customization

我遵循wordpress codex网站上关于通过插件创建管理主题的说明。我激活了插件,但我的样式表没有包含在<head>.. 这是我的代码:add_action( \'admin_init\', \'kd_plugin_admin_init\' ); add_action( \'admin_menu\', \'kd_plugin_admin_menu\' ); function kd_plugin_admin_init() { /* Register