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

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:26:51