get_posts()
只是一个包装WP_Query
, 然而,它有两个主要区别:
get_posts()
只返回一个post数组,因此不提供a Loop.get_posts()
设置ignore_sticky_posts
和no_found_rows
参数到true
. no_found_rows
分页需要,禁用它可以提高性能
#1表示您需要使用稍微不同的方法来允许使用模板标记,如
the_title()
. 这也意味着
loop_start
和
loop_end
不会开火。
#2意味着get_posts()
将更快,并且您不需要担心粘性帖子,您几乎肯定不希望将其作为辅助循环的一部分。
但是,您可以实现get_posts()
具有WP_Query
只需设置no_found_rows
设置为true,则可以通过设置ignore_sticky_posts
到true
.
因此,这些基本上是完全相同的:
// WP_Query
$query_dog = new WP_Query( [
\'post_type\' => \'animals\',
\'posts_per_page\' => 3,
\'ignore_sticky_posts\' => true,
\'no_found_rows\' => true,
\'tax_query\' => [
[
\'taxonomy\' => \'species\',
\'field\' => \'slug\',
\'terms\' => \'chien\',
],
],
] );
while ( $query_dog->have_posts() ) : $query_dog->the_post();
get_template_part( \'template-parts/publication-animaux\' );
endwhile();
wp_reset_postdata();
// get_posts
$posts_dog = get_posts( [
\'post_type\' => \'animals\',
\'posts_per_page\' => 3,
\'tax_query\' => [
[
\'taxonomy\' => \'species\',
\'field\' => \'slug\',
\'terms\' => \'chien\',
],
],
] );
global $post;
foreach ( $posts_dog as $post ) : setup_postdata( $post ); // *Must* be $post.
get_template_part( \'template-parts/publication-animaux\' );
endforeach;
wp_reset_postdata();
理论上,这两个循环的结果完全相同,性能几乎相同。按照我写的风格,它们甚至有完全相同的行数。所以使用哪一个基本上完全取决于你喜欢哪一个。
最大的区别可能是WP_Query
方法触发loop_start
和loop_end
钩子,一些插件可能会使用,您可能想使用(loop_start
首次使用时触发the_post()
, 和loop_end
上次使用时的触发器have_posts()
. WordPress不会单独处理它们。
我自己更喜欢WP_Query
, 只是因为我发现$post
变量和setup_postdata()
有点“黑客”。我发现get_posts()
当您需要查询帖子而不是在循环中输出帖子时,更合适。WP_Query
另一方面,模拟主循环的行为,并且