web-dev-qa-db-ja.com

ループ中にオフセットを増やす

私は、カスタム投稿をタブでグループ化して表示するカスタム投稿プラグインを書いています。各グループ4のポストのために。ループごとに増加するオフセット付きのクエリを作成することは可能ですか?したがって、結果は次のようになります。
- 最初のクエリは1から4までの投稿を表示します
- 2番目のクエリは5から8までの投稿を表示します
- 3番目のクエリは9から12などへの投稿を表示します。

        <div class="official-matters-tabs">
          <?php $args = array('post_type' => 'official-matters', 'showposts' => 4, 'orderby' => 'date', 'order' => 'ASC',); $the_query = new WP_Query( $args ); ?>
          <?php while ( $the_query->have_posts() ) : $the_query->the_post(); ?>
          <div class="info-tab col-xl-3">
            <div class="info-img">
              <?php the_post_thumbnail(); ?>
            </div><!-- .info_img -->
            <a data-toggle="collapse" href="#collapse-<?php the_ID(); ?>" class="info-title" role="button" aria-expanded="false" aria-controls="collapse-<?php the_ID(); ?>">
              <?php the_title(); ?>
            </a>
          </div><!-- .info-tab -->
        <?php endwhile;?>
        <?php wp_reset_postdata(); ?>
        </div><!-- .official-matters-tabs -->

        <div class="official-matters-content">
          <?php $args = array('post_type' => 'official-matters', 'showposts' => 4, 'orderby' => 'date', 'order' => 'ASC',); $the_query = new WP_Query( $args ); ?>
          <?php while ( $the_query->have_posts() ) : $the_query->the_post(); ?>
          <div class="info-tab-content collapse" id="collapse-<?php the_ID(); ?>">
            <div class="card card-body">
                <?php the_excerpt(); ?>
            </div><!-- .card -->
          </div><!-- .info-tab-content -->
        <?php endwhile;?>
        <?php wp_reset_postdata(); ?>
        </div><!-- .official-matters-content -->

      </div><!-- .official-matters-group -->
  </div><!-- #collapse-official-matters -->

更新

あなたが提案した変更を加えました。クエリに関する私の最大の問題は、私が得ている出力です。

<div class="official-matters-group">
 <div class="official-matters-tabs">
  <div class="info-tab col-xl-3">
    ...
  </div>
</div>
<div class="official-matters-content">
 <div class="info-tab-content collapse">
  ...
 </div>
 <div class="official-matters-tabs">
   <div class="info-tab col-xl-3">
   ...
   </div>
</div>
<div class="official-matters-content">
   <div class="info-tab-content collapse">
   ...
   </div>
   <div class="official-matters-tabs">
      <div class="info-tab col-xl-3">
      ...
      </div>
   </div>
</div>

そして私が必要とするものは:

<div class="official-matters-group">
 <div class="official-matters-tabs">
  <div class="info-tab col-xl-3">
   ...
  </div>
  <div class="info-tab col-xl-3">
   ...
  </div>
  <div class="info-tab col-xl-3">
   ...
  </div>
  <div class="info-tab col-xl-3">
   ...
  </div>
 </div>
 <div class="official-matters-content">
  <div class="info-tab-content collapse">
   ...
  </div>
  <div class="info-tab-content collapse">
   ...
  </div>
  <div class="info-tab-content collapse">
   ...
  </div>
  <div class="info-tab-content collapse">
   ...
  </div>
</div> 

私は4つの記事を役職グループにまとめ、すべての記事が表示されるまで何度もループする必要があります。そしてそれをどうやってやるのか私にはわかりません。

