在PRE_GET_POSTS中设置的$Query->无意中影响了后端

时间:2016-04-30 作者:Joel M

因此,我有一个自定义的帖子类型“properties”。

我正在使用archive-properties.php, 需要在$query.

我不想使用new WP_Query 因为我遇到了一些问题,其中分页插件试图对$query 如果这有任何意义的话,那是我们在存档页面上时就已经存在的。

所以现在我的问题是,如果我posts_per_page2 例如,登录到后端,它只显示2个帖子。

所以我需要这个来更改前端的查询,而不是后端的查询。我不知道在if声明中包括什么。

function set_query_parameters($query) {

    if( is_main_query() && is_post_type_archive( \'properties\' ) && !$_SESSION  ) {           
        $query->set(\'posts_per_page\', 12);
        $query->set(\'orderby\', array(
            \'date\' => \'DESC\',
        ));
    }
    return $query;
}

add_action( \'pre_get_posts\', \'set_query_parameters\' );

1 个回复
最合适的回答,由SO网友:Tim Malone 整理而成

关于您不使用WP\\U查询的决定,pre_get_posts 实际上是一个很好的选择,而不是创建一个新的WP\\u查询实例。事实上pre_get_posts 正是要更改主查询时应该使用的内容。它不是在每个页面加载上执行单独的查询,而是在执行之前修改主查询的参数。效率更高!

你就快到了。You just need to add !is_admin() to your if statement. 您还应特别致电is_main_query() on the $query object passed to your function.

通过这两项更改if 声明现在改为:

if( !is_admin() && $query->is_main_query() && is_post_type_archive( \'properties\' ) && !$_SESSION  ) {
还值得注意的是,您不需要向Wordpress操作返回值,这与过滤器相反。具有pre_get_posts, 论点是passed by reference 所以您对$query 变量将自动生效。

相关推荐

如何将Archives.php中的循环修改为每个页面有11个帖子和CSS样式

我在档案中编辑了我的循环。php,以便使用分页和类别帖子列表小部件。我基本上是根据随机代码和想法拼凑起来的,现在离默认的post查询还很远,我很难回到原点。我需要回到原点的原因是我需要两件事:1) 当我的帖子有两个分类标签时,我的代码把我的分类帖子搞乱了。当这种情况发生时,他们被放在错误的类别中(或者根本没有被放在)。2) 通过这种自定义编码,我也丢失了对“标记”的查询,因此标记页面无法正常工作。我需要回到原点,这样我可以设置标签和分类帖子,以便正确显示,但在正确的范围内<li>这是我的风格。