删除主查询并替换它

时间:2014-04-01 作者:Don

有很多good resources 关于如何更改主查询或添加辅助循环。。。

但我实际上想用一个不同的查询完全替换主查询。

我劫持了我的一个页面,本质上是作为一个分类页面。(请注意,为了做到这一点,我正在从“页面”改为“发布”。)但当我通过这样做来更改主查询时:

function front_page_announcements( $query ) {
    if ( $query->query_vars[\'page_id\'] == 84 && $query->is_main_query() && !$query->is_admin ) {
        $query->set("category_name", "special-announcement");
        $query->set("page_id", NULL);
    }
}
add_action( \'pre_get_posts\', \'front_page_announcements\' );
我最终得到了数据库中的每一页(不是帖子)。我真正想要的是每个类别id为的帖子(不是页面)3, 或special-announcement 就我而言。

我不想对数据库进行不必要的调用,因此pre_get_posts 动作钩是我想要的,但我想不出来。即使只是设置$query = new WP_Query(\'cat=3\') 似乎不起作用。

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

什么时候\'pre_get_posts\' WordPress已经做了很多事情,比如设置所有查询变量(以及您不发送的查询)和设置所有条件属性(所有is_* 属性)。因此,如果您想完全替换查询,您应该重置所有这些内容并设置自己的查询。

事实上,即使你的代码有效,WordPress也会使用page.php 作为模板。

然而,有一种更简单的方法:在WordPress做所有事情之前先行动。

一个好地方是\'request\' 过滤器挂钩,此时WordPress已经从url创建了查询变量,并将这些变量传递给WP_Query, 您可以在发送之前拦截和更改查询参数。

该操作由WP 类,并传递要设置的查询变量(see code).

add_filter( \'request\', function( array $query_vars ) {

  // triggered also in admin pages
  if ( is_admin() )
    return $query_vars;

  // you should check also for page slug, because when pretty permalink are active
  // WordPress use \'pagename\' query vars, not \'page_id\'
  $id = isset($query_vars[\'page_id\']) && (int) $query_vars[\'page_id\'] === 84;
  // remember to replace "slug" with real page slug
  $name = isset($query_vars[\'pagename\']) && $query_vars[\'pagename\'] === \'slug\';

  if ( ( $id || $name)  && ! isset($query_vars[\'error\']) ) {
    $query_vars = array(\'category_name\' => \'special-announcement\');
  }

  return $query_vars;

});
更换\'slug\' 用你真正的页面,然后让WordPress做它的工作。

注意,我没有检查主查询,因为\'request\' 仅对主查询触发。

如果要使用特定模板,应在上使用筛选器template_include 否则\'category.php\' (或根据template hierarchy) 将使用。

结束

相关推荐