サポート » 使い方全般 » 複数条件に合致したタームリスト又はカテゴリリスト

  • kurita83

    (@kurita83)


    以前にも同じトピックがあるのですが、解決されておりませんでしたので投稿させて頂きました。

    http://ja.forums.wordpress.org/topic/22901?replies=1

    私も上記トピックの方と同じ様な事を実現したいのですが、改めて実現したい事を記載させて頂きます。

    【現在の設定】
    ○「製品」というカスタム投稿タイプを作成。

    ○「車種名」「製品カテゴリ」というカスタム分類を作成。

    ○上記分類には下記の用にタームを設定

    ■車種名
    ├カーネーム1
    ├カーネーム2
    └カーネーム3

    ■製品カテゴリ
    ├エアロ
    ├ホイール
    └マフラー

    (なお、これらの作成には『Custom Post Type UI』を使用しました)

    この状況で、一つだけ投稿をしたとし、これには「カーネーム1」「エアロ」「ホイール」のタームを設定。

    【実現したい動作】
    ○トップページには「車種名」「製品カテゴリ」それぞれのリストを一覧表示

    ○「エアロ」をクリックした場合、該当する投稿のタイトル一覧を表示。

    ○「カーネーム1」をクリックした場合、製品カテゴリのリストを表示。
    ただし、あくまで「製品カテゴリ」のいずれかに属しており、かつ「カーネーム1」にも属している投稿があるか否かを判断し、投稿が存在する「製品カテゴリ」ターム名を表示。
    (つまり「エアロ」と「ホイール」というターム名のみリスト表示させる)

    このような動作をさせたく、検索していたのですが、投稿一覧を表示させるサンプルはみつかるものの、
    リストを表示させるドンピシャのコードサンプルを発見出来ませんでした。

    お恥ずかしながらPHPの知識がほとんどなく、サンプルなくして自分でカスタムする事が今は困難なため質問させて頂きました。

    どなたか解決策をご存知の方がいらっしゃいましたら、ご教授頂けないでしょうか。
    宜しくお願い致します。

3件の返信を表示中 - 1 - 3件目 (全3件中)
  • モデレーター gatespace

    (@gatespace)

    簡単なところから。

    トップページには「車種名」「製品カテゴリ」それぞれのリストを一覧表示

    トップページに限りませんが、カスタム分類(タクソノミー)の一覧をリスト表示するなら
    wp_list_categoriesでできます。taxonomyパラメーターにカスタム分類を指定すれば可能です。
    コードもCodesにサンプルが載っています。
    あと最近のフォーラムの投稿「カスタムタクソノミー 特定の親カテゴリーの子カテゴリー一覧表示」もご覧ください。
    http://ja.forums.wordpress.org/topic/23480?replies=6

    「エアロ」をクリックした場合、該当する投稿のタイトル一覧を表示。

    通所のカテゴリーアーカイブと同じで、カスタム分類の各タームもそのままでアーカイブを持ちますから特にコードを書かなくても実現可能です。
    試しに、先に書いた wp_list_categories で出力されたコードからターム名をクリックしてみてください。
    (ダッシュボードからもいけますけどね)

    ○「カーネーム1」をクリックした場合、製品カテゴリのリストを表示。
    ただし、あくまで「製品カテゴリ」のいずれかに属しており、かつ「カーネーム1」にも属している投稿があるか否かを判断し、投稿が存在する「製品カテゴリ」ターム名を表示。
    (つまり「エアロ」と「ホイール」というターム名のみリスト表示させる)

    ここだけは、wp_list_categoriesだけでは実現できないので、がっちりコードを書かないといけないと思います。
    例えば「カーネーム2」「マフラー」という投稿があったとしても、「カーネーム1」のアーカイブページにおいて「製品カテゴリ」のターム一覧を表示させる時は「マフラー」は除外、ということですか?

    kurita83

    (@kurita83)

    gatespace 様

    ご返信頂きありがとうございます。

    トップページには「車種名」「製品カテゴリ」それぞれのリストを一覧表示

    「エアロ」をクリックした場合、該当する投稿のタイトル一覧を表示。

    上記に関しましては、確かに wp_list_categories を記述して問題なく実現出来ました。

    例えば「カーネーム2」「マフラー」という投稿があったとしても、「カーネーム1」のアーカイブページにおいて「製品カテゴリ」のターム一覧を表示させる時は「マフラー」は除外、ということですか?

    はい、おっしゃる通りです。
    この動作を実現する方法がまったく見当がついておりません。
    解決策お分かりになりますでしょうか。
    宜しくお願い致します。

    モデレーター gatespace

    (@gatespace)

    ロジックとしては

    1. 車種名 の各タームのアーカイブにおいて
    2. そのタームに属するカスタム投稿の各投稿全てをチェックして
    3. 製品カテゴリでチェックが入っているタームのみ、リスト表示

    になると思います。

    余りきれいなコードではないですが。

    <?php
    	if ( is_tax( 'carname' ) ) { // カスタムタクソノミー「車種名(carname)」の各タームのアーカイブの時
    		$carname_obj = get_queried_object();
    		$carname_id = (int)$carname_obj->term_id;
    		$seihin_ids = array();
    		$args = array (
    			'post_type' => 'seihin', // カスタム投稿タイプ seihin
    			'tax_query' => array( // タームID指定
    				array(
    					'taxonomy' => 'carname',
    					'field' => 'id',
    					'terms' => $carname_id
    				)
    			),
    			'post_per_page' => -1, // 全て
    		);
    		$car_query = new WP_Query( $args ); // 条件にあう投稿全てを取得
    		if ( $car_query->have_posts() ) {
    			while ( $car_query->have_posts() ) { // ループ
    				$car_query->the_post();
    				$seihin = wp_get_post_terms( get_the_ID(), 'seihin', array( "fields" => "ids" ) ); // 投稿に紐付けられた カスタムタクソノミー seihin のIDを全て取得。戻り値は配列
    				$seihin_ids = array_merge( $seihin_ids, $seihin );
    			}
    		}
    		wp_reset_postdata();
    
    		$seihin_ids = implode( ',', array_unique($seihin_ids)); // 重複するタームIDを削除してカンマ区切りに整形
    		$list_args = array(
    			'title_li' => '',
    			'taxonomy' => 'post_tag',
    			'include'  => $seihin_ids
    		);
    
    		wp_list_categories( $list_args ); // リスト出力
    	}
    ?>

    注意点として、いったん条件に合う投稿(特定のターム(カーネーム1)に属する投稿)を全て取得した上で、製品カテゴリのIDを取得(ループを回している)ので、投稿数が増えればパフォーマンスが悪くなる可能性があります。

    ※他に案のある方、投稿願います。

3件の返信を表示中 - 1 - 3件目 (全3件中)
  • トピック「複数条件に合致したタームリスト又はカテゴリリスト」には新たに返信することはできません。