2016-09-12 24 views
0

我是WordPress新手,最近一直在学习很多关于pre_get_posts的知识。我理解这个基本概念,但是在文档的一部分中被绊倒了。你可以在主查询之外使用pre_get_posts吗?

codex

“同样,如果在模板文件(例如,archive.php)使用pre_get_posts将无法正常工作,因为查询完成后,他们被称为”

如果你不能在模板文件中使用它,这是否意味着它只对index.php有用?如果是这样的话,为什么pre_get_posts被用来改变存档显示方式的页面还有一个例子呢?

我明白pre_get_posts的功能(特别是query_posts),但我很难在一个站点上多次使用它。我看到的所有内容都显示它仅用于主循环。

任何指导,非常感谢。

回答

0

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

您可以显示不带模板文件的存档,如archive.php,category.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

+0

非常感谢您的回复,我非常感谢。我唯一的后续问题是:如果pre_get_posts是为主查询而设的, – Travis

+0

非常感谢您的回复,我非常感谢。在我看来,我在WP上开发的大部分内容都会有一个主要查询,然后几乎所有其他页面请求都会传递到模板文件,我可以像使用WP_Query()那样使用实例。有没有一种场景可以在同一个网站上多次使用pre_get_posts?再次感谢您的帮助,我试着加快响应速度,但我还没有足够的声誉来注册。 – Travis

+0

这真的让我想到了,我想我需要咖啡......如果你想影响每一种页面请求的主要查询,你必须在你的'functions.php'文件中加入带有回调函数的'add_action',这实际上适用于例如'archive.php','category.php'和所有的子模板文件,如'category-category-a.php'。你可以在'functions.php'中创建不同的回调函数,就像'is_category()',然后'add_action('pre_get_posts','my_category_callback_function')',但不止一次调用它是多余的,因为它只影响一个查询,主要查询。 – Joachim

相关问题