WordPress で記事の絞り込み機能を強化しようと思い、カテゴリ連動型セレクトボックス付きの検索フォームを作成中です。
前回は、連動型セレクトボックスは Ajax がうんたらという記事を書いたのですが、今回は要の連動部分の処理を書きたいと思います。
関連記事
TwentyTwelveでカテゴリとタグで絞り込める検索フォームを作る
WordPressのデータをAjax経由で取得する
今回のタイトルは「カテゴリに関連付いたタグ一覧」となっていますが、折角なので「カテゴリから関連タグを抽出」、「タグから関連カテゴリを抽出」という感じでどちらにも対応できるようにしてみました。
スポンサーリンク
指定タクソノミーに関連づいた別のタクソノミー一覧を取得する
指定したタクソノミー (例: カテゴリ) から別のタクソノミー (例: タグ) を取得するために以下のような処理が必要です。
- 指定した ID からタクソノミー名を特定する
- 特定した ID が設定されている投稿情報を取得する
- 投稿情報に設定されているもう一方のタクソノミー情報を抽出する
この要件を満たすために以下の様なコードを書いてみました。
function get_relation_taxonomy( $term_id = FALSE ) {
// 配列の初期値
$term_ids = array(
'term_id' => array(),
'taxonomy' => FALSE
);
if ( $term_id === FALSE ) { return $term_ids; }
// 指定した term_id からタクソノミー名を特定
$taxonomy = get_terms(
array(
'category',
'post_tag'
),
array(
'hide_empty' => TRUE,
'include' => $term_id
)
);
$taxonomy = $taxonomy[0]->taxonomy;
// term_id が存在し、投稿数が 1 以上の場合
if ( ! is_null( $taxonomy ) ) {
// 該当する投稿情報を全て取得
$args = array(
'nopaging' => 1,
'ignore_sticky_posts' => 1,
'order' => ASC,
'tax_query' => array(
array(
'taxonomy' => $taxonomy,
'terms' => $term_id,
'field' => 'id',
'operator' => 'AND'
)
)
);
$my_query = new WP_Query( $args );
if( $my_query->have_posts() ) {
// タクソノミー名を変換処理 (カテゴリ <=> タグ どちらかに入れ替え)
if ( $taxonomy === 'category' ) {
$taxonomy = 'post_tag';
} else {
$taxonomy = 'category';
}
while ( $my_query->have_posts() ) : $my_query->the_post();
// 投稿ページより指定したタクソノミー情報を取得
$term = get_the_terms( get_the_ID(), $taxonomy );
// タクソノミーがある場合
if ( $term ) {
// 全ての配列から term_id を取得してプッシュ
foreach ( $term as $value ) {
array_push( $term_ids['term_id'], $value->term_id );
}
}
endwhile;
wp_reset_query();
}
// term_id がある場合はユニークを抽出して、タクソノミー名を付与
if ( $term_ids['term_id'] ) {
$term_ids['term_id'] = array_unique( $term_ids['term_id'], SORT_NUMERIC );
$term_ids['taxonomy'] = $taxonomy;
}
}
return $term_ids;
}
もしかしたらもっと簡単な方法があるかもですが、思いつく限りで書いてみました。
<?php $term_ids = get_relation_taxonomy( 1 ); ?>
みたいにカテゴリかタグのターム ID を指定すると以下のような結果が返ってきます。
※ 以下はダンプで表示
カテゴリ ID (1) に関連するタグ ID を抽出
array(2) {
["term_id"]=> array(2) { [0]=> string(2) "10" [1]=> string(2) "20" }
["taxonomy"]=> string(8) "post_tag"
}
タグ ID (10) に関連するカテゴリ ID を抽出
array(2) {
["term_id"]=> array(1) { [0]=> string(1) "1" }
["taxonomy"]=> string(8) "category"
}
存在しないもしくは、関連するターム ID がない場合
array(2) {
["term_id"]=> array(0) {}
["taxonomy"]=> bool(false)
}
実行結果としてはこのような感じです。
ここまでやって気付きましたが、セレクトボックスに使う予定なのでターム名も取得して置くべきでした^^;
これは後で付け加えるとして、こんな具合に連動処理ができました。
次回は、これと Ajax を組み合わせて連動型セレクトボックスを作りたいと思います。
特定のタグに関連するタグを抽出、というのも可能ですか?
WPBeginner 様
コメントありがとうございます。
> 特定のタグに関連するタグを抽出、というのも可能ですか?
「指定したタグ (が付いた記事に) に含まれる別のタグ」という条件であればいけると思います。
下記記事にやり方を書いてみましたので参考にしてみてください。
http://worklog.be/archives/3100
よろしくお願いします。
こんにちは。
まさにやりたいことが書いてあって、とても感動しました!
ここから取得したタグの一覧を任意の件数、リンクつきでリスト表示するにはどうするのでしょうか?
もしよろしければお教えいただけますと幸いです。
みぃ様
コメントありがとうございます。
リスト表示の件ですが下記記事が参考になるかと思います。
http://worklog.be/archives/3035
このブログのサイドに表示しているメニューがそれになります。