web-dev-qa-db-fra.com

Pourquoi ma boucle n'attrape-t-elle pas dynamiquement la bonne catégorie et n'affiche pas tous les messages classés

Objectif: Quand une catégorie est cliquée, j'aimerais que la page category.php affiche de manière dynamique tous les articles classés dans cette catégorie.

Exemple: Nouvelles -> (Action: Cliquez) -> Catégorie = Nouvelles

Actuellement, ma boucle tire dans 3 messages de la catégorie: Non classé quelle que soit la catégorie sur laquelle vous cliquez. J'ai vérifié ma boucle et mes arguments et il semble que tout devrait fonctionner comme prévu. J'apprécierais des yeux neufs sur ceci.

CATEGORY.PHP

<?php get_header(); ?>
<section class="component" role="main">
<header class="header">
<h1 class="entry-title"><?php single_cat_title(); ?></h1>
<?php if ( '' != category_description() ) echo apply_filters( 'archive_meta', '<div class="archive-meta">' . category_description() . '</div>' ); ?>
</header>
<section class="component responsive">
<?php
$paged = ( get_query_var( 'paged' ) ) ? get_query_var( 'paged' ) : 1;

// Grabs the selected category
foreach((get_the_category()) as $category)
{
    $postcat= $category->cat_ID;
}

$args = array(
           'posts_per_page' => 7,
           'paged' => $paged,
           'cat' => $postcat // Passes the selected category to the arguments
        );

$custom_query = new WP_Query( $args );
$post_number = 0;


if ( $custom_query->have_posts() ) : while($custom_query->have_posts()) : $custom_query->the_post(); ?>
        <?php the_title(); ?>
    <?php endwhile; else : ?>
<?php endif; ?>
    <div class="clear"></div>
    <?php if (function_exists("pagination")) {
        pagination($custom_query->max_num_pages);
    } ?>
    </section>
</section>
1
Peter

Votre modèle entier est cassé parce que plutôt que de modifier la requête principale, vous l'avez jeté et mis une nouvelle requête dans:

$args = array(
           'posts_per_page' => 7,
           'paged' => $paged,
           'cat' => $postcat // Passes the selected category to the arguments
        );

$custom_query = new WP_Query( $args );

WP a beaucoup travaillé pour déterminer quelle page, combien de messages, quel type de messages, etc., que vous devez dupliquer dans la nouvelle requête. Encore une fois, il s'agit d'une toute nouvelle requête qui ne fait que ce que vous lui dites de faire. C'est aussi très mauvais pour la performance/vitesse et conduit à des pages plus lentes.

Au lieu de cela, si nous utilisons le filtre pre_get_posts pour limiter l’archive à 7 publications comme vous le vouliez au départ, tout le code de pagination peut être supprimé, de même que la requête personnalisée:

Commençons par ajuster la requête pour n’afficher que 7 publications dans functions.php si la requête principale concerne une archive de catégorie:

function limit_category( $query ) {
    if ( $query->is_category() && $query->is_archive() && $query->is_main_query() ) {
        $query->set( 'posts_per_page', '7' );
    }
}
add_action( 'pre_get_posts', 'limit_category' );

Nous pouvons maintenant utiliser les fonctions de pagination standard et une boucle de publications standard normale dans category.php, par exemple.

if ( have_posts() ) { // if we have posts
    while( have_posts() ) { // while we still have posts
        the_post(); // set the current post
        the_title(); // display its title
        the_content(); // display its content
    }
    // display the pagination links
    ?>
    <div class="nav-previous alignleft"><?php previous_posts_link( 'Older posts' ); ?> </div>
    <div class="nav-next alignright"><?php next_posts_link( 'Newer posts' ); ?></div>
    <?php
} else {
    echo "<p>No posts found</p>";
}
1
Tom J Nowell