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

bes*_*rld 3 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(); 
Run Code Online (Sandbox Code Playgroud)

这是有效的,但我知道我也可以使用pre_get_posts().但是pre_get_posts()- 使用- 过滤器,你必须检查它是否影响管理员等.

所以我的问题是:我使用哪种替代方案或只是偏好/品味的问题真的很重要吗?

bir*_*ire 7

主要查询与次要查询:

我使用哪种替代方案或只是偏好/品味的问题真的很重要吗?

是的,有一个真正的区别:

1) pre_get_posts正在修改主查询(或所有查询),而不是使用WP_Query添加辅助查询.

2)如果您希望分页处理辅助查询,则通常必须对主查询进行修改.

通过使用pre_get_posts钩子,您可以修改作为实例的所有查询WP_Query(),包括主查询,主查询WP_Query()是每个页面请求的实例并且存在.

请记住,这get_posts() 是一个包装器,WP_Query()suppress_filters属性设置为时,过滤器处于活动状态FALSE.

使用时,pre_get_posts您通常希望使用某些条件标记来定位特定查询.以下是一些示例,您可以使用:

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 );
    }
  }
});
Run Code Online (Sandbox Code Playgroud)

这是未经测试但你得到的想法;-)

进一步阅读:

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

  • 好的,非常感谢您的良好回复和参考!:-)+1! (2认同)