如何在WordPress中为非菜单子页面的内容给对应菜单项添加active激活类
方案1(使用Events自定义文章类型原生存档页,最推荐)
直接通过WordPress原生nav_menu_css_class过滤器动态给对应菜单项添加高亮类,不依赖任何固定ID、别名,抗修改性极强。
将以下代码添加到你当前主题的functions.php文件,或者自定义功能插件中即可:
add_filter( 'nav_menu_css_class', 'highlight_events_cpt_menu', 10, 2 ); function highlight_events_cpt_menu( $classes, $item ) { // 替换为你注册Events自定义文章类型时使用的别名 $cpt_slug = 'event'; if ( is_singular( $cpt_slug ) ) { // 匹配指向CPT存档页的菜单项 if ( $item->url === get_post_type_archive_link( $cpt_slug ) ) { // 添加WordPress原生高亮类,和默认高亮样式完全兼容 $classes[] = 'current-page-ancestor'; $classes[] = 'current-menu-item'; } } return $classes; }
使用该方案无需额外配置,后续哪怕客户修改了活动列表页的slug、标题、菜单排序,都不会影响高亮效果。
方案2(使用自定义独立页面作为活动列表页)
如果你没有用CPT自带的存档功能,而是手动创建了一个独立页面来展示活动预告列表,可以用自定义字段标记该列表页,再通过过滤器匹配:
- 编辑你创建的events列表页,添加一个自定义字段:键为
is_events_list_page,值为1 - 将以下代码添加到主题
functions.php或自定义功能插件中:
add_filter( 'nav_menu_css_class', 'highlight_events_cpt_menu', 10, 2 ); function highlight_events_cpt_menu( $classes, $item ) { // 替换为你注册Events自定义文章类型时使用的别名 $cpt_slug = 'event'; if ( is_singular( $cpt_slug ) ) { // 查询标记为活动列表页的页面 $events_list_page = get_posts( [ 'post_type' => 'page', 'meta_key' => 'is_events_list_page', 'meta_value' => '1', 'numberposts' => 1, 'post_status' => 'publish' ] ); if ( !empty( $events_list_page ) && $item->object_id == $events_list_page[0]->ID ) { $classes[] = 'current-page-ancestor'; $classes[] = 'current-menu-item'; } } return $classes; }
该方案同样不受页面标题、slug、菜单排序修改的影响,后续如果客户要换活动列表页,只需要给新页面加上同样的自定义字段即可。
内容的提问来源于stack exchange,提问作者Steve Gibbons
相关产品推荐
相关产品推荐

