- Statut : non résolu
- Ce sujet contient 7 réponses, 3 participants et a été mis à jour pour la dernière fois par seebz, le il y a 12 années et 10 mois.
-
AuteurMessages
-
24 février 2012 à 19 h 23 min #506143
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 : OVHProblè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.
24 février 2012 à 22 h 17 min #818926Moi 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’);25 février 2012 à 8 h 42 min #818927la 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)
27 février 2012 à 9 h 29 min #818928Merci 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 …
28 février 2012 à 8 h 04 min #818925La 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 fournit28 février 2012 à 9 h 44 min #818929Oui, 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.
29 février 2012 à 8 h 42 min #818930Bonjour !
C’est assez étrange …
La page que j’utilise est une page de type taxonomy-nomTaxonomy.phpEn 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 🙂29 février 2012 à 10 h 34 min #818931Dans 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’); -
AuteurMessages
- Le forum ‘Utilisation spécifique de WordPress’ est fermé à de nouveaux sujets et réponses.