如何改变后循环结果布局和恢复?

时间:2020-03-28 作者:Robert Andrews

当我以特定的标记输出一个帖子循环时,我如何在特定的间隔中断,为下一篇帖子使用不同的标记,然后在标准布局中的适当点恢复循环?

明确地

将左侧的布局改为右侧的布局,其中,明信片的流动被中断和改变,以引入视觉变化。。。

enter image description here

注意,常规整个卡片网格(左侧示例)的现有post循环输出如下。。。

if ( $posts->have_posts() ) { ?>

    <!-- Posts row -->
    <div class="row pb-4 px-2 posts-row">
      <?php

        // Post Loop
        while ( $posts->have_posts() ) {

          $posts->the_post();

                // Regular card
                 echo \'<div class="d-flex align-items-stretch col-6 col-sm-6 col-md-3 col-lg-3 col-xl-3 p-2 post-item overlay-bg">\';
                 set_query_var(\'bgcolor\',    \'bg-white\');
                 set_query_var(\'use_logo\',   true);
                 set_query_var(\'use_byline\', true);
                 set_query_var(\'use_source\', false);
                 get_template_part(\'pieces/cards/post\', multi);
                 echo \'</div>\';

        } // end while

        wp_reset_query();
      ?>
    </div><!-- end .row -->
  <?php
   } else { ?>
    Nothing here.
  <?php } ?>
但问题不在于简单地更改同一网格(即challenge I already surmounted). 相反,我想打破网格,重新使用备用,在您看到的紫色折叠功能块上方。

该块是使用my函数渲染的display_showcase_features(), 以a为参数WP_Query Object 包含五个帖子,然后使用替代容器网格和替代帖子卡类型输出相关标记。

我需要完成的是。。。

在$posts中的post 13中,打破div,发送一个包含接下来五篇post的WP\\U查询对象到display_showcase_features(), 它以交替布局输出由五个帖子组成的块,并定期从标准布局的第18个帖子恢复行的开头div

if ( $posts->have_posts() ) { ?>

  <!-- Posts row -->
  <div class="row pb-4 px-2 posts-row">
    <?php

    $i=0;

      // Post Loop
      while ( $posts->have_posts() ) {

        $posts->the_post();
        $i++;

        /**
        * =======================================================
        *            VARY POST CARDS TO BREAK UP LIST
        * =======================================================
        */
        if ($i == 13 or $i == 26) { ?>
              </div><!-- end content column -->
              </div><!-- end whole row -->
              <?php display_showcase_posts($showcase_features); ?>
              <?php
              echo \'<div class="container-fluid bg-light py-4">\';
              echo \'<div class="row pb-4 px-2 posts-row">\';
               ?>
        <?php
        } else {
          /**
          * =======================================================
          *            STANDARD POST CARD LAYOUT
          * =======================================================
          */
              // Regular card
               echo \'<div class="d-flex align-items-stretch col-6 col-sm-6 col-md-3 col-lg-3 col-xl-3 p-2 post-item overlay-bg">\';
               set_query_var(\'bgcolor\',    \'bg-white\');
               set_query_var(\'use_logo\',   true);
               set_query_var(\'use_byline\', true);
               set_query_var(\'use_source\', false);
               get_template_part(\'pieces/cards/post\', multi);
               echo \'</div>\';

        }

      } // end while

      wp_reset_query();
    ?>
  </div><!-- end .row -->
<?php
 } else { ?>
  Nothing here.
<?php } ?>
加价中断效果很好,这是我需要了解的WordPress内容。。。

1. How do I get a WP_Query object containing the next five posts?

在上述尝试中,我将发送到display_showcase_features() 仅仅$showcase_features, 其中包含与上述折叠块中使用的相同的五根立柱。但这真的只是一个测试。

相反,我认为我需要的是下面标准布局循环中接下来的五篇文章。我是否需要在此处对某种范围进行新查询?这对数据库来说会很昂贵吗?

2. How do I then elegantly resume the standard-layout loop output at the right place?

也就是说,在上面右侧的视觉示例中,使用上面的代码尝试,实际上不会渲染post 13,因为我将在该点显示showcase块。循环应该在中断后恢复五个帖子,假设display_showcase_features() 确实输出了五个帖子。

3. How do I do this at regular intervals?

可以预测预期布局破坏的模式。即12个标准布局的帖子,然后发送5个到display_showcase_features(), 然后是另外12个。

尽管我担心分页可能会毁掉一切,例如,如果分页可能会让我的div打开的话。

1 个回复
SO网友:Himad

如何获取包含接下来五篇文章的WP\\u查询对象

// $query is the original WP_Query object.

$five_posts = new WP_Query();
$five_posts->posts = array_slice(
                            $query->posts, 
                            $query->current_position, 
                            $query->current_position + 5
                        );

然后如何在正确的位置优雅地恢复标准布局循环输出:
/* Sum the count of all the posts you displayed with your showcase function. 

In this case they were 5, so by setting the current position to 18, the next loop iteration will 
display the post 19. */


$query->current_post += 5;
如何定期执行此操作:
$simple_posts_layout = 12;
$showcase_posts_layout = 5;

foreach(array_chunk($query->posts, $single_posts_layout + $showcase_posts_layout) as $chunk){
   foreach($chunk as $key => $post){
       if($key == $simple_posts_layout - 1){
           display_showcase_posts($five_posts);
           $query->current_position += $showcase_posts_layout;
           break;
       }
      $posts->the_post();
      // ... the rest of your template.
   }
}
我还没有测试代码,所以可能会有错误,但类似的东西应该可以工作。

相关推荐

WP ForLoop用于比较帖子的元数据信息以确定要显示的帖子

我在这里尝试的缺点是:我只想根据存储在自定义字段中的日期显示一篇文章。我只想显示符合两个条件的帖子1:日期必须尚未发生,即必须大于当前日期2:要显示的帖子日期必须是所有可能帖子中最接近当前日期的。这是下一个日期。我的问题是,当我要比较一篇文章和另一篇文章,然后使用WordPress循环只显示适当的文章时,我不知道从哪里开始。我想我需要使用for循环遍历每个帖子并进行比较,然后运行一个新的查询来显示我的一篇帖子。太长,读不下去了我可以使用forloop来检查WP\\u查询吗?如何访问其中的帖子信息?这是我的