サポート » テーマ » 最上位カテゴリ名のみ表示+スラッグをクラスに付与する方法

  • 解決済 ryouma

    (@ryouma)


    自作テンプレートを制作途中の者です。
    他サイトやフォーラムも拝見し色々と試してみましたが、どうしても自己解決することができません。
    まず、カテゴリの設定状況ですが、

    フルーツ(最上位)
    -リンゴ
    -スイカ

    があり、投稿時には最上位カテゴリと子カテゴリを一つずつチェックするようにしています。
    そして、目標とするHMTL記述は下記になります。

    目標のHTML記述

    <span class="cat_icon fruits">
     <a href="http://localhost:8888/news/category/entame">フルーツ</a>
    </span>

    上記のように親カテゴリ名だけを表示し、囲まれているspanのクラスに親のスラッグを入れたいのですが、なかなかうまくいきません。

    試した事
    その1
    <?php $cat = get_the_category(); $cat = $cat[0]; { echo '<span class="cat_icon ' . $cat->category_nicename . '" />'; } ?><?php the_category(','); ?></span>

    こちらの方法では親・子ともに表示されてしまうのと、子の方のスラッグがクラスとして当てられてしまいました。
    つづきまして、、、

    その2

    <?php $c = get_the_category();
    $pid = $c[0]->parent;
    if( $pid > 0 ) {
    do {
    $t = get_term_by( '', $pid, 'category' );
    $pid = $t->parent;
    } while( $pid > 0 );
    echo '<span class="cat_icon ' . $cat->category_nicename . '" /><a href="' . get_category_link( $t->term_id ) . '">' . $t->name . '</a></span>';
    }else{
    echo '<span class="cat_icon ' . $cat->category_nicename . '" /><a href="' . get_category_link( $c[0]->term_id ) . '">' . $c[0]->name . '</a>';
    } ?>

    上記はこちらのhttp://www.mcompany.co.jp/blog/w-press/linux/8694/サイト様を参考にしてみましたが、自力では、、ご覧のように手も足もでませんでした。排出されるHTMLは

    <span class="">
    <a href="http://localhost:8888/news/category/web">フルーツ</a>
    </span>

    最上位のカテゴリ名は取得できましたが、クラス名が付与されませんでした。

    下手な説明で長々と申し訳ありませんが、どなたかお力添えを頂けないでしょうか。どうぞよろしくお願い致します。

6件の返信を表示中 - 1 - 6件目 (全6件中)
  • こんな感じでしょうか。
    なお、検証していませんのでエラーが出るなど動作しないかもしれません。

    <?php
      $cats = get_the_category();  // 現在の投稿のカテゴリー(配列)
      do {
        $cat = array_shift( $cats );  // 配列の先頭を切り出す
        if ( NULL == $cat )  // 配列が空だった(カテゴリーがない)
          break;
      } while ( 0 != $cat->parent );  // 親カテゴリーがあるなら繰り返す
    
      if ( NULL == $cat ) {
        // 投稿に親カテゴリーがひとつも付いていない
      } else {
        $cat_link = get_category_link( $cat->term_id );  // 親カテゴリーのアーカイブ
        echo '<span class="cat_icon ', $cat->slug, '" />';
        echo '<a href="', esc_url( $cat_link ), '">';
        echo $cat->name, '</a></span>';
      }
    ?>
    

    こんな感じでどうでしょうか。

        <?php 
          //この関数はfunctions.phpとかに置いたほうが良いかもですが、とりあえず。。
          function get_top_categoryData( $cat_id ){
            $category_data=get_category( $cat_id );
            while( $category_data -> category_parent != 0 ){
              $category_data=get_category($category_data->category_parent);
            }
            return $category_data;
          }
    
          $post_category = get_the_category();
          $post_top_category = get_top_categoryData($post_category[0]->term_id);
    
          echo '<span class="cat_icon ' . $post_top_category->slug . '" /><a href="' . get_category_link( $post_top_category->term_id ) . '">' . $post_top_category->name . '</a></span>';
        ?>
    

    参考ページ
    http://qiita.com/tamura_masa/items/20fd5e8c1c525d86c3f2

    あぁ、@gblsmさんの回答とかぶってしまいました。細かい場合分けまで考慮していませんので参考まで。

    • この返信は7年、 8ヶ月前にikaringが編集しました。
    • この返信は7年、 8ヶ月前にikaringが編集しました。
    トピック投稿者 ryouma

    (@ryouma)

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

    <?php
      $cats = get_the_category();  // 現在の投稿のカテゴリー(配列)
      do {
        $cat = array_shift( $cats );  // 配列の先頭を切り出す
        if ( NULL == $cat )  // 配列が空だった(カテゴリーがない)
          break;
      } while ( 0 != $cat->parent );  // 親カテゴリーがあるなら繰り返す
    
      if ( NULL == $cat ) {
        // 投稿に親カテゴリーがひとつも付いていない
      } else {
        $cat_link = get_category_link( $cat->term_id );  // 親カテゴリーのアーカイブ
        echo '<span class="cat_icon ', $cat->slug, '" />';
        echo '<a href="', esc_url( $cat_link ), '">';
        echo $cat->name, '</a></span>';
      }
    ?>

    記載して頂いた上記の記述で
    index.php(トップ)とsingle.phpともに試させて頂いたところ、完璧に思い通りの表示になりました!

    ようやく解決する事ができて本当に嬉しく思います。助かりました。
    ありがとうございました!

    トピック投稿者 ryouma

    (@ryouma)

    ikaring様 
    返信ありがとうございます!

    記述して頂いたものでやってみましたが、うまく表示できませんでした。恐らく、私が前後に記述しているソースに何か誤りがあるのかもしれません。@gblsm様の記載して頂いたものでうまく表示することができました。
    ありがとうございました!

    @ryouma さん、余計なお世話かもしれませんが、最初に書いたコードがなぜ違う結果になったのか?も確かめてみてくださいね。また、例示したコードをコピペして動いた良かった、で終わらずに WordPress や PHP の理解を少しずつでも深めていただければと思います。

    トピック投稿者 ryouma

    (@ryouma)

    gblsm様
    おっしゃる通りです。自力で作れるようPHPの参考書籍やWordPressプラグイン開発の書籍なども見てはいるのですが、
    ついついコピペに頼ってばかりで・・・

    なお、最初に記載して頂いた内容も既に挑戦したものでしたが、なぜそうなったのかまではわかりませんでした。
    もっと勉強しないといけませんね。

    お二方とも本当にありがとうございました。

6件の返信を表示中 - 1 - 6件目 (全6件中)
  • トピック「最上位カテゴリ名のみ表示+スラッグをクラスに付与する方法」には新たに返信することはできません。