web-dev-qa-db-fra.com

La pagination provoque l'erreur 404 lorsqu'il est utilisé avec front-page.php

Je crée front-page.php. Cette page affichera les derniers articles publiés et aura également une option de pagination pour accéder aux articles précédents.

J'ai écrit le code pour Frontpage comme suit

$args = array();
$args['post_type'] = 'post';
$args['post_status'] = 'publish';
$args['category_name'] = 'featured';
$args['posts_per_page'] = 4
$args['paged'] = (get_query_var('page')) ? get_query_var('page') : 1;

$the_query = new WP_Query($args);

if ($the_query->have_posts()) {

    while ($the_query->have_posts()) {

        $the_query->the_post() ;
        the_title();

    } // End of: while ($the_query->have_posts())

    next_posts_link('Next', $the_query->max_num_pages );
    previous_posts_link('Previous');

} // End of: if ($the_query->have_posts())

Ainsi, lorsque je vais à la page d'accueil du site (par exemple, à la page mysite.dev, la page s'affiche correctement.

Maintenant, lorsque je clique sur le lien Next, l'url devient mysite.dev/page/2; cependant, la page 404 est renvoyée à la place de la deuxième page de front-page.php

J'ai passé environ 5 ou 6 heures. Lire un article presque unique sur cette question et toujours à perdre.

1
Greeso

MODIFIER

front-page.php n'est utilisé dans vos commentaires que lorsqu'une page est définie comme une page de garde statique. Les pages d'accueil normales, c'est-à-dire lorsqueLa page d'accueil afficheest défini surVos dernières publications, index.php est utilisé.

Toutes les pages d'archive et la page de couverture utilisent paged et non pas page; vous devez donc définir get_query_var( 'page' ) sur get_query_var( 'paged' ).

De toute façon, vous ne devriez pas utiliser une requête personnalisée sur votre page d'accueil, vous devriez utiliser pre_get_posts pour modifier la requête principale en fonction de vos besoins.

add_action( 'pre_get_posts', function ( $q )
{
    if (    $q->is_home()
         && $q->is_main_query()
    ) {
        $q->set( 'category_name',  'featured' );
        $q->set( 'posts_per_page', 4          );
    }
});

Vos liens de pagination devraient alors être

next_posts_link( 'Next' );
previous_posts_link( 'Previous' );

Votre boucle dans index.php devrait ressembler à ceci

if ( have_posts() ) {
    while ( have_posts() ) {
        the_post();

           // Your markup and template tags

    }
}

Si vous devez vraiment utiliser front-page.php comme page d'accueil normale et non comme page de garde statique, procédez comme suit:

  • Changer votre boucle à ce que j'ai suggéré ci-dessus avec les liens de pagination

  • Utilisez pre_get_posts comme suggéré ci-dessus pour modifier la requête principale en fonction de vos besoins.

  • Utilisez le filtre home_template pour utiliser front-page.php en tant que modèle de page d'accueil.

Vous pouvez essayer ce qui suit

add_filter( 'home_template', function ( $template )
{
    $locate_template = locate_template( 'front-page.php' );

    if ( !$locate_template )
        return $template;

    return $locate_template;
});

RÉPONSE ORIGINALE

Les fonctions next_posts_link() et previous_posts_link() ne fonctionnent pas sur les pages de garde statiques standard. Le problème est que la pagination utilise get_query_var( 'paged' ) qui est enregistrée dans le $paged global. Étant donné que les pages de garde statiques utilisent get_query_var( 'page' ) et non pas get_query_var( 'paged' ), vos liens ne pagineront jamais au-delà de la page 1.

Nous pouvons tromper next_posts_link() et previous_posts_link() pour penser qu'ils sont utilisés sur une page d'archive en définissant le $paged global sur get_query_var( 'page' ).

Vous pouvez essayer ce qui suit

$paged                   = get_query_var( 'page', 1 ); 
$args                    = [];
$args['post_type']       = 'post';
$args['post_status']     = 'publish';
$args['category_name']   = 'featured';
$args['posts_per_page']  = 4;
$args['paged']           = $paged;

$the_query = new WP_Query($args);

if ($the_query->have_posts()) {

    while ($the_query->have_posts()) {

        $the_query->the_post() ;
        the_title();

    } // End of: while ($the_query->have_posts())

    next_posts_link('Next', $the_query->max_num_pages );
    previous_posts_link('Previous');

    wp_reset_postdata(); // VERY VERY IMPORTANT

} // End of: if ($the_query->have_posts())

MODIFIER

Vous pouvez également utiliser les éléments suivants sur votre page d'accueil statique

$query = new PreGetPostsForPages(
    251,       // Page ID we will target, your static front page ID
    'content', //Template part which will be used to display posts, name should be without .php extension 
    false,     // Should get_template_part support post formats
    true,      // Should the page object be excluded from the loop
    [          // Array of valid arguments that will be passed to WP_Query/pre_get_posts
        'post_type'      => 'post', 
        'category_name'  => 'featured',
        'posts_per_page' => 4
    ] 
);
$query->init(); 

où la classe PreGetPostsForPages est supportée par ma réponse ici

add_action( 'pregetgostsforgages_after_loop_pagination', function ()
{
    $paged = get_query_var( 'page', 1 );
    next_posts_link( 'Next' );
    previous_posts_link( 'Previous' );
});
4
Pieter Goosen