WordPress ループ内で決められた数毎にタグを囲む

September 19, 2013

グリッドを使って記事を横並びに並べたい場合に、単純にループさせちゃうと margin をいじったり、いろいろと CSS を調整しないといけなくなるので面倒くさい。

なので、例えば3つ毎に横に並べたい場合はこんな風にすると楽。

<pre class="lang:php decode:true"><?php if (have_posts()) : ?>
<?php $post_count = 1; // カウンター初期化
echo '<ul class="row">' . "\n"; // 最初の開始 ul タグを出力
?>
<?php while (have_posts()) : the_post(); ?>
<?php if ( $post_count % 3 == 1 && $post_count != 1 ) { echo '</ul>' . "\n" . '<ul class="row">' . "\n"; } // 3で割った余りが1及び最初の ul でなければ閉じ ul と次の開始 ul タグを出力
?>
    <li class="col">
        <?php the_content();?>
    </li>
<?php $post_count++; // カウンターを+1 ?>
<?php endwhile; ?>
<?php echo '</ul>' . "\n"; // 最後に ul を閉じる ?>
<?php else : ?>
<?php endif; ?>

こんな風に出力されます。

<pre class="lang:default decode:true"><ul class="row">
    <li class="col">Post 1</li>
    <li class="col">Post 2</li>
    <li class="col">Post 3</li>
</ul>
<ul class="row">
    <li class="col">Post 4</li>
    <li class="col">Post 5</li>
    <li class="col">Post 6</li>
</ul>
<ul class="row">
    <li class="col">Post 7</li>
    <li class="col">Post 8</li>
    <li class="col">Post 9</li>
</ul>

JS でも出来るけど、こんな感じでやっといたほうがスマートですね。

ちなみに、ul 1つで CSS で解決するには、こんな感じでネガティブマージン使うやり方が一番定番かな。もしくは display: inline-block; とか nth-child を使う方法もありますね。

See the Pen sCweJ by johnykei (@johnykei) on CodePen.

参考記事:


Profile picture

Johnny Okafuji
フロントエンドエンジニア / ビートルズバンド Crescendo Four のジョン・レノン担当。/ Love Darts🎯 / アナザーヒストリーエッセンシャルクラス修了&引き続きコーチング勉強中 / コーチング関係の記事は note に書いてます。
Twitter: @johnykei
note: https://note.com/johnykei

© 2023 All rights reserved.