将自定义帖子类型档案添加到WordPress菜单


10

有没有一种方法(除了添加自定义链接外)可以将自定义帖子类型档案添加到WordPress的菜单中?如果使用自定义链接(例如/ cpt-archive-slug /)添加了WordPress,则WordPress不会将类应用于current-menu-itemlist元素,这会给菜单样式设置带来挑战。

如果自定义链接包含整个URL(例如,http : //site.com/cpt-archive-slug/),则会添加这些类。但是,这可能不是“最佳实践”。

Answers:


5

最好的选择是使用具有完整url的自定义链接,因为自定义帖子类型档案是不同形式的基于分类的档案(类别,标签,任何自定义分类)和基于日期的档案,它们都有自己的档案标签。


6

我知道这很旧,但是我也有这个问题,我发现一种比较干净的处理方法是使用自定义菜单浏览器

class KB_Custom_Menu_Walker extends Walker_Nav_Menu {

  protected static $custom_post_types = array();

  public function start_el(&$output, $item, $depth=0, $args=array(), $id=0) {
    if (isset( self::$custom_post_types[ $item->url ] )) {
      $item->url = get_post_type_archive_link( self::$custom_post_types[$item->url] );
    }
    parent::start_el($output, $item, $depth, $args, $id);
  }

  public static function custom_post_types($type=null) {
    if ($type) {
      self::$custom_post_types[ '#post_type_'.$type ] = $type;
    }
    return self::$custom_post_types;
  }
}

具有URL为的自定义链接菜单项#post_type_album,您可以像这样使用它:

# Where you defined your custom post type (could be anywhere anyway)
KB_Custom_Menu_Walker::custom_post_types('album');

# And display the menu
wp_nav_menu(array(
  'theme_location' => 'primary-nav',
  'walker' => new KB_Custom_Menu_Walker(),
));

注意:这假定您的帖子类型的子句和名称相同。


+1为较晚的质量答案。这对社区有好处!
Brian Fegter 2012年

2

我在tungd的答案了一些扩展,以使用该方法提供更多通用性。此实现允许在菜单“宏”和仅后端知道的内部Wordpress URL之间添加任意映射。

我还决定使用!这些宏的前缀来避免它们与命名锚冲突-这包括从链接URL中剥离“ http://”的开销(因为Wordpress会尝试将这些奇怪的链接规范化) 。如果该实现使您感到困扰,则您始终可以像以前一样删除preg_replace()呼叫并将其#用作链接前缀。

class Extendable_Menu_Walker extends Walker_Nav_Menu
{
    protected static $custom_urls = array();

    public static function setupUrls()
    {
        // calls to self::mapPostType($postTypeName) and 
        // self::createMapping($wildcard, $url) go here...
    }

    public function start_el(&$output, $item, $depth=0, $args=array(), $id=0)
    {
        $url = preg_replace('@^https?://@', '', $item->url);
        if (isset( self::$custom_urls[ $url ] )) {
            $item->url = self::$custom_urls[ $url ];
        }
        parent::start_el($output, $item, $depth, $args, $id);
    }

    public static function createMapping($urlKey, $realUrl)
    {
        self::$custom_urls['!' . $urlKey] = $realUrl;
    }

    public static function mapPostType($type)
    {
        self::createMapping('post_type_' . $type, get_post_type_archive_link($type));
    }
}

add_action('init', array('Extendable_Menu_Walker', 'setupUrls'));

1

您可以创建一个页面,然后对其应用自定义存档模板。我创建并使用archive- {post-type} .php模板名称,就像使用默认存档一样,我只是手动将其应用于Page。

如果这样做,我建议您将CPT设置为has_archive ='false'以避免永久链接冲突,无论是否确保您的Page所具有的永久链接标记与CPT存档标记所设置的标记都不相同。



0

我认为我必须创建一个新的“父”帖子类型,因此我要显示的自定义帖子类型变成“孩子”,并且父菜单将在菜单中列出。

这应该是一个选择。仅创建一个虚拟父项以使其在菜单中列出是一项繁重的工作。

我想要一种从模板或功能执行此操作的方法,因此不必在多站点安装的每个站点的每个菜单设置中都执行此操作。


1
我的意思是,我想在菜单中显示的自定义帖子类型的帖子将是新创建的父项的唯一子类型,我希望它会在菜单设置中列在父项下。
sergio


0

我没有添加链接,而是创建了一个空白页。在该页面中,我在编辑器中添加了诸如“从cpt-name生成的内容”之类的内容,以便我的客户知道所有内容的来源。

然后,将该页面添加到菜单,并使用以下代码确保在运行archives-cpt或single-cpt时突出显示该页面。

/**
 * Fix to add Custom post types to nav menu
 * If you custom post is called "concepts"
 * create a new empty page called concepts and add this
 */
 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';
    }

    if ( $menu_item->title == 'PAGE TITLE' && is_post_type_archive('cpt-slug') ) {
        $classes[] = 'current-menu-item';
    }

    if ( $menu_item->title == 'PAGE TITLE' && is_singular('cpt-slug') ) {
        $classes[] = 'current-menu-item';
    }


    return $classes;
}
add_filter( 'nav_menu_css_class', 'additional_active_item_classes', 10, 2 );

这将检查菜单/页面标题,以及我们是否实际上正在查看自定义帖子类型的档案或单个页面。如果为true,则将添加current-menu-item类。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.