web-dev-qa-db-ja.com

SQLでカテゴリを持つ投稿の用語を取得する

分類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);

しかし、これにはいくつか問題があります。

  1. 約1,000の投稿があるので、それは本当に遅くなります。
  2. posts_per_pageが-1ではないと仮定すると、このクエリは常にすべての投稿のすべてのtypesを反映するわけではなく、現在のページのものだけを反映するわけではありません。

私は何かを書きたいのですが

global $wpdb;
$results = $wpdb->get_results( "SELECT * FROM ...", OBJECT );

...が表す場所:

  1. 現在のcategory分類法を使用する
  2. そのposts分類法IDを持つすべてのcategoryを見つけます。
  3. それらのtypesのすべてのposts分類法を選択してください

...しかし、問題は、結合や生のSQLを書くのがひどいことはできないかどうかです。

2
Djave

これが解決策です。

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。これはキャッシュを行うための非常に素晴らしい機会であることを忘れないでください。これらのタグは変わりません。だからあなたはそれらを一度計算することができ、それらはそれらのキャッシュされた値を使う。このように彼らは記事の保存中にのみ計算されます...

1