页面中多个循环的最佳选择?

时间:2019-02-18 作者:kwiz

我的主页包括五个循环。

目前我使用wp\\U查询,但它是否经过优化?get\\u帖子的最佳选择?我的代码是这样的

    // First loop
    $args_dogs = array(
    \'post_type\' => array(\'animals\'),
    \'posts_per_page\' => \'3\',
    \'tax_query\' => array(
                     array(
                          \'taxonomy\' => \'species\',
                          \'field\' => \'slug\',
                          \'terms\' => \'chien\',
                        ),
                  ),
    \'orderby\' => \'date\',
);
$query_dog = new WP_Query( $args_dogs );
if ( $query_dog->have_posts() ) : ?>
    <?php while ( $query_dog->have_posts() ) : $query_dog->the_post(); ?>
      <?php get_template_part( \'template-parts/publication-animaux\' ); ?>
    <?php endwhile; ?>
<?php endif; ?>
<?php wp_reset_postdata(); ?>



// second loop
        $args_cat = array(
        \'post_type\' => array(\'animaux\'),
        \'posts_per_page\' => \'3\',
        \'tax_query\' => array(
                         array(
                              \'taxonomy\' => \'species\',
                              \'field\' => \'slug\',
                              \'terms\' => \'chat\',
                            ),
                      ),
        \'orderby\' => \'date\',
    );
    $query_cat = new WP_Query( $args_cat );
    if ( $query_cat->have_posts() ) : ?>
        <?php while ( $query_cat->have_posts() ) : $query_cat->the_post(); ?>
          <?php get_template_part( \'template-parts/publication-animaux\' ); ?>
        <?php endwhile; ?>
    <?php endif; ?>
    <?php wp_reset_postdata(); ?>

    // the third loop use args for display the last sticky post
      $args_sticky = array(
      \'posts_per_page\' => 1,
      \'post__in\'  => get_option( \'sticky_posts\' ),
      \'ignore_sticky_posts\' => 1
    );
    $query_sticky = new WP_Query( $args_sticky );

  // the four loop use args for display last posts and ignore sticky post

   $args_home = array(
    \'posts_per_page\' => 4,
    \'post__not_in\' => get_option(\'sticky_posts\')
   );
   $query_home = new WP_Query( $args_home );

  // the five loop use args for display elements of cpt slider 
  $slider_args = array(
   \'post_type\' => array(\'slider\'),
   \'posts_per_page\' => -1,
   \'order\' => \'DESC\',//
  );
  $slider = new WP_Query($slider_args);
get\\u帖子支持我的参数。。那么,为了优化性能,使用get\\u posts是否更好?具体为什么?我很难理解真正的区别

1 个回复
最合适的回答,由SO网友:Jacob Peattie 整理而成

get_posts() 只是一个包装WP_Query, 然而,它有两个主要区别:

  1. get_posts() 只返回一个post数组,因此不提供a Loop.
  2. get_posts() 设置ignore_sticky_postsno_found_rows 参数到true. no_found_rows 分页需要,禁用它可以提高性能
#1表示您需要使用稍微不同的方法来允许使用模板标记,如the_title(). 这也意味着loop_startloop_end 不会开火。

#2意味着get_posts() 将更快,并且您不需要担心粘性帖子,您几乎肯定不希望将其作为辅助循环的一部分。

但是,您可以实现get_posts() 具有WP_Query 只需设置no_found_rows 设置为true,则可以通过设置ignore_sticky_poststrue.

因此,这些基本上是完全相同的:

// 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_startloop_end 钩子,一些插件可能会使用,您可能想使用(loop_start 首次使用时触发the_post(), 和loop_end 上次使用时的触发器have_posts(). WordPress不会单独处理它们。

我自己更喜欢WP_Query, 只是因为我发现$post 变量和setup_postdata() 有点“黑客”。我发现get_posts() 当您需要查询帖子而不是在循环中输出帖子时,更合适。WP_Query 另一方面,模拟主循环的行为,并且

相关推荐

echo a tax term in loop

对于列表中的每个项目,我需要在之后在此循环中回显CPT的一个术语。感谢您的指导或帮助。原始代码来自Stackoverflow。com,因为它起作用了。 <?php $da_place = get_field(\'smart_place\'); //acf field $args = array( \'post_type\' => \'to_do_items\', \'tax_query\' => array