Nb de posts pour un custom post type différent de celui par défaut (Créer un compte)

  • Statut : non résolu
8 sujets de 1 à 8 (sur un total de 8)
  • Auteur
    Messages
  • #506143
    gustavo
    Participant
    Padawan WordPress
    60 contributions

    Bonjour,

    Ma configuration WP actuelle
    – Version de WordPress : 3.3.1
    – Version de PHP/MySQL : 5.2.17
    – Thème utilisé : perso
    – Extensions en place : pas pour le moment
    – Nom de l’hebergeur : OVH

    Problème(s) rencontré(s) :

    Bonjour !

    J’ai du un peu tronquer le titre 🙂
    Après 2 bonnes heures de recherches, je viens de comprendre d’ou venait mon soucis de pagination donc c’est plus facile pour l’exposer.

    Je cherche, sur une page de type archives mais pour des custom post type, à gérer une navigation.

    Je n’arrivais à rien quand à la lecture de plusieurs threads de ce forum, j’ai fais un var_dump ($wp_query->query_vars);(MERCI GUY) et je me suis rendu compte que l’argument posts_per_page que j’avais spécifié sur ma page de type archive ne comptait pas pour la gestion de la navigation d’une page à l’autre puisque je retrouvais ceci [« posts_per_page »]=> int(10) qui est le réglage de wordpress (réglage >> option de lecture).

    Existe-t-il un moyen de spécifier un nombre de posts par page pour les CPT différent de celui des posts classique ?

    Voici mon code qui génère le custom post type :

    // CUSTOM TYPE
    add_action(‘init’, ‘my_custom_init’);
    function my_custom_init() {
    //AGENDA
    register_post_type(‘agenda’, array(
    ‘label’ => __(‘Agendas’),
    ‘singular_label’ => __(‘Agenda’),
    ‘public’ => true,
    ‘show_ui’ => true,
    ‘publicly_queryable’ => true,
    ‘query_var’ => true,
    ‘rewrite’ => array(« slug » => « agenda »),
    ‘show_in_menu’ => true,
    ‘show_in_nav_menus’ => true,
    ‘capability_type’ => ‘post’,
    ‘hierarchical’ => false,
    /*rajouté pour la pagination*/
    ‘has_archive’ => true,
    ‘supports’ => array(‘title’)
    )
    );
    };

    add_filter(‘generate_rewrite_rules’, ‘customposttype_rewrites’);
    function customposttype_rewrites($wp_rewrite) {
    $newrules = array();
    $newrules[‘agenda/?$’] = ‘index.php?post_type=agenda’;
    $wp_rewrite->rules = $newrules + $wp_rewrite->rules;
    }

    et celui que j’utilise sur ma page de type archive :

    <?php wp_reset_postdata(); ?>
    <?php
    $paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
    $args=array(
    'post_type' => ‘agenda’,
    ‘posts_per_page’ => 2,
    ‘order’ => ASC,
    ‘paged’=>$paged
    );
    $wp_query = new WP_Query($args);
    if (have_posts()) :
    while ($wp_query->have_posts()) : $wp_query->the_post(); ?>

    etc …

    J’ai donc dans le panel admin lecture « Les pages du site doivent afficher au plus 10 articles » et dans mon code sur ma page de type archive >> ‘posts_per_page’ => 2

    C’est bien 2 qui est pris en compte pour le nb d’articles affiché mais 10 qui est pris en compte pour la gestion de la navigation.

    Je précise que si je mets le même nombre de posts_per_page sur ma page de type archive et dans les options de lecture du pannel d’admin, ma navigation fonctionne correctement. C’est vraiment juste une solution / une piste de spécification de posts_per_page spécifique à mon CPT que je recherche.

    Merci à ceux qui m’ouvriront le cerveau !!!

    G.

    #818926
    seebz
    Participant
    Padawan WordPress
    80 contributions

    Moi j’fais comme ca :

    function myCustomPostType_per_page($query) {
    if (isset($query->query[‘post_type’])
    && $query->query[‘post_type’] == ‘my_custom_post_type’
    ) {
    $query->query_vars[‘posts_per_page’] = 5;
    }
    return $query;
    }
    add_filter(‘pre_get_posts’, ‘myCustomPostType_per_page’);

    (http://seebz.net/notes/?note_id=143)

    #818927
    Guy
    Participant
    Maître WordPress
    14817 contributions

    la solution de seebz doit marcher, je ne l’ai jamais testée, mais la navigation par WP_Query fonctionne aussi, on aurait un sacré problème si cela ne marchait pas 🙂

    C’est dans ton algorithme que quelque chose ne marche pas, déjà pourquoi faire une requête secondaire en créant une nouvelle instance de WP_Query?

    un truc tout bête du style :

    $paged = (get_query_var(‘paged’)) ? get_query_var(‘paged’) : 1;
    $args=array(
    ‘post_type’ => ‘agenda’,
    ‘posts_per_page’ => 2,
    ‘order’ => ASC,
    ‘paged’=>$paged
    );
    query_posts($args);

    (mettre à jour la boucle bien sur en remplacant les $wp_query->have_posts(), $wp_query->the_post(), etc.. par des have_posts(), the_post() tout simple)

    #818928
    gustavo
    Participant
    Padawan WordPress
    60 contributions

    Merci pour vos réponses !

    J’ai mis un peu de temps à vous répondre mais je voulais bien tester (enfin essayer au mieux de comprendre vos réponses !).

    Seebz

    Donc j’ai vu à quoi correspondait pre_get_posts. J’ai testé voir si la fonction était bien éxécutée (avec ma string « toto est beau ») et c’est le cas mais cela ne modifie en rien mon soucis … si réglage différent entre le réglage de l’admin par défaut et ce que j’indique dans mon posts_per_page alors, soucis !!!

    function myCustomPostType_per_page($query) {
    if (isset($query->query[‘post_type’]) && $query->query[‘post_type’] == ‘agenda’) {
    $query->query_vars[‘posts_per_page’] = 2;
    echo ‘toto est beau’;
    }
    return $query;
    }
    add_filter(‘pre_get_posts’, ‘myCustomPostType_per_page’);

    le var_dump ($wp_query->query_vars) me sort toujours :

    [« posts_per_page »]=> int(10)

    Guy !

    J’ai donc simplifié ma requête.

    déjà pourquoi faire une requête secondaire en créant une nouvelle instance de WP_Query?

    J’avoue que je ne vois pas la différence ..; dans quel cas passe-t-on par une variable et dans quel cas peut-on s’en passer ?

     ‘agenda’,
    ‘posts_per_page’ => 2,
    ‘order’ => ASC,
    ‘paged’=>$paged
    );

    query_posts($args);
    if (have_posts()) :
    while (have_posts()) : the_post();

    Mais j’ai toujours mon soucis …

    la sortie du var_dump m’indique :

    array(58) { [« evenement »]=> string(13) « agenda-agenda » [« error »]=> string(0) «  » [« m »]=> int(0) [« p »]=> int(0) [« post_parent »]=> string(0) «  » [« subpost »]=> string(0) «  » [« subpost_id »]=> string(0) «  » [« attachment »]=> string(0) «  » [« attachment_id »]=> int(0) [« name »]=> string(0) «  » [« static »]=> string(0) «  » [« pagename »]=> string(0) «  » [« page_id »]=> int(0) [« second »]=> string(0) «  » [« minute »]=> string(0) «  » [« hour »]=> string(0) «  » [« day »]=> int(0) [« monthnum »]=> int(0) [« year »]=> int(0) [« w »]=> int(0) [« category_name »]=> string(0) «  » [« tag »]=> string(0) «  » [« cat »]=> string(0) «  » [« tag_id »]=> string(0) «  » [« author_name »]=> string(0) «  » [« feed »]=> string(0) «  » [« tb »]=> string(0) «  » [« paged »]=> int(0) [« comments_popup »]=> string(0) «  » [« meta_key »]=> string(0) «  » [« meta_value »]=> string(0) «  » [« preview »]=> string(0) «  » [« s »]=> string(0) «  » [« sentence »]=> string(0) «  » [« fields »]=> string(0) «  » [« category__in »]=> array(0) { } [« category__not_in »]=> array(0) { } [« category__and »]=> array(0) { } [« post__in »]=> array(0) { } [« post__not_in »]=> array(0) { } [« tag__in »]=> array(0) { } [« tag__not_in »]=> array(0) { } [« tag__and »]=> array(0) { } [« tag_slug__in »]=> array(0) { } [« tag_slug__and »]=> array(0) { } [« ignore_sticky_posts »]=> bool(false) [« suppress_filters »]=> bool(false) [« cache_results »]=> bool(true) [« update_post_term_cache »]=> bool(true) [« update_post_meta_cache »]=> bool(true) [« post_type »]=> string(0) «  » [« posts_per_page »]=> int(10) [« nopaging »]=> bool(false) [« comments_per_page »]=> string(2) « 50 » [« no_found_rows »]=> bool(false) [« taxonomy »]=> string(9) « evenement » [« term »]=> string(13) « agenda-agenda » [« order »]=> string(4) « DESC » }

    Je ne comprends pas trop bien là où j’ai pu faire une erreur … ni comment tester au fur et à mesure pour soulever le lièvre …

    #818925
    seebz
    Participant
    Padawan WordPress
    80 contributions

    La méthode que j’utilise fonctionne sur les pages de type « archive-CPT.php » mais il ne faut pas récupérer manuellement les posts (via query_posts au autre) il faut laisser WP gérer ca.

    Donc pour résumer :
    * dans functions (ou dans un plugin) : déclaration du CPT + filtre sur le nombre par page
    * dans « archive-CPT.php » : simplement boucler sur les posts que WP nous fournit

    #818929
    Guy
    Participant
    Maître WordPress
    14817 contributions

    Oui, quel type de page est ce: une page d’archive, archive de posts, de catégorie, de CPT, une page statique?

    On ne voit qu’un bout du code, on ne sait donc pas comment c’est implémenté dans la page. Les deux méthodes fonctionnent si ce n’est pas une requête secondaire ajoutée dans une page.

    #818930
    gustavo
    Participant
    Padawan WordPress
    60 contributions

    Bonjour !

    C’est assez étrange …
    La page que j’utilise est une page de type taxonomy-nomTaxonomy.php

    En gros, aux côtés de mon CPT agenda, j’ai déclaré une taxonomy « evenement » qui comporte 4 categories : agenda et trois enfants d’agenda : concert, expo, interview. C’est sur cette taxonomy parent agenda que je fais la liaison dans l’interface Menus. Tous les éléments du CPT agenda sont obligatoirement taxonomy agenda + 1 enfant.

    du coup, la page d’affichage est taxonomy-evenement.php

    ça me donne une URL de type :
    monsite.com/evenement/agenda-agenda/

    et pour la 2ème page :

    monsite.com/evenement/agenda-agenda/page/2/

    En poursuivant mes tests, j’ai tenté la création d’une page. J’ai lié cette page au modèle taxonomy-evenement.php. Je n’ai rien changé du tout au code de cette page et là, au miracle, tout fonctionne au poil ! Le problème doit venir du rapport d’une mauvaise url avec la taxonomy directe.

    ça me donne une URL de type :
    monsite.com/agenda-page/

    et la deuxième page :
    monsite.com/agenda-page/page/2/

    Je vais continuer de chercher pour voir pourquoi ça fonctionne dans un cas et pas dans l’autre. Mais ne vous prenez pas la tête si la solution ne vous frappe pas car, grâce à vous, j’ai pu avancer, déterminer d’où vient le problème (ne me reste plus qu’à le reproduire étape par étape avec un peu plus de vigilence pour voir ce qui coince), compris certains trucs …
    même si je n’ai pas la réponse complète, j’ai maintenant les outils pour la trouver; la réponse à mon interrogation n’est donc qu’une question de patience et de répétition de la manipulation 🙂

    #818931
    seebz
    Participant
    Padawan WordPress
    80 contributions

    Dans ce cas, faut aussi tester l’extistence de ta taxonomie dans le filtre « pre_get_posts ».

    Ceci devrait fonctionner :

    function agenda_per_page($query) {
    if (!isset($query->query_vars[‘posts_per_page’])
    && isset($query->query[‘post_type’]) && $query->query[‘post_type’] == ‘agenda’
    || isset($query->query[‘evenement’])
    ) {
    $query->query_vars[‘posts_per_page’] = 2;
    }
    return $query;
    }
    add_filter(‘pre_get_posts’, ‘agenda_per_page’);

8 sujets de 1 à 8 (sur un total de 8)
  • Le forum ‘Utilisation spécifique de WordPress’ est fermé à de nouveaux sujets et réponses.