有一个更简单的解决方案。忘记为每种帖子类型创建页面,这样您就可以拥有导航项目,因为正如您所了解的,WP无法识别您正在浏览的自定义类型与该页面相关。
相反,请在外观->菜单中创建自定义链接。只需输入将返回自定义类型的URL并给它一个标签,然后按“添加到菜单”。
http://example.com/workshops/
或不漂亮的永久链接:
http://example.com/?post_type=workshops
仅此一项就可以创建一个nav按钮,该按钮将显示具有该自定义帖子类型的所有帖子,并在您单击该nav项目时添加当前菜单项类,但它还不会在除此之外的任何URL上添加nav类
然后,创建后,进入新项目的配置,并在“标题属性”字段中输入自定义帖子类型的slug(您也可以使用描述字段,但默认情况下,该字段隐藏在管理屏幕选项中)。
现在,你需要钩住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;
}
在本例中,我们将检查Title属性字段内容是否为空,以及它们是否与正在查询的当前post_类型匹配。如果是这样,我们将当前菜单项类添加到其类数组中,然后返回修改后的数组。
您可以将其修改为仅与导航项目的标题匹配,但如果出于某种原因,您希望以不同于post类型的普通slug的方式对导航项目进行标题,则使用title属性或Description字段可以提供这种灵活性。
现在,每当您查看与nav菜单项匹配的post类型的单个项目(甚至可能是存档列表)时,该项目都将被赋予CSS类当前菜单项,以便突出显示。
无需页面或页面模板;-)URL查询负责获取正确的帖子。循环模板负责显示查询输出。此函数负责识别所显示的内容并添加CSS类。
BONUS
您甚至可以使用
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\'
)
);
}