get_the_terms()を使って、公開された記事が登録されているタームの一覧を取得する方法


どうも7noteです。いろいろ調べて結局wordpressの関数では標準装備されてなかったので無理やり取得したった話。

登録されているタームの一覧や、記事が存在する(下書き・非公開を含む)タームだけを取得するのはget_terms()でできるが、
get_terms()だと公開されている記事が登録されているタームだけ取得することができませんでした。

解決方法

$posttype = 'ここにポストタイプ';    // 投稿タイプ
$taxonomy = 'ここにタクソノミー';    // タクソノミー

$posts = get_posts( array(
  'post_type' => $posttype,
  'taxonomy' => $taxonomy,
  'posts_per_page' => -1,        // 「-1」で全投稿取得
  'post_status' => 'publish',    // ←重要:公開記事のみ
));
foreach ( $posts as $post ){ 
  $pub_term = get_the_terms($post->ID,$taxonomy,);  /* 投稿IDをひとつずつチェック */
  foreach ( $pub_term as $key => $value ){          /* 取得したターム情報でループ */
    if($value->parent == "0"){                      /* 私は親タームのみを取得したかったので、ifをかましていますが必要なければとばしてください。 */
      $tarm_list[$value->slug] = $value->name;  /* 連想配列として、タームのスラッグとターム名を配列に格納 */
    }
  }
}

var_dump($tarm_list);
// (例)出力結果
// array(2) { ["blog"]=> string(9) "ブログ" ["news"]=> string(9) "お知らせ" }

// (使用例)
echo "<ul>";
foreach($tarm_list as $sluga => $namea){
    echo "<li>".$sluga."は".$namea."</li>";
}
echo "</ul>";
// (例)結果
/*
<ul>
  <li>blogはブログ</li>
  <li>newsはお知らせ</li>
</ul>
*/

解説

get_terms()では公開情報がとれないので、先にget_posts()を使って対象となる記事の一覧を取得します。
取得した記事の一覧から投稿IDをもってきて、get_the_terms()を使って登録されているターム情報を取得します。
ターム情報が取得できたら、そこから必要な情報(上の例ではslugとname)をひっぱってきて、連想配列に格納する。
(私は親タームのみ取得したかったため、if文を挟んでいます。)
あとは作成した連想配列を使って好きなように加工して吐き出すだけです。

連想配列で取得しているため、ダブりがあれば自動的に上書きされているので最終的にダブりがなくなりますが、
通常の配列などで取得する場合はarray_unique()などで最後にダブりを削除する処理を追記してください。

おそまつ!

~ Qiitaで毎日投稿中!! ~
【初心者向け】WEB制作のちょいテク詰め合わせ