web-dev-qa-db-fra.com

Pagination sur la page de catégorie avec types de publication personnalisés

Wordpress n'est pas nouveau pour moi mais je suis vraiment bloqué sur ce code qui ne me permet pas de fonctionner correctement.

J'enregistre un type de message personnalisé Actualités et laisse ce type de message personnalisé utiliser les catégories Wordpress

'taxonomies' => array('category')

Jusqu'ici tout va bien. Je peux attribuer différentes catégories au type de message personnalisé Nouvelles. Mais je veux que les gens puissent voir les nouvelles d'une catégorie spécifique. Donc, je veux que cela se fasse avec la page category.php. Le problème est que la pagination ne fonctionne pas. Je reçois une page introuvable lorsque je vais à/page/2

J'utilise ce code sur une page category.php.

// Get post ID
$post_type = get_post_type( $post->ID );

// Get category ID
$category_id = get_cat_ID(single_cat_title('', false));

// Wordpress pagination
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;

// WP_Query arguments
$args_news = array (
    'post_type'             => array( 'news' ),
    'pagination'            => true,
    'posts_per_page'        => '9',
    'orderby'               => 'date',
    'paged'                 => $paged,
    'cat'                   => $category_id,
);

// The Query
$query = new WP_Query( $args_news );

// The Loop
if ( $query->have_posts() ) {
    while ( $query->have_posts() ) {
        $query->the_post(); ?>
        <div>
            <h1><?php the_title(); ?></h1>
            <p><?php the_content(); ?></p>
        </div>
<?php }

} else { 
    // no news found
}
?>

<div class="pagination">
    <div class="previous-page"><?php previous_posts_link( 'Newer Posts' );?></div>
    <div class="next-page"><?php next_posts_link( 'Older Posts', $query->max_num_pages ); ?></div>
</div>

<?php
// Reset postdata
wp_reset_postdata();
1
3lb3rt

Avant d’aborder votre problème, je voudrais commencer par vous demander pourquoi vous utilisez une requête personnalisée sur une page de catégorie au lieu de la requête principale. Vous ne devez jamais modifier la requête principale d'une requête personnalisée sur une page d'archive ou sur votre page d'accueil.

Wordpress fournit un crochet d'action, pre_get_posts que vous pouvez utiliser conjointement avec balises conditionnelles pour cibler et modifier la requête principale avant qu'elle ne soit exécutée sur des pages spécifiques. Pour les pages de catégorie, la vérification conditionnelle is_category() est fournie.

Vous pouvez simplement faire ce qui suit dans votre functions.php, tout en gardant votre boucle par défaut intacte sur votre page de catégorie. Juste un conseil, pre_get_posts utilise les mêmes paramètres que WP_Query

function add_news_to_category( $query ) {
    if ( !is_admin && $query->is_category() && $query->is_main_query() ) {

         $query->set( 'post_type', array( 'news' ) );
         $query->set( 'posts_per_page', '9' );
         $query->set( 'orderby', 'date' );

    }
}
add_action( 'pre_get_posts', 'add_news_to_category' );

OK, maintenant à votre problème réel avec votre code.

  • Premièrement, vous n'avez pas besoin d'utiliser wp_reset_query et wp_reset_postdata ensemble. wp_reset_query est effectivement utilisé avec query_posts , que vous ne devez jamais utiliser, et je veux dire jamais. Il suffit simplement d'utiliser wp_reset_postdata afterWP_Queryandget_posts` et de ne jamais oublier de le faire.

  • Deuxièmement, regardez de plus près votre code. Vous avez $query = new WP_Query( $args_news );, mais vous avez alors <?php next_posts_link( 'Older Posts', $custom_query->max_num_pages ); ?>. Repérer la différence? $query et $custom_query. Donc, <?php next_posts_link( 'Older Posts', $custom_query->max_num_pages ); ?> devrait être <?php next_posts_link( 'Older Posts', $query->max_num_pages ); ?>

Pour en savoir plus:

1
Pieter Goosen