Мне нужен div, чтобы обернуть каждые четыре столбца в цепочке wordpress. Так было бы
<div> four posts </div> <div> four posts </div>
мой текущий код – это
<?php $i = 0; $wrap_div = "<div class='frak'>"; if ( have_posts() ) { echo $wrap_div; while ( have_posts() ) { the_post(); ?> <div class="wine-section"> <?php the_post_thumbnail(); ?> <div class="wine-info"> <a href="<?php the_permalink(); ?>"><?php the_title( '<h1>', '</h1>' ); ?></a> <?php the_meta(); ?> </div><!-- /wine-info --> <div class="c"></div> </div><!-- /wine-section --> <?php if ($i % 4 == 0) { echo "</div>" . $wrap_div; } } // end while } // end if $i++; ?>
Этот код обертывает каждую запись отдельно. Есть идеи?
Вы увеличиваете $i
вне цикла while, поэтому внутри него $i
всегда будет ==0
и, следовательно, $i % 4 == 0
.
Переместить $i++;
before } // end while
.
Однако вы также должны изменить свое условие на $i % 4 == 3
, потому что $i % 4 == 0
оценивает true
в самой первой итерации ( $i=0
) и будет генерировать начальный <div>
только с одним после.
Кроме того, вы можете сохранить свое состояние как есть, и:
либо начинать с $i=1
вместо 0
или переместить $i++
сразу после.
Теперь, когда у вас есть несколько кратных 4 сообщений, в конце появится дополнительный, пустой <div>
. Это потому, что вы предполагаете, что когда закрывается <div>
, другой должен автоматически открываться. Это не всегда так.
Предполагая, что вы выбрали решение $i % 4 == 3
выше, и что у вас уже есть echo '</div>';
после цикла while измените условие на if(($i % 4 == 3)&& have_posts())
.
Как указывали геомаги, вы увеличиваете переменную за пределами цикла. Тогда 0 % 4 == 0
оценивает true – это потому, что когда вы делите 0 на 4, вы получаете 0. Чтобы обойти эту ситуацию, вам нужно еще одно правило.
Также не забывайте, что с вашим текущим кодом, если общее количество сообщений составляет, например, 12, у вас будет один пустой div «frak» в конце ваших сообщений.
<?php $i = 0; $wrap_div = "<div class='frak'>"; if ( have_posts() ) { // Grab the total posts that are being displayed $total_posts = $wp_query->post_count; echo $wrap_div; while ( have_posts() ) { the_post(); ?> <div class="wine-section"> <?php the_post_thumbnail(); ?> <div class="wine-info"> <a href="<?php the_permalink(); ?>"><?php the_title( '<h1>', '</h1>' ); ?></a> <?php the_meta(); ?> </div><!-- /wine-info --> <div class="c"></div> </div><!-- /wine-section --> <?php // Is this a fourth post? If so, make sure it is not the last post? if ( $i % 4 == 0 && $i != 0 && ( $i + 1 ) != $total_posts ) { echo '</div>' . $wrap_div; } $i ++; } // end while // Close the $wrap_div echo '</div>'; } // end if ?>
Как вы можете видеть, оператор if
который печатает закрывающий тег, и новый обертывание теперь более сложный. Он гарантирует, что $ i не равен 0 (это значит, что это все еще первый пост), и что $ i + 1 не совпадает с общим количеством отображаемых сообщений (в этом случае мы закрываем цикл while()
).
Если вам интересно, почему мы закрываемся после цикла while()
– просто потому, что ваши сообщения могут быть не всегда точными на 4 (я не уверен в правильном переводе на английский здесь) – и если это так, и вы не закрывайте свой div после цикла while – у вас будут проблемы.