J'ai 3 catégories avec chacune 15 messages, je veux faire UNE requête à la base de données en apportant seulement 5 premiers messages pour chaque catégorie, comment puis-je le faire?
$q = new WP_Query(array( 'post__in' => array(2,4,8), 'posts_per_page' => **FIRST_5_OF_EACH_CAT** ));
Dans le cas où ce n'est pas possible, qu'est-ce qui est plus efficace, obtenir tous les messages pour la catégorie parent et les parcourir ou créer 3 requêtes différentes?
query-posts
Amit
la source
la source
Réponses:
Ce que vous voulez est possible mais vous obligera à vous plonger dans SQL que j'aime éviter autant que possible (pas parce que je ne le sais pas, je suis un développeur SQL avancé, mais parce que dans WordPress, vous voulez utiliser l'API autant que possible pour minimiser les futurs problèmes de compatibilité liés aux futurs changements potentiels de la structure de la base de données.)
SQL avec un
UNION
opérateur est une possibilitéPour utiliser SQL, vous avez besoin d'un
UNION
opérateur dans votre requête, quelque chose comme ceci en supposant que vos slugs de catégorie sont"category-1"
,"category-1"
et"category-3"
:Vous pouvez utiliser SQL UNION avec un
posts_join
filtreEn utilisant ce qui précède, vous pouvez simplement passer l'appel directement ou vous pouvez utiliser un
posts_join
crochet de filtre comme suit; note J'utilise un hérédoc PHP, alors assurez-vous que leSQL;
flush est à gauche. Notez également que j'ai utilisé une var globale pour vous permettre de définir les catégories en dehors du hook en listant les slugs de catégorie dans un tableau. Vous pouvez mettre ce code dans un plugin ou dans lefunctions.php
fichier de votre thème :Mais il peut y avoir des effets secondaires
Bien sûr, l'utilisation des crochets de modification de requête, comme
posts_join
toujours, provoque des effets secondaires dans la mesure où ils agissent globalement sur les requêtes et donc vous devez généralement envelopper vos modifications dans unif
qui ne l'utilise qu'en cas de besoin et quels critères pour tester peuvent être délicats.Concentrez-vous plutôt sur l'optimisation?
Cependant, je suppose que votre question concerne plus l'optimisation que la possibilité de faire une requête top 5 en temps 3, non? Si tel est le cas, il existe peut-être d'autres options qui utilisent l'API WordPress?
Mieux utiliser l'API transitoires pour la mise en cache?
Je suppose que vos messages ne changeront pas souvent, n'est-ce pas? Que faire si vous acceptez périodiquement les trois (3) requêtes, puis mettez en cache les résultats à l'aide de l' API Transitoires ? Vous obtiendrez du code maintenable et de grandes performances; un peu mieux que la
UNION
requête ci-dessus car WordPress stockera les listes de publications sous forme de tableau sérialisé dans un enregistrement de lawp_options
table.Vous pouvez prendre l'exemple suivant et passer à la racine de votre site Web
test.php
pour le tester:Résumé
Bien que oui, vous pouvez faire ce que vous avez demandé en utilisant une
UNION
requête SQL et leposts_join
crochet de filtre que vous proposez probablement mieux en utilisant la mise en cache avec l' API Transitoires à la place.J'espère que cela t'aides?
la source
WP_Query()
ne prend pas en charge quelque chose comme First X For Each Cat . Au lieu deWP_Query()
vous pouvez utiliserget_posts()
sur chacune de vos catégories, pour ainsi dire trois fois:$posts
contient désormais les cinq premiers messages pour chaque catégorie.la source
Je ne connais pas de moyen d'obtenir les cinq premiers messages pour chacune des catégories dans une seule requête. Si vous n'avez jamais que 45 messages, alors frapper la base de données une fois et obtenir vos cinq messages pour chaque catégorie est probablement l'approche la plus efficace. Frapper la base de données trois fois et combiner les résultats n'est pas une mauvaise chose.
la source