web-dev-qa-db-fra.com

Comment afficher un seul message sur la page d'accueil tout en ayant une pagination normale?

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.

8
Jan Fabry

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;
    }
}
6
Jan Fabry

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.

  1. A créé une nouvelle page appelée home et y a mis mon texte de bienvenue.
  2. Désactiver la page d'accueil par défaut et définir ma page d'accueil personnalisée comme page de démarrage
  3. Création d'un nouveau modèle de page (copié et modifié) existant
    1. laissez-le afficher le corps de la page
    2. chargez les trois derniers messages de la catégorie X et affichez-les
    3. avoir un lien "plus" en dessous de celui qui pointe sur/category/category-x /

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.

3
Hinek

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.

1
john010117

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 .

0
lfalin