だから今私のクエリコードはこのようになります:

        <?php global $duplicated_posts;
          $args = [
              'post_type' => 'official-matters',
              'showposts' => 20,
              'orderby' => 'date',
              'order' => 'ASC',
              'post__not_in' => $duplicated_posts
          ];
          $query = new \WP_Query($args); ?>

          <div class="official-matters-group">
            <?php if( $query->have_posts() ) : ?>
              <?php while( $query->have_posts() ) : $query->the_post();
                    $duplicated_posts[] = get_the_ID();
              ?>
                <div class="official-matters-tabs">
                  <div class="info-tab col-xl-3">
                    <div class="info-img">
                      <?php the_post_thumbnail(); ?>
                    </div><!-- .news_img -->
                    <a data-toggle="collapse" href="#collapse-<?php the_ID(); ?>" class="info-title" role="button" aria-expanded="false" aria-controls="collapse-<?php the_ID(); ?>">
                      <?php the_title(); ?>
                    </a>
                  </div>
                </div><!-- .official-matters-tabs -->

                <div class="official-matters-content">
                  <div class="info-tab-content collapse" id="collapse-<?php the_ID(); ?>">
                    <div class="card card-body">
                        <?php the_content(); ?>
                    </div><!-- .card -->
                  </div><!-- .info-tab-content -->
                 </div><!-- .offical-matters-content -->
                <?php
                endwhile;
                wp_reset_postdata();
              endif;
            ?>
        </div><!-- .official-matters-group -->
    </div><!-- .collapse-official-matters -->

更新

これまでのところ、私はこの点に到達しました:

<div id="collapse-official-matters" class="col-xl-12">
   <div class="official-matters-group">

     <?php
      $args = array(
        'post_type' => 'sprawy-urzedowe',
        'showposts' => 20,
        'orderby' => 'date',
        'order' => 'ASC',
        'post__not_in' => $duplicated_posts
     );

     $the_query = new WP_Query($args);
     if ($the_query->have_posts()) :
       $counter = 0;
       while ($the_query->have_posts()) : $the_query->the_post();
           if ($counter % 4 == 0) :
               echo $counter > 0 ? '</div>' : '';
               echo '<div class="official-matters-tabs">';
           endif;
           ?>

           <div class="info-tab col-xl-3">
             <div class="info-img">
               <?php the_post_thumbnail(); ?>
             </div><!-- .news_img -->
             <a data-toggle="collapse" href="#collapse-<?php the_ID(); ?>" class="info-title" role="button" aria-expanded="false" aria-controls="collapse-<?php the_ID(); ?>">
               <?php the_title(); ?>
             </a><!-- .info-title -->
           </div><!-- .info-tab -->

     <?php
       $counter++;

       endwhile;
       endif;
       wp_reset_postdata();
     ?>
   </div>


   </div><!-- .official-matters-group -->
</div><!-- .collapse-official-matters -->

しかし私は私が必要とする出力を得るために下記のコードを追加する方法を知りません

<div class="official-matters-content">
  <div class="info-tab-content collapse" id="collapse-<?php the_ID(); ?>">
    <div class="card card-body">
        <?php the_content(); ?>
    </div><!-- .card -->
  </div><!-- .info-tab-content -->
</div>
1
Dariusz

