我的主要查询修改是修改我的动态Main-为什么?

时间:2019-04-25 作者:csaborio

这很难跟踪,我只启用了我需要的插件(ACF和我自己处理内容类型创建的插件)。

我注意到在一些页面上,我的菜单不见了,这是从标题加载的菜单。php,所以它是相同的代码。

我确实通过挂接到pre_get_posts. 例如,当一个帖子类型是某个类型时,我会修改主查询,如下所示:

else if ( is_post_type_archive( \'people\' ) ) {
    $query->set( \'orderby\', \'meta_value\' );
    // Bug: Line below causes the menu not to show.
    $query->set( \'meta_key\', \'display_order\' );
    $query->set( \'order\', \'ASC\' );
}
正如注释所示,这一行导致整个菜单消失:

    // Bug: Line below causes the menu not to show.
    $query->set( \'meta_key\', \'display_order\' );
然后我去了我的wp_nav_menu 调用并使用调试器对其进行钻取。结果是post.php 在这两条线路中(截至2019年4月25日,线路编号约为1960):

$get_posts = new WP_Query;
return $get_posts->query( $r );
当我启用导致错误的行时,$get_posts->query( $r ); 不返回任何内容,当我禁用它时,它会返回菜单。

我比较了$get\\U帖子在创建时的内容和$r在有bug和没有bug时的内容,内容完全相同,这让我很困惑。

这必须是一个全局变量,它是我的代码的脏b/c,它会打乱查询,因此我可能在某个地方缺少wp\\u reset\\u query(),但我无法确定在哪里。

任何指点都将不胜感激。

以下是我提到的变量输出,仅供参考:

Working Output

Bug Output

1 个回复
最合适的回答,由SO网友:Krzysiek Dróżdż 整理而成

原因很简单。。。

在您的代码中(至少在您显示的部分中),您检查的唯一条件是:

if ( is_post_type_archive( \'people\' ) )
因此,当您在“人员存档”中时,该页面上的每个WP\\U查询都会出现这种情况。

假设您在页脚中有一些“最新新闻”部分,它们是通过WP\\u查询检索到的。pre_get_post 过滤器也将为此类WP\\U查询运行,并且上述条件仍然为真。

菜单是另一个示例,因为它也是使用WP\\u Query检索的。。。

这就是为什么检查$query->is_main_query() 此外,如果您只想修改主查询。

因此,您的代码应该如下所示:

else if ( $query->is_main_query() && is_post_type_archive( \'people\' ) ) {
    $query->set( \'orderby\', \'meta_value\' );
// Bug: Line below causes the menu not to show.
    $query->set( \'meta_key\', \'display_order\' );
    $query->set( \'order\', \'ASC\' );
}
当然,也有可能同样适用于if语句的其他部分,因此if的结构可能会改变。。。

相关推荐

Making sub-menus exclusive

我真的不知道该怎么解释我在这里找的东西,我在这里找得太露骨了。在我的网站上,我有一个附带菜单,其中包含一系列子类别,每个子类别中都有一些项目。我想知道当我打开另一个子类别时,是否有办法关闭所有其他打开的子类别,例如:1. Animals ----A. Cats ----B. Dogs 2. People ----A. Samantha ----B. Daniel 当我按下“动物”时,我希望“人”关闭,反之亦