j'ai un problème avec ma requête personnalisée et j'ai besoin de votre aide.
Je souhaite afficher tous les messages d'une catégorie spécifique et je trouve cet extrait:
// get all the categories from the database
$cats = get_categories();
// loop through the categries
foreach ($cats as $cat) {
// setup the cateogory ID
$cat_id= 0;
// Make a header for the cateogry
// create a custom wordpress query
query_posts("cat=$cat_id&posts_per_page=22");
// start the wordpress loop!
if (have_posts()) : while (have_posts()) : the_post();
Cela fonctionne très bien MAIS si un article est dans plusieurs catégories, tous les autres articles sont affichés 2 et 3 fois.
Par exemple: je veux lister tous les posts de la catégorie 0 Il y a 2 posts - post 1 et post 2; post 1 est également dans la catégorie 1 Post 1 et Post 2 seront affichés deux fois dans l’interface.
Comment puis-je résoudre ce problème?
Merci les gars.
N'utilisez pas query_posts()
- cela casse des choses.
Il n'est pas nécessaire d'exécuter une requête pour chaque catégorie lorsque vous pouvez créer une requête unique pour accrocher simultanément les publications dans n'importe quelle catégorie spécifiée. C’est à la fois plus efficace et un moyen de vous éviter de faire double emploi.
Puisque vous utilisiez query_posts()
pour remplacer la requête principale, la solution correcte consiste alors à modifier la requête principale en un crochet pre_get_posts
action - ou à la remplacer complètement par une WP_Query
instance de votre propre conception. En particulier, vous devrez utiliser les paramètres de catégorie - le plus probable category__in
qui vous permet de spécifier un tableau d'identificateurs de catégorie.
Tout cela en tête, votre code n'a pas beaucoup de sens - il obtient une liste de toutes les catégories, puis interroge la même catégorie 0
autant de fois qu'il y a de catégories différentes. Autrement dit, s'il y a 6 catégories différentes, le code interroge la catégorie 0
pour les publications 6 fois au lieu d'interroger chaque catégorie unique.
De plus, si vous souhaitez interroger toutes les catégories existantes pour les publications, il n’ya aucune raison d’inclure des arguments de requête de catégorie. En omettant les arguments de requête de catégorie, WordPress effectuera une requête pour les publications de toute catégorie.
En plaçant le query_posts
(et la boucle while (have_posts())
imbriquée) dans votre boucle for, vous réexécutez la boucle et détruisez la requête principale. Il est donc indiqué dans la documentation de query_posts
que vous devez rechercher un autre moyen de modifier la boucle principale.
https://developer.wordpress.org/reference/functions/query_posts/
Vous obtiendrez de meilleurs résultats en utilisant un hook d’action pour l’appel get_posts et en ajustant le tax_query
function wpse257739_custom_categories_posts( $q ) {
if ( $q->is_main_query() ) {
$q->set( 'tax_query', array(
'taxonomy' => 'category',
'field' => 'slug',
'terms' => array( 'category-one', 'category-2' ),
'operator' => 'IN' // redundant
) );
}
}
add_action( 'pre_get_posts', 'wpse257739_custom_categories_posts` );
Détails de la documentation complète: https://codex.wordpress.org/Class_Reference/WP_Query#Taxonomy_Parameters