web-dev-qa-db-fra.com

Meilleure façon d’afficher des articles de catégories spécifiques dans une grille

J'utilise le code suivant pour afficher les publications d'une catégorie spécifique, dans une présentation de grille, sur ma page d'accueil. Cela fonctionne exactement comme je le veux, mais je continue de lire que je ne devrais jamais utiliser query_posts. Comment puis-je obtenir les mêmes résultats sans utiliser query_posts?

En outre, il me faudra éventuellement afficher des messages de peut-être dix catégories différentes sur la page d'accueil, en utilisant exactement la même présentation de grille. Cela poserait-il des problèmes si je dupliquais tout le code ci-dessous pour chaque catégorie ou existe-t-il un moyen plus efficace de le faire?

Tout conseil serait grandement apprécié - comme vous pourrez probablement résoudre mon problème et mon code, je suis assez nouveau dans le développement 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('m.d.y'); ?></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('m.d.y'); ?></p>
                </div>
            </div>
<?php
$counter = 0;
endif;
?>
<?php
$counter++;
endwhile;
//Pagination can go here if you want it.
endif;
?>
1
Paul Dixon

Je pense que la suggestion générale est d'utiliser WP_Query au lieu de query_posts en partie parce que query_posts a utilisé WP_query de manière simplifiée et peut causer des problèmes par la suite. Donc, à coup sûr consultez la page WP_Query, plus particulièrement l'exemple à boucles multiples : http://codex.wordpress.org/Class_Reference/WP_Query#Multiple_Loops

Ainsi, le code utilisant WP_Query ressemblerait à ceci:

<?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('m.d.y'); ?></p>
            </div>
        </div>
<?php
$counter++;
endwhile;
//Pagination can go here if you want it.
endif;
wp_reset_postdata(); // Reset post_data after each loop
?>

Notez que le même $args peut être utilisé dans le WP_Query. Notez également l'ajout de $query1-> dans la configuration de la boucle. Modifiez simplement $ query1 en $ query2 lorsque vous copiez, collez ce code et modifiez très probablement le nom de catégorie dans les arguments de la requête afin de les faire correspondre à votre catégorie.

J'ai aussi nettoyé du code répétitif car il semblait que la seule différence était le '-last' ajouté à la classe d'emballage. Ainsi, au lieu d'avoir du code supplémentaire à mettre à jour dans le futur, vous pouvez simplement l'utiliser.

J'ai également ajouté wp_reset_postdata(); à la fin pour être sûr et effacer/réinitialiser les données de poste.

Faites-moi savoir si vous avez des questions ou des préoccupations.

2
Sean Grant