在WordPress分类循环中包含自定义文章类型导致Walker Nav报错
解决WordPress中pre_get_posts修改分类查询导致菜单报错的问题
你遇到的问题很典型——pre_get_posts钩子的覆盖范围极广,它会作用于WordPress运行的所有查询实例,包括那些你看不到的后台查询(比如获取导航菜单的查询)。你的原始代码没有做足够的条件限制,导致菜单查询被错误地修改了post_type参数,进而让菜单渲染的walker找不到必需的属性,抛出一堆Undefined property的Notice。
问题根源
WordPress的导航菜单是通过独立的WP_Query实例获取的,你的代码没有排除这个查询,强制把它的post_type改成了['post','videos'],但菜单里的项目(比如自定义链接、页面、分类链接等)根本不属于这两种文章类型,返回的对象自然缺少db_id、ID、title这些菜单渲染必须的属性,所以触发了报错。
修复后的代码
把你的代码改成下面这样,添加几个关键的条件限制:
add_filter('pre_get_posts', 'query_post_type'); function query_post_type($query) { // 只在前台、主查询、且是分类/标签页时生效 if (!is_admin() && $query->is_main_query() && (is_category() || is_tag())) { $post_type = get_query_var('post_type'); if ($post_type) { $post_type = $post_type; } else { $post_type = array('post','videos'); } $query->set('post_type', $post_type); } return $query; }
关键修改点解释
!is_admin():确保代码只在前台运行,完全不干扰后台的任何查询(包括后台的菜单编辑、预览等操作)$query->is_main_query():明确只修改页面的主查询(也就是分类/标签页用来展示文章列表的那个核心查询),而不是菜单、侧边栏小工具、自定义查询等次要查询- 保留了原来的
is_category() || is_tag()条件,确保只在分类和标签页场景下修改文章类型范围
验证效果
修改后刷新你的网站:
- 分类和标签页会正常显示
post和videos类型的内容,完全符合你的预期 - 导航菜单的查询不会被修改,那些Undefined property的Notice会完全消失,菜单恢复正常工作
内容的提问来源于stack exchange,提问作者CharlyAnderson
相关产品推荐
相关产品推荐

