サポート » 使い方全般 » 複数のカスタム投稿タイプで共通のタクソノミーを使った時、アーカイブ

  • 解決済 yamaguchi1432

    (@yamaguchi1432)


    現在、二つのカスタム投稿(postA,postB)があり、共通の分類として(tarmA)を作成しました。
    postAの個別ページの時にget_the_term_listを使いtarmAを出力したところ、リンク先のアーカイブページではtarmAに所属しているpostA,postBが出力されました。

    私としてはpostAの記事ページからはpostAが所属しているtarmAのみのアーカイブページ。
    postBではpostBが所属しているtarmAのみのアーカイブページの表示にしたいです。

    このような振る舞いが可能なんでしょうか?

    ご教授お願いいたします。

    カスタム投稿、タクソノミーの作成は
    Custom Post Type UIを使用しています。

8件の返信を表示中 - 1 - 8件目 (全8件中)
  • 個人的な見解。なので参考程度に。間違ってるかもしれないし。
    カスタム投稿わからないなら使わない方が、後々面倒じゃないかもしれない。

    使い方が逆だと思う。
    本来termAでカスタム投稿を作り、カスタム分類posttypesをつくって、
    投稿termAに対して分類postAかpostBをつかうべきじゃないかな。
    その上でtaxonomy-posttypes.phpあるいはtaxonomy-posttypes-postA.phpとtaxonomy-posttypes-postB.phpというテンプレートをつくってsiteurl/?posttyps=postAかBかでそのテンプレートを呼び出す。
    wordpressコーデックスのテンプレート階層を参照のこと。

    追記
    スレ主さんがしようとしてることはカスタム投稿男性/女性を作って、人間という分類をつけようとしてないかな。

    回答ありがとうございます!

    ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
    使い方が逆だと思う。
    本来termAでカスタム投稿を作り、カスタム分類posttypesをつくって、
    投稿termAに対して分類postAかpostBをつかうべきじゃないかな。
    その上でtaxonomy-posttypes.phpあるいはtaxonomy-posttypes-postA.phpとtaxonomy-posttypes-postB.phpというテンプレートをつくってsiteurl/?posttyps=postAかBかでそのテンプレートを呼び出す。
    ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
    なるほど、逆転の発想ですね。

    ちょっと、私の書き方が悪かったのですが、具体的にいうと

    カスタム投稿Aに「動画」
    カスタム投稿Bに「学生紹介」
    カスタムタクソノミーが「学科・コース」
    というものがあったとして、カスタムタクソノミー「学科・コース」のタームは数が今後増えて行く前提です。
    カスタムタクソノミー「学科・コース」に例えば「Webコース」というタームを追加した場合、カスタム投稿「動画」と「学生紹介」に「Webコース」というタームが選択できるようになり、「動画」の個別ページのターム「Webコース」をクリックするとカスタム投稿「動画」のターム「Webコース」のみのアーカイブページにしたいです。
    すいません、説明が下手で。。。

    仮にoisitさんのやり方で運用して行くとなると、「学科・コース」が増えるたびに、カスタム投稿が増えて行くことになると思うので、現実的には難しい感じです。

    ちなみに、それぞれの投稿にカスタムフィールドを使い記事のテンプレートを作っています。

    ちゃんと理解できていなかったら、ごめんなさい。。。

    学科・コースのスラッグが course
    Webコースのスラッグが web
    と仮定すると、現在はアーカイブページが

    siteurl/?course=web  // 基本パーマリンクの時
    または
    siteurl/course/web   // カスタムパーマリンク

    なのですよね。ここにカスタム投稿タイプの縛りをかければよいので、
    カスタム投稿タイプ動画のスラッグが movie
    同、学生紹介のスラッグが intro
    と仮定すると

    siteurl/?course=web&post_type=movie
    または
    siteurl/course/web?post_type=intro

    のようにパラメータを付加できればよさそうです。
    これには(未検証ですが)それ用の関数をフィルター term_link へフックできます。term_link は、get_the_term_list() の内部でアーカイブリンクを生成するときに呼び出される get_term_link() が、リンク文字列を返す前に適用するフィルターです。
    term_link | Hook | WordPress Developer Resources
    https://developer.wordpress.org/reference/hooks/term_link/
    get_term_link() | Function | WordPress Developer Resources
    https://developer.wordpress.org/reference/functions/get_term_link/
    get_the_term_list() | Function | WordPress Developer Resources

    get_the_term_list()

    なるほどカスタムフィールドの件までいってればカスタム投稿納得です。
    やっぱりコーデックスのテンプレート階層を参照されると良いのでは。
    ようはカスタム投稿用のテンプレートがないからではないかと。
    ない場合archive.phpがよばれるので、いっしょくたなんじゃないかと。
    archive-動画.phpとarchive-学生紹介.phpつくれば、それぞれで絞り込みますので
    siteurl/?post_type=動画&course=web
    でarchive-動画.phpテンプレート呼び出してそこで、
    2番めのコースのクエリ文字列わたしてコースを絞り込めばいいのでは。
    逆に
    iteurl/course/web?post_type=introとかなら
    taxonomy- course- web.phpとか作って投稿タイプのみでしぼりこむとか
    taxonomy- course.phpでカスタム分類のタームと投稿タイプで絞り込むとか
    カスタマイズするんでしょうね。

    雑文で恐縮。

    gblsm さん、oisitさん
    ご返答ありがとうございます!

    なるほど!
    パラメーターを渡すんですね!!

    試しに入れてみたら、ちゃんと絞り込めていました。
    ありがとうございます!

    term_linkも作って検証してみます。
    仕組み自体はわかったので行けそうです。
    やってみます!

    検索でも何て検索していいのか分からなくて、聴く人も居なかったんで、すごく助かりました。
    gblsm さん、oisitさんご協力ありがとうございました。

    はじめまして。横からすいません。

    自分もほぼ同じ問題で悩んでいました。
    その後、イメージ通りに実装できたのでしょうか?

    もし宜しければ参考にしたいのでコードを見せていただけると幸いです。

    よろしくお願いいたします。

    連絡遅くなってしまい申し訳ございません。

    一応、僕がやりたかったことは、urlのパラメーターで解決できました。

    仮に上記のように
    カスタム投稿「動画(movie)」
    カスタム投稿「学生紹介(student)」
    の二つの投稿に共通のタクソノミー「学科・コース(course)」というものがあった場合。

    動画(movie)ページではタクソノミー「学科・コース(course)」のターム「Aコース」をクリックした場合、動画(movie)のAコース一覧を出したいっという時。

    まず、タームの表示を以下のように読み込みました。

    <?php 
    $tarms_course =  get_the_terms( $post ->ID, 'course' );//タクソノミー「コース」のターム取得
    if($tarms_course){
    foreach ( $tarms_course as $term ) {
    $term_link = get_term_link( $term );
    $term_course_list.='<a href="' . esc_url( $term_link ) . '?post_type=movie">' . $term->name . '</a>';
    }
    }
    ?>
    <!--html出力-->
    <div class="course"><?php $term_course_list ?></div>

    このような感じでいけました。
    ご参考になりましたでしょうか?

    まだ、本アップ前なので、記事が多くなった時などのアーカイブがページ別れた時などの振る舞いは確認できていません。

    不具合、修正等ありましたら、ご指摘ください。
    よろしくお願いいたします。

    すいません。
    説明不足でした。

    上記コードはカスタム投稿「動画(movie)」専用のテンプレート(single-movie.php)を作った場合のコードです。

8件の返信を表示中 - 1 - 8件目 (全8件中)
  • トピック「複数のカスタム投稿タイプで共通のタクソノミーを使った時、アーカイブ」には新たに返信することはできません。