自定义文章类型为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
相关产品推荐
相关产品推荐

