分類type
と分類category
があります。
1つのtype
に投稿のすべてのcategory
の用語のリストを返すにはどうすればよいですか?
私はこれができることを知っています:
// 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);
しかし、これにはいくつか問題があります。
posts_per_page
が-1ではないと仮定すると、このクエリは常にすべての投稿のすべてのtypes
を反映するわけではなく、現在のページのものだけを反映するわけではありません。私は何かを書きたいのですが
global $wpdb;
$results = $wpdb->get_results( "SELECT * FROM ...", OBJECT );
...
が表す場所:
category
分類法を使用するposts
分類法IDを持つすべてのcategory
を見つけます。types
のすべてのposts
分類法を選択してください...しかし、問題は、結合や生のSQLを書くのがひどいことはできないかどうかです。
これが解決策です。
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。これはキャッシュを行うための非常に素晴らしい機会であることを忘れないでください。これらのタグは変わりません。だからあなたはそれらを一度計算することができ、それらはそれらのキャッシュされた値を使う。このように彼らは記事の保存中にのみ計算されます...