これが私の解決策です。基本的に、次の要素が現在の行の中にあるかどうかを確認して行番号を設定しています。そのためには、次のインデックスが次の行の最初のインデックスと等しいかどうかを確認する必要があります。
トリッキーな部分は、行の最初のアイテムのインデックスを見つけることです。これは線形ではなく幾何学的な順序であるため、各行のアイテム数は増加します。次の行の最初の項目を計算するには、現在の行(この場合は単に現在の行)の要素数を現在の行の最初のインデックスに追加する必要があります。次の行の最初のインデックスを取得し、次の項目がその数と等しくなると、次の行に移動して、その計算されたインデックスの現在の行の最初のインデックスを設定する必要があります。
<?php //The first index of the first row is 1?>
<?php $row = 1;?>
<?php $curFirstIndex = 1;?>
<?php //start counting items ?>
<?php $count = 0;?>
<?php while (have_posts()) : the_post();?>
<?php //create actual html code ?>
<div class="style-<?php echo $row;?>"><?php the_content(); ?></div>
<?php //check if the next item is equal to the first index of the next row ?>
<?php if ($count+1 >= ($row + $curFirstIndex)) :
<?php
//the next item will be in the new row
//in $curFirstIndex store the first number of the current row
$curFirstIndex = $row + $curFirstIndex;
//go to the next row
$row++;
?>
<?php endif; ?>
<?php $count++;?>
<?php endwhile;?>
[編集]
上記のソリューションは機能しますが、1つの小さな欠陥があります。つまり、ロジックがテンプレートに組み込まれています。Wordpressは厳密なレイヤー分離には従いませんが、私の意見では、可能であればそれを試みることは常に良いことです。そこで、テンプレートファイルでこのロジックを減らし、ロジックを外部に移動する2つの方法を考え出しました。wordpressのテーマにはfunctions.phpがあるため、このファイルを使用して、そのロジックを処理する関数を作成できます。これがコードです
テンプレートビューファイル:
<?php //Initial values?>
<?php $row = 1;?>
<?php $count = 1;?>
<?php while (have_posts()) : the_post();?>
<?php //create actual html code ?>
<div class="style-<?php echo $row;?>"><?php the_content(); ?></div>
<?php //check if the current item is the last in the row ?>
<?php if ($count == getRowLastItemIndex($row)) {$row++;} ?>
<?php $count++;?>
<?php endwhile;?>
Functions.php内:
function getRowLastItemIndex($row) {
$index = 0;
for($i = 1; $i <= $row; $i++) {
$index += $i;
}
return $index;
}
または、次の方法でさらに分離します
テンプレートファイル
<?php //Initial values?>
<?php $row = 1;?>
<?php $count = 1;?>
<?php while (have_posts()) : the_post();?>
<?php //create actual html code ?>
<div class="style-<?php echo $row;?>"><?php the_content(); ?></div>
<?php $row = getRowNumber($row,$count);?>
<?php $count++;?>
<?php endwhile;?>
そして、functions.phpに別の関数を追加します
function getRowNumber($row,$count) {
if ($count == getRowLastItemIndex($row))
$row++;
}
return $row;
}