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

Я использую следующий код для отображения сообщений из определенной категории в макете сетки на моей домашней странице. Он работает именно так, как я хочу, но я продолжаю читать, что я никогда не должен использовать query_post. Как я могу достичь тех же результатов, не используя query_posts?

Кроме того, мне в конечном итоге нужно будет отображать сообщения из десяти разных категорий на домашней странице – используя этот точный макет сетки. Возникли бы проблемы, если бы я дублировал весь код ниже для каждой категории, или есть более эффективный способ сделать это?

Любые советы были бы очень признательны, поскольку вы, вероятно, сможете поработать с моим кодом и вопросами, я довольно новичок в разработке WordPress 🙂

<?php $counter = 1; //start counter $grids = 3; //Grids per row global $query_string; //Need this to make pagination work /*Setting up our custom query (In here we are setting it to show 3 posts per page and eliminate all sticky posts) */ query_posts( array('posts_per_page'=>3, 'category_name'=>'Mobile') ); if(have_posts()) : while(have_posts()) : the_post(); ?> <?php //Show the left hand side column if($counter == 1 || $counter == 2) : ?> <div class="col-cat3"> <div class="entry-featured"><?php x_featured_image(); ?></div> <div class="col-cat-pic"><?php echo get_avatar( get_the_author_meta('ID'), 40); ?></div> <div class="hero-info"> <h3><a href="<?php the_permalink(); ?>" title="<?php the_title_attribute(); ?>"><?php the_title(); ?></a></h3> <p class="p-meta"><?php the_author_posts_link(); ?> / <?php the_time('mdy'); ?></p> </div> </div> <?php //Show the right hand side column elseif($counter == $grids) : ?> <div class="col-cat3-last"> <div class="entry-featured"><?php x_featured_image(); ?></div> <div class="col-cat-pic"><?php echo get_avatar( get_the_author_meta('ID'), 40); ?></div> <div class="hero-info"> <h3><a href="<?php the_permalink(); ?>" title="<?php the_title_attribute(); ?>"><?php the_title(); ?></a></h3> <p class="p-meta"><?php the_author_posts_link(); ?> / <?php the_time('mdy'); ?></p> </div> </div> <?php $counter = 0; endif; ?> <?php $counter++; endwhile; //Pagination can go here if you want it. endif; ?> 

Я думаю, общее предложение состоит в том, чтобы использовать WP_Query вместо query_posts отчасти потому, что query_posts использовали WP_query в упрощенном виде и могут вызвать проблемы в будущем. Поэтому обязательно просмотрите страницу WP_Query, в частности пример нескольких циклов : http://codex.wordpress.org/Class_Reference/WP_Query#Multiple_Loops

Таким образом, код с использованием WP_Query будет выглядеть примерно так:

 <?php $counter = 1; //start counter $grids = 3; //Grids per row global $query_string; //Need this to make pagination work /*Setting up our custom query (In here we are setting it to show 3 posts per page and eliminate all sticky posts) */ $query1 = new WP_Query( array('posts_per_page'=>3, 'category_name'=>'Mobile') ); if( $query1->have_posts()) : while( $query1->have_posts()) : $query1->the_post(); if( $counter == $grids ) : $counter = 0; // Reset counter ?> <div class="col-cat3-last"> <?php else: ?> <div class="col-cat3"> <?php endif; ?> <div class="entry-featured"><?php x_featured_image(); ?></div> <div class="col-cat-pic"><?php echo get_avatar( get_the_author_meta('ID'), 40); ?></div> <div class="hero-info"> <h3><a href="<?php the_permalink(); ?>" title="<?php the_title_attribute(); ?>"><?php the_title(); ?></a></h3> <p class="p-meta"><?php the_author_posts_link(); ?> / <?php the_time('mdy'); ?></p> </div> </div> <?php $counter++; endwhile; //Pagination can go here if you want it. endif; wp_reset_postdata(); // Reset post_data after each loop ?> 

Обратите внимание, что те же $args могут использоваться в WP_Query. Также обратите внимание на добавление $query1-> в настройке цикла. Просто измените $ query1 на $ query2, когда вы скопируете этот код и, скорее всего, измените имя категории в аргументах запроса в соответствии с вашей категорией.

Я также очистил некоторый повторяющийся код, поскольку это выглядело так, как будто разница была только в том, что «-last» добавлен в класс div для упаковки. Поэтому вместо того, чтобы в будущем обновлять дополнительный код, вы можете просто использовать его.

Я также добавил wp_reset_postdata(); в конце концов, чтобы быть безопасным и ясным / сбросить данные сообщения.

Сообщите мне, есть ли у вас какие-либо вопросы или проблемы.