久しぶりに解決策が見つかりました。多分それは将来の誰かを助けるでしょう。

  <div id="collapse-official-matters" class="col-xl-12">
       <div class="official-matters-group">

         <?php $args = array('post_type' => 'official-matters', 'showposts' => 20, 'orderby' => 'date', 'order' => 'ASC',); $the_query = new WP_Query( $args ); ?>
         <?php $i = 0; $row = 0;
          while ( $the_query->have_posts()) {

            $the_query->the_post();
            if ($i === 4) {
              $i = 0;
              $row++;
            }

            $postsData[$row]['tabs'][$i] = [
              'id' => get_the_id(),
              'thumbnail' => get_the_post_thumbnail_url(),
              'title' => get_the_title()
            ];

            $postsData[$row]['content'][$i] = [
              'id' => get_the_id(),
              'excerpt' => get_the_excerpt()
            ];

            $i++;
          }
         ?>

         <div id="accordion">
         <?php foreach($postsData as $key => $value) :
           $tabs = $value['tabs'];
           $contents = $value['content'];
           ?>
             <div class="customRow">
               <?php foreach($tabs as $key => $value) : ?>
                 <div class="info-tab col-xl-3">
                   <div class="info-img">
                     <img src="<?php echo $value['thumbnail'] ?>" />
                   </div><!-- .news_img -->
                   <a data-toggle="collapse" data-target="#collapse-<?php echo $value['id'] ?>" href="#collapse-<?php echo $value['id'] ?>" class="info-title collapsed" role="button" aria-expanded="false" aria-controls="collapse-<?php echo $value['id'] ?>">
                     <?php echo $value['title'] ?>
                   </a><!-- .info-title -->
                 </div><!-- .info-tab -->
               <?php endforeach; ?>

               <?php foreach($contents as $key => $value) : ?>
                 <div class="official-matters-content">
                   <div class="info-tab-content collapse" id="collapse-<?php echo $value['id']; ?>" data-parent="#accordion">
                     <div class="card card-body">
                       <?php echo $value['excerpt'] ?>
                     </div><!-- .card -->
                   </div><!-- .info-tab-content -->
                 </div><!-- .official-matters-content -->
               <?php endforeach; ?>
             </div>
           <?php endforeach ;?>
       </div>
         <?php wp_reset_postdata(); ?>

         <?php if (false) : ?>
         <?php while ( $the_query->have_posts() ) : $the_query->the_post(); ?>
               <div class="info-tab col-xl-3">
                 <div class="info-img">
                   <?php the_post_thumbnail(); ?>
                 </div><!-- .news_img -->
                 <a data-toggle="collapse" href="#collapse-<?php the_ID(); ?>" class="info-title" role="button" aria-expanded="false" aria-controls="collapse-<?php the_ID(); ?>">
                   <?php the_title(); ?>
                 </a><!-- .info-title -->
               </div><!-- .info-tab -->

               <div class="official-matters-content">
                 <div class="info-tab-content collapse" id="collapse-<?php the_ID(); ?>">
                   <div class="card card-body">
                       <?php the_excerpt(); ?>
                   </div><!-- .card -->
                 </div><!-- .info-tab-content -->
               </div><!-- .official-matters-content -->


         <?php
           endwhile;
           wp_reset_postdata();
         ?>
       <?php endif; ?>

       </div><!-- .official-matters-group -->
    </div><!-- .collapse-official-matters -->
0
Dariusz

うん。

あなたが探しているものはスマートな「カウンター」です。

実際には、あなたの問題はこれです:

重複する投稿を避けようとしています。

これを行うための一般的な方法は次のとおりです。

クエリを実行するすべてのファイルに、このコードを追加する必要があります。

global $duplicated_posts;

$args = [
    'post_type' => 'post',
    'post__not_in' => $duplicated_posts
];

$query = new \WP_Query($args);

post__not_inに注目してください。さて、このファイルはインクルードするときに一度だけ実行されます(ページビルダーで仮定しますが、関係ありません)。

「いいけど、配列はまだ空」.

実際に投稿があるかどうかを確認するときは、次のように、見つけた各投稿のIDをそのグローバル配列に追加する必要があります。

if( $query->have_posts() ) : ?>
    <div class="official-matters-group">
        <div class="official-matters-tabs">
        ..etc
        <?php
        while( $query->have_posts() ) :
            $query->the_post();
            $duplicated_posts[] = get_the_ID(); //golden ticket
            ..code for each post goes here.

それで、今、あなたの次のコンテンツボックスがこの$duplicated_postsを見るとき、それはこれらの投稿を含まないことを知るでしょう。

覚えておいて、あなたはあなたが繰り返しアイテムを持ちたくないすべてのファイルにこのパターンをコピーしなければならない!

乾杯。

0
coolpasta