我有一个存档模板文件,显示自定义帖子类型人员的所有帖子(称为archive-personnel.php):
这是文件的开头......
<?php
get_header();
//Show all posts for this custom posttype (personnel)
$args = array( 'post_type' => 'personnel', 'posts_per_page' => -1 );
$personnel_query = new WP_Query( $args );
if (have_posts()) : while ($personnel_query->have_posts()) : $personnel_query->the_post();
这很有效,但我知道我也可以使用pre_get_posts()
。但是使用pre_get_posts()
- 过滤器,您必须检查它是否会影响管理员等。
所以我的问题是:我使用哪种替代品真的很重要,或者仅仅是偏好/品味?
答案 0 :(得分:7)
我使用哪种替代方案或仅仅是一个问题真的很重要 喜好/味道?
是的,有一个真正的区别:
1) pre_get_posts正在修改main query(或所有查询),而不是使用WP_Query添加辅助查询。
2)如果您希望分页处理辅助查询,则通常需要对main query进行修改。
通过使用pre_get_posts
挂钩,您可以修改WP_Query()
实例的所有查询,包括主查询,它是WP_Query()
的实例,每个页面请求都有。
请注意,get_posts()
是WP_Query()
的包装,当suppress_filters
属性设置为FALSE
时,过滤器处于有效状态。
使用pre_get_posts
时,您通常希望使用某些conditional tags来定位特定查询。以下是一些示例,您可以使用:
a) is_main_query()
确定当前查询是否为主查询。
b) ! is_admin()
,以防止修改后端的查询。
c) is_post_type_archive()
定位帖子类型档案。
当您添加自定义WP_Query()
时,除了主查询之外,您还要添加额外的查询。
如果可以,我通常会使用pre_get_posts
操作,而不是添加辅助查询。
如果要修改主查询,对于自定义帖子类型personnel
的存档,您可以尝试:
add_action( 'pre_get_posts', function( $query ){
if ( ! is_admin() && $query->is_main_query() ) {
if ( is_post_type_archive( 'personnel' ) ) {
$query->set('posts_per_page', -1 );
}
}
});
这是未经测试的,但你明白了这一点; - )
希望以下链接可以为您提供有关差异的更多信息: