新的Wp_Query()或pre_get_posts()来查看自定义帖子类型的所有帖子?

时间:2014-01-23 09:10:01

标签: wordpress custom-post-type

我有一个存档模板文件,显示自定义帖子类型人员的所有帖子(称为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() - 过滤器,您必须检查它是否会影响管理员等。

所以我的问题是:我使用哪种替代品真的很重要,或者仅仅是偏好/品味?

1 个答案:

答案 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 );
    }
  }
});

这是未经测试的,但你明白了这一点; - )

进一步阅读:

希望以下链接可以为您提供有关差异的更多信息: