work.log

エンジニアの備忘録的ブログ

WordPressでカテゴリに関連付いたタグ一覧を取得する

投稿:2013-10-29 19:52  更新:

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 を組み合わせて連動型セレクトボックスを作りたいと思います。

スポンサーリンク

コメント

  1. WPBeginner より:

    特定のタグに関連するタグを抽出、というのも可能ですか?

    • miura より:

      WPBeginner 様

      コメントありがとうございます。

      > 特定のタグに関連するタグを抽出、というのも可能ですか?

      「指定したタグ (が付いた記事に) に含まれる別のタグ」という条件であればいけると思います。

      下記記事にやり方を書いてみましたので参考にしてみてください。

      http://worklog.be/archives/3100

      よろしくお願いします。

  2. みぃ より:

    こんにちは。

    まさにやりたいことが書いてあって、とても感動しました!
    ここから取得したタグの一覧を任意の件数、リンクつきでリスト表示するにはどうするのでしょうか?

    もしよろしければお教えいただけますと幸いです。

    • miura より:

      みぃ様

      コメントありがとうございます。

      リスト表示の件ですが下記記事が参考になるかと思います。

      http://worklog.be/archives/3035

      このブログのサイドに表示しているメニューがそれになります。

コメントを残す

よく読まれている記事

  • 今日
  • 週間
  • 月間