Мне нужен 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 – у вас будут проблемы.