サポート » 使い方全般 » tag.phpの記事一覧に条件付きでタグを表示したい

  • 解決済 mmm_squirrel

    (@mmm_squirrel)


    wordpress 4.3.1
    オリジナルのテーマを作成しています。

    tag.phpにて記事一覧を表示しているのですが、
    表示しているタグページのタグ以外のタグを2つ表示したいです。
    ※記事には複数のタグがついています。

    タグを2つ表示するまでは以下の内容でできたのですが、
    表示しているタグページのタグを除外する方法が分かりません。

    <?php
    $arr = get_the_tags();
    $count=0;
    if ($arr) {
    foreach($arr as $tag) {
    $count++;
    if (2 >= $count) {
    echo '<span>'.$tag->name.'</span>&nbsp;&nbsp;';
                     }
                          }
             }
    ?>

    上記のコードだと、タグ「タグ1」のページにて
      ■記事タイトルA
      タグ:タグ1 タグ2
      ■記事タイトルB
      タグ:タグ0 タグ1
    のように「タグ1」のタグがでてしまいます。

    理想としては
    タグ「タグ1」のページにて
      ■記事タイトルA
      タグ:タグ2 タグ3
      ■記事タイトルB
      タグ:タグ0 タグ4
    のように「タグ1」を除外してタグを2件表示したいのです。

    自分なりに調べてみまして
    $exclude = array(現在表示しているタグID);
    みたいな感じでできるのかなぁと思っているのですが、
    PHP初心者のため、どうやって組み込めばいいのか分かりません…。

    ご教示頂けましたら幸いです。
    よろしくお願いいたします。

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

    (@jim912)

    get_queried_object 関数で、表示しているタグページのタグを取得できます。
    これを、foreach の次、$count++; の前で、同じかどうかをチェックし、同じであれば、continue; で次のループへスキップしてしまえば大丈夫です。

    トピック投稿者 mmm_squirrel

    (@mmm_squirrel)

    jim912さま

    ありがとうございます!

    こちらの知識不足で申し訳ないのですが、
    同じかどうかチェックするというのは
    どのようにすればいいのでしょうか?

    トピック投稿者 mmm_squirrel

    (@mmm_squirrel)

    jim912さま

    調べながら下記のように書いてみたのですが、
    表示しているタグが相変わらず出たままになってしまいます。
    何が間違っているのか分からない状態なので、ご教示いただけないでしょうか。

    <?php
    $arr = get_the_tags();
    $queried_object = get_queried_object();
    $count=0;
    if ($arr) {
    foreach($arr as $tag) {
        if( $tag == $queried_object ){
                                      continue;
                                      }
               $count++;
               if (2 >= $count) {
               echo '<span>'.$tag->name.'</span>&nbsp;&nbsp;';
                     }
                          }
              }
    ?>

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

    モデレーター jim912

    (@jim912)

    以下の2つは、get_queried_object で得られる値と、get_the_tags で得られる配列の要素の個々の値を出力してみたものです。
    似ているようですが、get_the_tags で得られる配列の要素には、object_id という項目があるのが分かりますでしょうか。この object_id が何かというと、ここでは投稿のIDが格納されます。

    オブジェクトを比較する場合、「 同じ属性と値を有し」とありますから、この差違によって、同じタグの場合でも異なるものとして判断されてしまっています。

    get_queried_object で得られる値の内容

    object(stdClass)#2022 (10) {
      ["term_id"]=>
      int(3)
      ["name"]=>
      string(4) "sample-tag"
      ["slug"]=>
      string(4) "sample-tag"
      ["term_group"]=>
      int(0)
      ["term_taxonomy_id"]=>
      int(3)
      ["taxonomy"]=>
      string(8) "post_tag"
      ["description"]=>
      string(0) ""
      ["parent"]=>
      int(0)
      ["count"]=>
      int(1)
      ["filter"]=>
      string(3) "raw"
    }

    get_the_tags で得られる配列の要素の値

    object(stdClass)#1885 (11) {
      ["term_id"]=>
      int(3)
      ["name"]=>
      string(4) "sample-tag"
      ["slug"]=>
      string(4) "sample-tag"
      ["term_group"]=>
      int(0)
      ["term_taxonomy_id"]=>
      int(3)
      ["taxonomy"]=>
      string(8) "post_tag"
      ["description"]=>
      string(0) ""
      ["parent"]=>
      int(0)
      ["count"]=>
      int(1)
      ["object_id"]=>
      int(12)
      ["filter"]=>
      string(3) "raw"
    }

    では、どうするかというと、term_taxonomy_id が同じかどうかで判断されると良いかと思います。

    if ( $tag->term_taxonomy_id == $queried_object->term_taxonomy_id ) {
    トピック投稿者 mmm_squirrel

    (@mmm_squirrel)

    jim912さま

    ご丁寧にありがとうございます!
    大変勉強になりました。

    おかげさまで無事にやりたいことができました!

    <?php
    $arr = get_the_tags();
    $queried_object = get_queried_object();
    $count=0;
    if ($arr) {
    foreach($arr as $tag) {
        if ( $tag->term_taxonomy_id == $queried_object->term_taxonomy_id ) {
                                      continue;
                                      }
               $count++;
               if (2 >= $count) {
               echo '<span>'.$tag->name.'</span>&nbsp;&nbsp;';
                     }
                          }
              }
    ?>

    これにて解決としたいと思います。
    本当にありがとうございました。

5件の返信を表示中 - 1 - 5件目 (全5件中)
  • トピック「tag.phpの記事一覧に条件付きでタグを表示したい」には新たに返信することはできません。