首页 文章

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

提问于
浏览
0

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

来自codex

“同样, pre_get_posts will not work if used in template files (e.g., archive.php) ,因为它们在查询完成后被调用 . ”

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

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

任何指导都非常感谢 .

1 回答

  • 0

    archive.php ,_ category.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

相关问题