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
このブログのサイドに表示しているメニューがそれになります。