You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

自定义文章类型为contest时添加导航菜单项:仅登录可见问题排查

问题与解决方案

问题

在自定义文章类型contest的页面中,尝试通过wp_nav_menu_items钩子添加导航菜单项,但仅在用户登录时显示,未登录状态下不生效。

用户原代码:

add_filter('wp_nav_menu_items', 'add_menu_items', 10, 2);
function add_menu_items($items){
if ('contest' == get_post_type()){
        $items .= '<li><a href="#tire-promotion">Tire Promotion</a></li>';  
    }
    return $items;
}

原因

get_post_type()函数依赖全局$post对象,但wp_nav_menu_items钩子执行时,全局查询上下文可能还未完全初始化,尤其是未登录访问前端页面时,无法正确获取当前文章类型,导致判断条件不成立。

解决方案

方案一:通过查询对象判断

使用get_queried_object()获取当前页面的查询对象,确保在任何状态下都能正确识别文章类型:

add_filter('wp_nav_menu_items', 'add_menu_items', 10, 2);
function add_menu_items($items){
    $queried_obj = get_queried_object();
    if (isset($queried_obj->post_type) && 'contest' === $queried_obj->post_type) {
        $items .= '<li><a href="#tire-promotion">Tire Promotion</a></li>';  
    }
    return $items;
}

方案二:使用WordPress条件标签

利用专门的条件标签判断当前页面是否属于contest类型,兼容性更好:

add_filter('wp_nav_menu_items', 'add_menu_items', 10, 2);
function add_menu_items($items){
    if (is_singular('contest') || is_post_type_archive('contest')) {
        $items .= '<li><a href="#tire-promotion">Tire Promotion</a></li>';  
    }
    return $items;
}

说明

  • get_queried_object()会返回当前页面的主查询对象,无论单篇文章还是存档页,都能准确获取文章类型,不受登录状态影响。
  • is_singular('contest')用于判断是否为contest的单篇文章页面,is_post_type_archive('contest')用于判断是否为contest的存档列表页,这两个条件标签在前端未登录状态下可正常工作。

内容的提问来源于stack exchange,提问作者BFM Group

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 10:20:43