Afficher un nombre différent de publications par page en fonction du contexte (par exemple, page d'accueil, recherche, archive)

21

Dans les paramètres de lecture, il est possible de définir le nombre de messages affichés qui affecte le nombre de messages affichés dans tous les contextes. Je voudrais plutôt afficher un certain nombre de publications sur la page d'accueil et un nombre différent de publications sur des pages comme les archives, les résultats de recherche, etc.

lecture-paramètres-blog-pages-afficher-au-plus-par-page

Je me rends compte que je pourrais le faire en éditant les fichiers de thème et en modifiant les paramètres de requête, mais je préférerais avoir un accès plus facile à une simple page de paramètres. Il y a longtemps, je suis tombé sur un plugin qui a fait ça, mais je ne peux pas le localiser maintenant.

Est-ce que quelqu'un connaît un plugin pour faire cela, ou même une fonction que je pourrais mettre dans functions.php pour accomplir la même chose?

Doug
la source
Vous pensiez probablement au plugin 'Different Posts Per Page' de @ chip-bennett: chipbennett.net/plugins/cbnet-different-posts-per-page qui fait ce que vous voulez de manière graphique.
Tom Auger

Réponses:

23

Je crois que la meilleure façon de le faire dans un plugin est d'exécuter l'exemple de fonction suivant lorsque le pre_get_postshook d'action est rencontré. L' $wp_queryobjet est disponible, ce qui signifie que vos balises conditionnelles sont disponibles, mais avant que WordPress ne reçoive les publications, ce qui signifie que vous modifiez les variables de requête avant l'exécution de la première requête, plutôt que d'ajouter une deuxième requête comme lorsque query_posts () est utilisé dans un thème fichier.

function custom_posts_per_page($query) {
    if (is_home()) {
        $query->set('posts_per_page', 8);
    }
    if (is_search()) {
        $query->set('posts_per_page', -1);
    }
    if (is_archive()) {
        $query->set('posts_per_page', 25);
    } //endif
} //function

//this adds the function above to the 'pre_get_posts' action     
add_action('pre_get_posts', 'custom_posts_per_page');
kevtrout
la source
J'utilise cette fonction sur mon propre site. Il était facile de le couper et de le coller ici pour vous.
kevtrout
0

vous pouvez faire une boucle personnalisée en utilisant query_posts et spécifier le nombre de publications par is_home, is_archive, etc.

juste une simple instruction if avec query_posts

chrismccoy
la source
Oui, je l'ai mentionné dans ma question. Je cherche un moyen de le faire, donc je n'ai pas à modifier plusieurs fichiers de thème pour modifier les paramètres. Merci.
Doug
1
C'est plutôt une mauvaise idée de le faire de cette façon. WordPress exécute déjà une requête. Si vous insérez query_postsvotre thème, vous ignorerez la requête d'origine et en ferez une autre redondante.
Krzysiek Dróżdż
-1

Pour ajouter à cette question. Est-ce que quelqu'un sait comment déterminer post_per_page pour cette fonction fonction custom_posts_per_page ($ query) si ajoutez la nouvelle page à index.php comme ceci:

<?php
if ($_GET['new'] == 1) 
{
    include ( TEMPLATEPATH . '/newpage.php' );
    exit;
}
?>
glazsasha
la source
-1

Je me rends compte que je pourrais le faire en éditant les fichiers de thème et en modifiant les paramètres de requête, mais je préférerais avoir un accès plus facile à une simple page de paramètres.

Dans un souci d'exhaustivité, j'ai trouvé que la query_postscombinaison avec la $query_stringconcaténation fonctionne bien.

J'ai placé ce code dans index.php(mon thème n'a pas category.php) ...

<?php 
if (!is_front_page()) { 
    query_posts($query_string . "&posts_per_page=20"); 
}
?>

Bien sûr, ce que nous faisons ici est de modifier la chaîne de requête interne de la boucle, en remplaçant le nombre par défaut de publications par page .

Cela fonctionne un plaisir de fournir une liste plus petite de messages sur la page d'accueil où je montre des messages complets, et une liste beaucoup plus grande de messages partout ailleurs (catégories, par date, etc.) où je ne montre que des résumés de messages.

Cependant, veuillez noter que contrairement à la réponse acceptée, cela exécutera la requête deux fois , ce n'est donc pas une solution aussi intéressante.

Jeff Atwood
la source
Jeff, je cherchais un endroit centralisé pour contrôler le nombre de messages retournés dans différents contextes. Votre réponse ne le fait que si vous utilisez index.php pour gérer TOUS les contextes, ce que la plupart des thèmes ne font pas. En plus d'augmenter les appels à la base de données (ce qui affecte les performances), votre technique peut également modifier la réponse aux balises conditionnelles (par exemple, is_home () ou is_front_page) de manière inattendue. Enfin, si vous souhaitez ajouter des boucles secondaires à une page, vous ne devez PAS utiliser query_posts, mais utiliser plutôt "new WP_Query" (ou get_posts).
Doug
@doug ce n'est pas une boucle secondaire, il remplace la boucle principale - et oui, ce thème particulier utilise index.php pour tout rendre, c'est assez minimaliste. J'ai senti que cela avait plus de sens ici comme réponse, mais si vous le souhaitez, je peux poser ma propre question et y répondre si cette réponse vous offense d'une manière ou d'une autre.
Jeff Atwood
En fait, j'ai mal lu votre avant-dernier paragraphe et j'ai pensé que les listes de messages "plus grandes" et "plus petites" étaient sur la même page, donc ma dernière phrase ci-dessus n'était pas pertinente. Et oui, il est parfaitement légitime de mettre tout votre code dans index.php si vous le souhaitez. Et si c'est le cas, votre méthode est un moyen rapide et facile de le faire, donc je supprimerai mon downvote après la fin du verrouillage de 20 heures. Même ainsi, envoyer une nouvelle requête plutôt que de modifier la requête d'origine comme dans la réponse de kevtrout est moins souhaitable pour les raisons déjà mentionnées (par vous, moi et le WP Codex).
Doug