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.
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;
});
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())
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' );
});