1/3 сообщений разных классов

Есть ли способ подсчитать количество сообщений в CPT и добавить другой класс к 1/3 указанных сообщений?

Я использую масонство для сетки и хочу, чтобы два разных размера изображения отображались случайным образом. Я получил все, что работает, но изображения не выравниваются идеально, поэтому сетка смотрит (с промежутками между ними). Я подумал, что если 1/3 сообщений меньше по размеру, он будет лучше выравниваться.

Так что я хочу:

  • Сетка с двумя разными размерами изображений, которые изменяются при обновлении (поэтому макет отличается при каждом обновлении и переключении больших и малых изображений)
  • Цикл отображает элементы случайным образом

Это мой текущий код:

<?php /** * Template Name: Teampagina * * @link https://codex.wordpress.org/Template_Hierarchy * * @package Deliciae Design custom * @since 1.0.0 */ get_header(); ?> <div id="primary" <?php astra_primary_class(); ?>> <?php astra_primary_content_top(); ?> <main id="main" class="site-main team-page" role="main"> <header class="entry-header <?php astra_entry_header_class(); ?>"> <h1 class="entry-title text-center" itemprop="headline"><?php echo post_type_archive_title(); ?></h1> <form class="quicksearch"> <div class="input-group"> <input type="text" id="qs-input" placeholder="Zoek op naam"> <i class="fa fa-search"></i> </div> </form><!-- quicksearch --> </header><!-- .entry-header --> <?php $args = array( 'orderby' => 'rand', 'post_type' => 'focus_team' ); $query = new WP_Query( $args ); $count = 0; if ( $query->have_posts() ) : ?> <ul id="team-masonry"> <li class="grid-sizer"></li> <?php while ( $query->have_posts() ) : $query->the_post(); ?> <li class="grid-item size-<?php echo rand(1,2); ?>"> <a href="<?php echo get_post_permalink(); ?>"> <div class="fo--info"> <?php the_post_thumbnail('team_member'); ?> <div class="fo--overlay"> <div class="table"> <div class="item"> <?php the_title( '<h3 class="entry-title" itemprop="headline">', '</h3>' ); ?> <p>functie</p> </div> </div> </div> </div> </a> </li> <?php endwhile; wp_reset_postdata(); ?><!-- reset loop --> </ul> <?php endif;?> </main><!-- #main --> <?php astra_primary_content_bottom(); ?> </div><!-- #primary --> <?php get_footer(); ?> <script> (function($){ var qsRegex; var $container = $('#team-masonry'); $container.isotope({ itemSelector: '.grid-item' }); var $grid = $('#team-masonry').isotope({ resizable: true, // set itemSelector so .grid-sizer is not used in layout itemSelector: '.grid-item', columnWidth: 300, masonry: { columnWidth: '.grid-sizer' }, filter: function() { return qsRegex ? $(this).text().match( qsRegex ) : true; } }); // layout Isotope after each image loads $grid.imagesLoaded().progress( function() { $grid.isotope('layout'); }); // use value of search field to filter var $quicksearch = $('input#qs-input').keyup( debounce( function() { qsRegex = new RegExp( $quicksearch.val(), 'gi' ); $grid.isotope(); }, 200 ) ); // debounce so filtering doesn't happen every millisecond function debounce( fn, threshold ) { var timeout; return function debounced() { if ( timeout ) { clearTimeout( timeout ); } function delayed() { fn(); timeout = null; } timeout = setTimeout( delayed, threshold || 100 ); } } })( jQuery ); </script> 

Solutions Collecting From Web of "1/3 сообщений разных классов"

Объяснение в комментариях:

 <?php ... if ( $query->have_posts() ) : //number of small ones needed = a third of total number of posts $numsmallneeded = round($query->post_count / 3); ... while ( $query->have_posts() ) : $query->the_post(); //if no more small sizes are needed, use big if ( !$numsmallneeded ) $size = 1; //if number of small sizes needed = number of remaining posts, use small else if ( $numsmallneeded == $query->post_count - $query->current_post) $size = 0; //else pick at random else $size = rand(0, 1); //if small was picked, reduce number of small ones needed by 1 if ( !$size ) $numsmallneeded--; ?> <li class="grid-item size-<?php echo ++$size; /*add 1 before printing*/ ?>"> ... <?php endwhile; wp_reset_postdata(); ?><!-- reset loop --> </ul> <?php endif;?> 

Класс WP_Query предлагает как то, что вы ищете:

Используя $query->post_count вы можете получить общее количество сообщений в вашем запросе.

Используя $query->current_post вы получаете индекс текущего сообщения в цикле.

Итак, чтобы проверить, находится ли текущая должность в первой трети ваших общих сообщений, вы можете использовать:

 <?php if ( $query->current_post < floor( $query->post_count / 3 ) ) { echo 'some-class'; } ?>