[WordPress] タクソノミー・タームを全て取得&表示する
WordPressのタクソノミー・タームに関する備忘録です。
サイドバーに「カテゴリ一覧」のナビゲーションリストを表示させたい、といったケースに使える実装サンプルもご紹介します。
前提:カスタムタクソノミーの定義
functions.php
で定義します。
下記は、カスタム投稿タイプ「ブログblog
」に、
タクソノミー「カテゴリblog_category
」を定義する例です。
register_post_type( 'blog', [
'label' => 'ブログ',
'public' => true,
'has_archive' => true,
]);
register_taxonomy( 'blog_category', 'blog', [
'label' => 'カテゴリ',
'hierarchical' => true,
'show_in_rest' => true
]);
管理画面で登録したカテゴリひとつひとつをタームと呼びます。
参考:
関数リファレンス/register post type
関数リファレンス/register taxonomy
タームの取得方法
get_terms()
で、タクソノミーに登録したタームの情報をすべて取得できます。
ターム一覧ページへのリンクURLが欲しい場合は、get_term_link()
を使います。
$terms = get_terms('タクソノミー名');
foreach($terms as $term):
echo $term->name; //ターム名
echo $term->slug; //スラッグ
echo $term->count; //件数
//taxonomy.phpへのURL
echo get_term_link($term);
echo get_term_link($term->slug, 'タクソノミー名');
endforeach;
get_terms()
は、デフォルトでは記事に登録されている件数が1件以上のタームのみを取得します。
0件の場合でも情報を取得したい場合はオプションを追加します。
$terms = get_terms('タクソノミー名', [
'hide_empty' => false,
]);
また、デフォルトでは名前順で情報を取得しますが、他のルールでソートさせるオプションもあります。
$terms = get_terms('タクソノミー名', [
'orderby' => 'count', //件数順
]);
参考:
関数リファレンス/get terms
関数リファレンス/get term link
関連記事:
特定の記事に登録されたタームを取得する「get_the_terms」の紹介はこちら。
[WordPress] 記事に紐づいたタクソノミー・タームを表示する
実装サンプル
基本のリンクつきリスト
<?php
$terms = get_terms('タクソノミー名');
foreach($terms as $term):
?>
<a href="<?php echo get_term_link($term); ?>">
<?php echo $term->name; ?>
</a><br>
<?php
endforeach;
?>
リンクつきリスト+件数表示(0件でも表示)
<?php
$terms = get_terms('タクソノミー名', ['hide_empty'=>false]);
foreach($terms as $term):
?>
<a href="<?php echo get_term_link($term); ?>">
<?php echo $term->name; ?>
(<?php echo $term->count; ?>)
</a><br>
<?php
endforeach;
?>
カレント用のクラスを付ける(taxomony.php)
taxomony.php
系のテンプレートを表示しているときは、デフォルトで変数 $term
に現在地となるタームのスラッグが入っています。これを利用して、カレント表示を作ることができます。
<?php
//taxomony.php では、変数 $term に表示中のタームスラッグが入っている
$allterms = get_terms('タクソノミー名');
foreach($allterms as $allterm):
?>
<a
href="<?php echo get_term_link($allterm); ?>"
class="<?php if($allterm->slug == $term){ echo ' class="is-active"'; } ?>"
>
<?php echo $allterm->name; ?>
</a><br>
<?php
endforeach;
?>
親子関係を踏まえたリストを表示
表示例:
親カテゴリA ←クラス
子カテゴリA-1 ←クラス
子カテゴリA-2
親カテゴリB
子カテゴリB-1
子カテゴリB-2
親カテゴリA ←クラス
.is-parent
(太字スタイル)がついている子カテゴリA-1 ←クラス
.is-child
がついている子カテゴリA-2
親カテゴリB
子カテゴリB-1
子カテゴリB-2
<?php
$terms_basic = get_terms('タクソノミー名');
$terms_custom = [];
// 親子関係を反映した新しい配列 $terms_custom を作成
if($terms_basic){
foreach($terms_basic as $term){
if($term->parent === 0){
$terms_custom[] = $term;
}
}
foreach($terms_custom as $key=>$val){
$terms_custom[$key]->children = [];
foreach($terms_basic as $term){
if($val->term_id === $term->parent){
$terms_custom[$key]->children[] = $term;
}
}
}
}
// 表示
foreach($terms_custom as $term){
echo '<span class="is-parent">'. $term->name .'</span><br>';
foreach($term->children as $child){
echo '<span class="is-child">'. $child->name .'</span><br>';
}
}
?>