你能在主查询之外使用pre_get_posts吗?

时间:2016-09-12 18:36:08

标签: wordpress loops hook

我是WordPress的新手,最近一直在学习很多关于pre_get_posts的知识。我理解了基本概念,但我在文档的一部分上被绊倒了。

来自codex

“同样,如果在模板文件中使用 pre_get_posts(例如,archive.php),则不会有效,因为它们是在查询完成后调用的。” < / p>

如果你不能在模板文件中使用它,这是否意味着它只对index.php有用?如果是这种情况,为什么在页面下方会有一个示例,其中pre_get_posts用于更改存档的显示方式?

我理解pre_get_posts的功能(特别是在query_posts上),但我很难找到如何在一个站点上多次使用它。我看到的一切都显示它被使用过一次,仅用于主循环。

非常感谢任何指导。

1 个答案:

答案 0 :(得分:0)

archive.phpcategory.php等文件是WordPress调用模板文件的文件。正如documentation所说,页面模板通常具有高度的特异性。这可以解释为什么在调用模板文件之前已经初始化了查询,因此pre_get_posts会错过模板文件上的点。

您可以显示没有archive.phpcategory.php之类的模板文件的存档,但pre_get_posts确实 - 只是要在主查询上调用。这意味着,如果您将add_action('pre_get_posts', 'my_callback_function')添加到functions.php文件中,它将在站点范围内更改查询。您可以过滤回调内的特定页面类型,如下所示:

function my_callback_function($query){

   // Only if page type is category
   if(is_category()){
       $query->set('posts_per_page', 7);
   }

   // Always except for search page types
   if(!is_search()){
       $query->set('posts_per_page', 4);
   }
}

这样就无需再拨打pre_get_posts两次。

如果要执行多个查询或指定archive.php查询,请使用WP_Query()的实例。

More details