@smd66

Как разбить цикл Wordpress'а на 3 составляющие?

Привет.

Вероятно я плохо гуглил/искал, но к так и не нашел ответа на мой вопрос.
Суть такова: в угоду оптимизации, хочу сделать так, чтобы к БД было как можно меньше запросов, и вот, что на данный момент я сделал.

Длинный код
// Тут я начинаю "объединенный цикл"

<?php $news = new WP_Query( 'category_name=news&posts_per_page=4' );
if( $news->have_posts() ) : while( $news->have_posts() ) : $news->the_post(); ?>

<?php if( 0 == $news->current_post ) { ?>

	<div id="post-<?php the_ID(); ?>" <?php post_class( 'first-news' ); ?>>
		<div class="thumbnail">
			<?php has_post_thumbnail() ? the_post_thumbnail( 'medium' ) : ssec_output_default_image(); ?>
		</div>
		
		<div class="content">
			<p><a class="title" href="<?php the_permalink(); ?>"><?php the_title(); ?></a></p>
			<p class="text"><?php echo esc_html( get_the_excerpt() ); ?></p>
			<p><?php the_category(', '); ?> | <span class="text"><?php the_date(); ?></span></p>
		</div>
	</div>
	
<?php } else { ?>

<?php if( 1 == $news->current_post ) { echo '<div class="center-news">'; } ?>

	<div id="post-<?php the_ID(); ?>" <?php post_class(); ?>>
		<div class="thumbnail">
			<?php has_post_thumbnail() ? the_post_thumbnail( 'thumbnail' ) : ssec_output_default_image(); ?>
		</div>
		
		<div class="content">
			<a class="title" href="<?php the_permalink(); ?>"><?php the_title(); ?></a>
			<p><?php the_category(', '); ?> | <span class="text"><?php the_date(); ?></span></p>
		</div>
	</div>

<?php } endwhile; endif; if ( 1 < $news->post_count ) { echo '</div>'; } wp_reset_postdata(); ?>



// А тут, разочаровавшись, создаю новый цикл и пихаю в него условие offset 

<?php $news = new WP_Query( 'category_name=news&posts_per_page=1&offset=4' );
if( $news->have_posts() ) : while( $news->have_posts() ) : $news->the_post(); ?>
	
	<div id="post-<?php the_ID(); ?>" <?php post_class( 'last-news' ); ?>>
		<div class="thumbnail">
			<?php has_post_thumbnail() ? the_post_thumbnail( 'medium' ) : ssec_output_default_image(); ?>
		</div>
		
		<div class="content">
			<p><a class="title" href="<?php the_permalink(); ?>"><?php the_title(); ?></a></p>
			<p class="text"><?php echo esc_html( get_the_excerpt() ); ?></p>
			<p><?php the_category(', '); ?> | <span class="text"><?php the_date(); ?></span></p>
		</div>
	</div>
	
<?php endwhile; endif; wp_reset_postdata(); ?>



Внимание, вопрос.
Мне нужно либо как то, еще раз попытаться взаимодействовать с current_post и post_count, либо копать в сторону foreach( $posts as $post ) {}?

В итоге хочу получить 1 запрос WP_Query, 3 столбика с новостями (first-news, center-news, last-news).

Или есть куда проще варианты?
Или это вообще никак не повлияет на количество запросов к БД?
Подскажите пожалуйста.
  • Вопрос задан
  • 123 просмотра
Решения вопроса 1
@smd66 Автор вопроса
Нашел я способ, оказывается было все намного проще чем я думал, надо было лишь добавить elseif и третья колонка заработала.
И всё это делалось, чтобы не создавать три цикла WP_Query, т. е. мне нужно было сделать 3 колонки, и в каждую из них поместить записи.
В первой (first-news) и последней (last-news) использовать the_post_thumbnail( 'medium' ) и the_excerpt, а также вывести только по 1 посту, и в оставшейся (center-news) вывести the_post_thumbnail( 'thumbnail' ) без the_excerpt + в нем должно быть 3 поста.
Вот код, может кому пригодится:

Длинный код
// Создаю цикл
<?php $news = new WP_Query( 'category_name=news&posts_per_page=5' ); // Применяю условия (в данном случае это отобразить 5 постов в категории 'news')
if( $news->have_posts() ) : while( $news->have_posts() ) : $news->the_post(); ?>


// Первая колонка (тут первая запись)
<?php if( 0 == $news->current_post ) { ?>

	<div class="first-news">
		<?php the_post_thumbnail( 'medium' ); ?>
		<?php the_excerpt(); ?>
	</div>


// Вторая колонка (тут пятая запись)
<?php } elseif( 4 == $news->current_post ) { ?>

	<div class="last-news">
		<?php the_post_thumbnail( 'medium' ); ?>
		<?php the_excerpt(); ?>
	</div>

<?php } else { ?>


// Третья колонка (а тут соответственно с 2 по 4 записи)
	<?php if( 1 == $news->current_post ) { echo '<div class="center-news">'; } ?>

		<?php the_post_thumbnail( 'thumbnail' ); ?>
		
	<?php if ( 3 == $news->current_post ) { echo '</div>'; } ?>
	
<?php } endwhile; endif; wp_reset_postdata(); ?> // Завершаю цикл и очищаю

Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
А зачем Вы делаете второй запрос? Чтобы получить 5-ую запись?
Почему не сделать это все в одном запросе?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы