J'aimerais avoir un seul article en première page (toujours le plus récent), tout en laissant la pagination normale fonctionner. Ainsi, la page de couverture contient le message 1, la page suivante devrait contenir le message 2-11 (le numéro 1-10 convient également), puis le 12 au 21 ou le 11 au 20, et ainsi de suite. Je sais que je peux changer le nombre de messages en fonction du contexte , mais la valeur "1" sur la page d'accueil signifie que les pages suivantes affichent également un seul message.
Mon problème principal est que /page/2/
et ainsi de suite fonctionnent, mais /page/1/
redirige toujours vers la page d'accueil réelle, /
. Cela signifie que les messages 2 à 10 sont toujours ignorés, car la page 2 indique 11 à 20. Je actuellement je résous ce problème en créant un lien vers mes archives, mais ce n’est pas idéal lorsque vous arrivez à les premiers messages de l’année et il y a moins de messages et aucun moyen évident de continuer.
Je l'ai résolu en utilisant le paramètre de requête offset
. Cela m'a permis d'éditer la requête dans le hook pre_get_posts
et semble être le moyen le plus propre de le faire, sans nouvelle requête. Désormais, la page d’accueil affiche un seul message et page/2/
affiche les messages 2 à 11. Tous les liens continuent à fonctionner, aucune autre modification n'est requise.
add_action('pre_get_posts', 'set_offset_on_front_page');
function _set_offset_on_front_page(&$query)
{
if (is_front_page() && is_paged()) {
$posts_per_page = isset($query->query_vars['posts_per_page']) ? $query->query_vars['posts_per_page'] : get_option('posts_per_page');
// If you want to use 'offset', set it to something that passes empty()
// 0 will not work, but adding 0.1 does (it gets normalized via absint())
// I use + 1, so it ignores the first post that is already on the front page
$query->query_vars['offset'] = (($query->query_vars['paged'] - 2) * $posts_per_page) + 1;
}
}
Ok, peut-être que c'est une façon étrange ou compliquée de faire cela, mais j'avais un problème similaire (je voulais afficher un texte de bienvenue et les trois derniers messages d'une catégorie spécifique sur la première page.
ressemble à ceci: http://hinek.de (la page est en allemand, désolée)
Si cela peut vous convenir et que vous avez besoin de plus d’informations ou d’un exemple de code pour le modèle de page, commentez et je modifierai ce message.
Je suppose que vous utilisez Wordpress 3.0.x?
Afficher un seul poste (quelle que soit la catégorie) sur la page d'accueil est facile. Utilisez query_posts('post_per_page=1')
dans votre fichier home.php
au lieu d’appeler get_template_part('loop')
.
Suivre les méthodes de pagination normales après cela est un peu délicat. Dans votre fichier loop.php
, je suggère de placer <?php global $paged; ?>
avant l'instruction <?php if (have_posts()) : ?>
et d'utiliser la variable $paged
et la fonction query_posts()
pour modifier votre requête afin qu'elle affiche les bons messages.
Votre fichier loop.php
ressemblerait à quelque chose comme ceci (note: non testé):
<?php
global $paged;
if (!is_front_page() && $paged && $post->post_type == 'post') :
query_posts('posts_per_page=10&paged=' . ($paged - 1));
if (have_posts()) :
while (have_posts()) : the_post();
// Rest of the loop
endwhile;
endif;
endif;
?>
J'ai utilisé $paged - 1
simplement parce que la page 2 affichera les messages 1 à 10 et la page 3 affichera les messages 11 à 20, etc.
Cette question est un peu ancienne, mais pour ceux qui découvrent cela à l'ère moderne, vous ne devriez jamais appeler query_posts . Du codex Wordpress:
query_posts () est une façon trop simpliste et problématique de modifier la requête principale d'une page en la remplaçant par une nouvelle instance de la requête. Il est inefficace (ré-exécute les requêtes SQL) et échouera carrément dans certaines circonstances (particulièrement lorsqu'il s'agit de pagination de publications).
...
TL; DR n'utilise jamais query_posts ()
Au lieu de cela, vous devez utiliser le hook pre_get_posts
dans functions.php comme suit:
function hwl_home_pagesize( $query ) {
// Behave normally for secondary queries
if ( is_admin() || ! $query->is_main_query() )
return;
if ( is_home() ) {
// Display only 1 post for the home page
$query->set( 'posts_per_page', 1 );
return;
}
// Otherwise, use whatever is set in the Wordpress Admin screen
$query->set( 'posts_per_page', get_option('posts_per_page'); );
}
add_action( 'pre_get_posts', 'hwl_home_pagesize', 1 );
Cependant, sachez que dans certains cas (tels que l'ajustement des décalages de publication), l'utilisation d'un crochet pre_get_posts
peut altérer votre pagination. Résoudre ce problème n'est pas très difficile, mais il faut en prendre conscience. Voici un exemple de solution à ce problème ici .