it-swarm-ja.com

wp_get_object_terms():渡られたIDに対する相対的な数

wp_get_object_terms()が返されるそれぞれのtermオブジェクトのための "count"メンバー変数を得るとき、私は知っていますが、その "count"はデータベースの$wpdb->term_taxonomyテーブルにあるもので、それはあなたが最初のパラメータとして渡すIDに対して相対的ではありません。しかし、どうやってその数を知るのですか?

例、のようなもの:

$query = new WP_Query(array('post_type' => 'foo', 'numberposts' => 20));
$ids = wp_list_pluck($query->posts, 'ID');
$terms = wp_get_object_terms($ids, 'multi_post_type_tax');

そのため、返された件数はクエリに関連するものにします。つまり、取得した件数は渡された投稿IDに対してのみです。 "multi_post_type_tax"税から返された各用語オブジェクトは、私のクエリにない他の投稿タイプに適用されるため、400のカウントを持つことができますが、特定のIDを渡したので、 20を超える数はまったく意味をなさないでしょう(そしておそらく特定の用語については、それは20未満になるでしょう、私は通常同じ用語を持つ投稿タイプの中のすべての投稿を見ることができません)。それはうまくいくように思えますが、wp_get_object_termsからの戻り値はユニークなオブジェクトを持っています。

4
LOLapalooza

これを実行するための良い方法はないでしょう。

1つの方法は次のとおりです。

  • 見つかった記事をすべて取得します。
  • 一人一人がその用語を手に入れるために、
  • 用語を数えます。

しかし、それはあまり効率的ではありませんし、私はこのやり方をお勧めしません。

一方、効率的ながありますが、それほど良い方法ではありません - SQLクエリでは:

$query = new WP_Query(array('post_type' => 'foo', 'numberposts' => 20));
$ids = wp_list_pluck($query->posts, 'ID');

$placeholders = array_fill(0, count($ids), '%d');
$format = implode(', ', $placeholders);

$results = $wpdb->get_results( $wpdb->prepare(
    " SELECT terms.name, COUNT(tr.object_id) as count FROM {$wpdb->terms} terms " .
    " INNER JOIN {$wpdb->term_taxonomy} tt ON (tt.term_id = terms.term_id) " .
    " INNER JOIN {$wpdb->term_relationships} tr ON (tr.term_taxonomy_id = tt.term_taxonomy_id) " .
    " WHERE tr.object_id IN ({$format}) GROUP BY terms.term_id ",
    $ids
) );
1