J'ai une taxonomie de type
et une taxonomie de category
.
Comment puis-je renvoyer une liste de chaque type
durée de messages dans une seule category
?
Je sais que je peux le faire:
// Final array of all types:
$allTypesFromThisCategory = [];
if (have_posts()) : while (have_posts()) : the_post();
$types = wp_get_post_terms( $post->ID, 'type' );
foreach($types as $type){
// Pseudo code:
if( ! in_array($type, $allTypesFromThisCategory) ){
// Add the type to the array
$allTypesFromThisCategory[] = $type;
}
}
endwhile; endif;
print_r($allTypesFromThisCategory);
Mais cela pose quelques problèmes.
posts_per_page
ne soit pas -1, cette requête ne reflétera pas toujours la types
de toutes les publications, mais uniquement celles de la page en cours.J'aimerais écrire quelque chose comme
global $wpdb;
$results = $wpdb->get_results( "SELECT * FROM ...", OBJECT );
Où le ...
représente:
category
posts
avec cet identifiant de taxonomie category
types
de ces posts
... mais le problème est que je ne peux/suis terrible à écrire des jointures et du SQL brut.
Voici la solution:
global $wpdb;
$wpdb->get_results( $wpdb->prepare(
"SELECT tags.*, COUNT(tags_rel.object_id) as posts_count
FROM
{$wpdb->prefix}terms tags
INNER JOIN {$wpdb->prefix}term_taxonomy tags_tax ON (tags_tax.term_id = tags.term_id)
INNER JOIN {$wpdb->prefix}term_relationships tags_rel ON (tags_tax.term_taxonomy_id = tags_rel.term_taxonomy_id)
INNER JOIN {$wpdb->prefix}posts posts ON (tags_rel.object_id = posts.ID)
INNER JOIN {$wpdb->prefix}term_relationships cats_rel ON (posts.ID = cats_rel.object_id)
INNER JOIN {$wpdb->prefix}term_taxonomy cats_tax ON (cats_rel.term_taxonomy_id = cats_tax.term_taxonomy_id)
INNER JOIN {$wpdb->prefix}terms cats ON (cats.term_id = cats_tax.term_id)
WHERE
tags_tax.taxonomy = 'type'
AND cats_tax.taxonomy = 'category'
AND posts.post_type = 'post'
AND posts.post_status = 'publish'
AND cats.term_id = %d
GROUP BY tags_tax.term_id",
<CATEGORY_TERM_ID> // <-- here goes the category id of current category
) );
PS N'oubliez pas que c'est une belle opportunité de faire de la mise en cache. Ces balises ne changeront pas elles-mêmes. Vous pouvez donc les calculer une fois et les utiliser avec ces valeurs mises en cache. De cette façon, ils ne seront calculés que lors de la sauvegarde des posts ...