サポート » 使い方全般 » 現在表示している記事と同じタームを持つ記事を表示

  • 解決済 mae-tel

    (@mae-tel)


    お世話になります。

    表題の通り、single-○○○.phpで表示している現在の記事と同じタームを持つ他の記事のタイトルなどを表示したいです。

    <?php
    $term = array_shift(get_the_terms($post->ID, '芸能人の種類'));
    ?>
    <?php $tax_posts = get_posts('post_type=芸能人&taxonomy=芸能人の種類&term='.esc_html($term->slug)); if($tax_posts): ?>
    
      <?php foreach($tax_posts as $tax_post): ?>
      <?php if ($post->ID != $tax_post->ID): ?>
      <?php endif; ?>
    
    <li><a href="<?php echo get_permalink($tax_post->ID); ?>"><?php echo esc_html($tax_post->post_title); ?></a></li>
       <?php endforeach; ?>
       <?php endif; ?>

    階層はこのようになっています。
    芸能人 - カスタム投稿タイプ
    ┗芸能人の種類  - タクソノミー
     ┗ジャニーズ    - 親ターム
      ┗SMAP    - 子ターム
       ┗中居マサヒロ - 孫ターム
        ┗中居マサヒロについての投稿(single-○○.phpで表示)
       ┗木村タクヤ  - 孫ターム
        ┗木村タクヤについての投稿(single-○○.phpで表示)
       ┗草薙ツヨシ  - 孫ターム
        ┗草薙ツヨシについての投稿(single-○○.phpで表示)

    実際の名称とは異なりますが、このような階層です。
    上記のコードをsingle-○○○.phpに書き込むと、子ターム「SMAP」の中の中居、木村、草薙すべての投稿が表示されてしまいます。つまり、SMAPというタームを持つ投稿すべてが表示されてしまいます。

    これを、「中居マサヒロ」という孫タームにを持つ投稿のみ表示、「木村タクヤ」という孫タームを持つ投稿のみ表示・・・というようにしたいのです。

    子ターム、孫ターム、投稿の数がかなり多いので、single-○○.phpに入ったときに自動でページの孫タームを取得し、その取得した孫タームを設定して投稿された記事のみ表示、という風にしたいのですが、上手くいかないのです。

    根本的にやり方が間違っているのでしょうか?
    ご教授お願いいたします。

5件の返信を表示中 - 1 - 5件目 (全5件中)
  • jdbb

    (@jdbb)

    その記事はどのtermに所属していますか?
    ・中居正広のみ
    ・ジャニーズ・SMAP・中居正広のように親も入っている

    トピック投稿者 mae-tel

    (@mae-tel)

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

    記事は、SMAP・中居マサヒロともに属しています。(記事作成時、ジャニーズは選べないようにしています)
    ですので、同じタームの記事として出力するとSMAPの他のメンバーの記事も出力されてしまうようです。
    記事としてはSMAPに属させたいのですが、出力は中居マサヒロのみ、としたいです。
    よろしくお願いします。

    jdbb

    (@jdbb)

    <?php
    $term = array_shift(get_the_terms($post->ID, '芸能人の種類'));
    ?>

    一番初めのこちらで中身は関係なく最初のもののみ抜き出しているために
    そのような形になっています。

    方法としては色々あります。
    どんなことがあっても
    >記事は、SMAP・中居マサヒロともに属しています。(記事作成時、ジャニーズは選べないようにしています)
    このルールが守られ、子カテゴリが今後増えることがなければ
    get_the_terms($post->ID, '芸能人の種類')
    で取得したterm群から、子カテゴリのID以外のものを渡すだけで済みます

    ですが、色々あるかもしれないのでちょっとだけ応用の効く方法として

    <?php
      function get_depth($term_id,$taxonomy){
        $terms = get_terms($taxonomy);
        $depth = 1;
        foreach($terms as $t){
          if($term_id == $t->term_id && $t->parent)
            $depth += get_depth($t->parent,$taxonomy);
        }
        return $depth;
      }
      $terms = get_the_terms(get_the_ID(),'芸能人の種類');
      foreach($terms as $t){
        if (get_depth($t->term_id,'芸能人の種類') == 3){
          $term = $t;
          break;
        }
      }
    ?>

    こんなかんじで取得するようにしてやるのもいいかと思います。
    get_the_termsで取得したtermを回して最初に3階層のtermがあったら
    $termに代入するというような動きです。3階層のtermがなかったらエラーになるので
    適当に例外など入れてください

    トピック投稿者 mae-tel

    (@mae-tel)

    jdbb様、ご回答とコードありがとうございます!
    試行錯誤していたため、結果報告が遅れてしまい、大変申し訳ありません。

    結論として、ご教授いただいたコードをそのまま試させていただいたのですが
    「中居マサヒロ」というターム名が表示されるのみとなっております。

    ターム名を取得しているのだから、当然(・・?)なのだと思われますが
    このターム名は取得するのみで、表示はせず、「中居マサヒロ」に属している投稿のデータのみ(木村タクヤ、草薙ツヨシなど他のSMAPに属している記事は無視して)ループさせるには、どのように記述すればよいかわかりません・・・。

    未熟すぎてお手数おかけします・・・。

    トピック投稿者 mae-tel

    (@mae-tel)

    中居マサヒロ - 孫ターム
    ↑このタームページのスラッグを、タームと同じスラッグにすることで解決いたしました!

    jdbb様、本当にありがとうございました!

5件の返信を表示中 - 1 - 5件目 (全5件中)
  • トピック「現在表示している記事と同じタームを持つ記事を表示」には新たに返信することはできません。