web-dev-qa-db-fra.com

La pagination ne fonctionne pas avec le modèle de catégorie personnalisé

Pour approfondir ma connaissance de wordpress, j'ai développé un thème à partir de zéro et utilisé des plugins ACF et CPT UI afin de créer une interface de backoffice simple et intuitive.

Mon problème est sur le front-end bien que. J'ai créé la pagination pour la page d'accueil (à l'aide d'une requête personnalisée) et cela fonctionne parfaitement. Ce n'est pas le cas lorsqu'il s'agit de pages de catégorie (dans un modèle nommé category.php).

Cela fait des heures que je surfe sur Google pour trouver une solution, mais tout semble lié aux permaliens, quand je n'ai aucun problème avec les permaliens (j'utilise la structure par défaut /% postname% /).

Voici le code de ma page de catégorie, y compris la boucle personnalisée et la pagination:

<?php
$paged = ( get_query_var('page') ) ? get_query_var('page') : 1;
$my_videos = new WP_Query(array(
   'post_type' => 'video', 
   'category_name' => single_cat_title('', false), 
   'posts_per_page' => 6
)); 
 if ( $my_videos->have_posts() ) :  
  while ($my_videos->have_posts()) : $my_videos->the_post();
   show_video_thumbnails();
  endwhile; 
else:  ?>
<p><?php _e( 'Sorry, no posts matched your criteria.' ); ?></p>
<?php endif; ?>

<!-- pagination here -->
<?php   next_posts_link( 'Older Entries', $my_videos->max_num_pages );
        previous_posts_link( 'Newer Entries' );
        wp_reset_postdata(); 
?>

Tout fonctionne parfaitement sur la première page de la catégorie: la pagination est disponible et affiche "Entrées plus anciennes".

Mais lorsque je clique sur le lien, je suis redirigé vers/category/mycategoryname/page/2 (mycategoryname étant le nom de ma catégorie), mais une erreur 404 s'affiche.

Toute aide serait grandement appréciée. Je sens que je manque quelque chose ici.

3
Tayax

Comme il s’agit de la boucle principale de votre modèle, vous ne devriez pas créer de nouvelle boucle, mais modifier la boucle existante avec pre_get_posts. De cette façon, vous pouvez être sûr que tous les paramètres de requête supplémentaires seront pris en compte.

Un exemple de comment vous feriez cela:

add_action( 'pre_get_posts', 'wpse5477_pre_get_posts' );
function wpse5477_pre_get_posts( $query )
{
    if ( ! $query->is_main_query() || $query->is_admin() )
        return false; 

    if ( $query->is_category() ) {
        $query->set( 'post_type', 'video' );
        $query->set( 'posts_per_page', 6 );
    }
    return $query;
}

Ce code ira dans votre functions.php.

Nous vérifions d'abord s'il s'agit de la boucle principale et non de votre zone d'administration. pre_get_posts peut affecter l'administrateur.

Ensuite, s'il s'agit d'une catégorie, nous modifions le $query.

Et retournez le $query.

Pour plus d'informations, cliquez ici: https://codex.wordpress.org/Plugin_API/Action_Reference/pre_get_posts

5
ngearing