有一个更简单的解决方案。只需为每种帖子类型创建页面就可以了,这样您就可以拥有导航项目,因为如您所知,WP无法识别正在浏览的自定义类型与该页面相关。
而是在外观->菜单中创建一个自定义链接。只需输入将返回您的自定义类型的URL并为其提供标签,然后按“添加到菜单”即可。
http://example.com/workshops/
或非漂亮的永久链接:
http://example.com/?post_type=workshops
仅此一项就可以简单地创建一个导航按钮,以显示具有该自定义帖子类型的所有帖子,并且在您单击该导航项时还将添加当前菜单项类-但它仍不会在任何导航项上添加导航类这个网址以外的网址
然后,一旦创建,就进入该新项目的配置,并在“标题属性”字段中输入自定义帖子类型的标签(您也可以使用描述字段,但该字段隐藏在管理屏幕选项中默认)。
现在,您需要挂钩nav_menu_css_class
过滤器(每个导航项都会触发该过滤器),并检查所查看的内容是否属于您的自定义导航项中指示的帖子类型:
add_filter('nav_menu_css_class', 'current_type_nav_class', 10, 2 );
function current_type_nav_class($classes, $item) {
$post_type = get_query_var('post_type');
if ($item->attr_title != '' && $item->attr_title == $post_type) {
array_push($classes, 'current-menu-item');
};
return $classes;
}
在这种情况下,我们将检查“标题属性”字段的内容是否为空,以及它们是否与当前查询的post_type相匹配。如果是这样,我们将current-menu-item类添加到其类数组中,然后返回修改后的数组。
您可以修改它以简单地匹配导航项的标题,但是如果出于某种原因想要给导航项的标题与帖子类型的普通标题不同,则使用“标题属性”或“描述”字段可为您提供灵活性。
现在,每当您查看与导航菜单项匹配的帖子类型的单个项目(甚至可能是归档列表)时,该项目都将被赋予CSS类current-menu-item,因此突出显示将起作用。
无需页面或页面模板;-) URL查询负责获取正确的帖子。循环模板负责显示查询输出。该函数负责识别正在显示的内容并添加CSS类。
奖金
您甚至可以使用来自动执行此过程wp_update_nav_menu_item
,方法是为所有帖子类型自动生成菜单项。对于此示例,您首先需要检索$menu_id
要添加此项目的导航菜单的。
$types = get_post_types( array( 'exclude_from_search' => false, '_builtin' => false ), 'objects' );
foreach ($types as $type) {
wp_update_nav_menu_item( $menu_id, 0, array(
'menu-item-type' => 'custom',
'menu-item-title' => $type->labels->name,
'menu-item-url' => get_bloginfo('url') . '/?post_type=' . $type->rewrite['slug'],
'menu-item-attr-title' => $type->rewrite['slug'],
'menu-item-status' => 'publish'
)
);
}