• 解決済 sasakure_san

    (@sasakure_san)


    記事内に、その記事に登録されているカテゴリを表示させたいと考えております。
    その際、特定のカテゴリは表示させたくありません。

    http://mizyupon-rpg.com/posts/285.html

    上記を参考に、カテゴリid=2を除外するよう下記のタグを設置しました。

    
    <?php
        $cats = get_the_category();
        $exclude = array(2);
        foreach((array)$cats as $cat){
            if(!in_array($cat->cat_ID, $exclude)){
                echo '<a href="' . get_category_link($cat->cat_ID) . '">' . $cat->cat_name . '</a>';
            }
        } ?>
    

    たしかにカテゴリid=2は非表示となったのですが、その子カテゴリは表示されてしまいます。
    カテゴリid=2の親以下(子、孫)すべてを非表示にする方法はございますでしょうか。

    お知恵をお貸しいただけますと幸いです。
    何卒よろしくお願い申し上げます。

    • このトピックはsasakure_sanが8年、 4ヶ月前に変更しました。
9件の返信を表示中 - 1 - 9件目 (全9件中)
  • 関数リファレンス/get terms

    $cats = get_the_category();
        $exclude = array(2);

    の代わりにget termsと引数にexclude_treeとか使うんでしょうか。

    属しているカテゴリーの親だけでいいんですよね

    get_termsの引数にparent=0を追加することで、親カテゴリーだけを指定することができます。

    トピック投稿者 sasakure_san

    (@sasakure_san)

    oisit様
    digitmaetel様
    早速のご返信誠にありがとうございます。

    > get_termsの引数にparent=0を追加することで、親カテゴリーだけを指定することができます。

    PHP初心者のため的外れなことを言っていましたら申し訳ございません。
    自分なりに調べてみたのですが、下記のようなコードとなりますでしょうか。

    <?php $categories = get_the_terms( $post->ID, 'category', array(
    	'parent' => 0,
    ));
    ?>
    トピック投稿者 sasakure_san

    (@sasakure_san)

    再度こちらで調べてコードを作成しました。

    <?php
    $taxonomies =  'category';
    $args = array(
    	'exclude_tree' => array(2)
    	); 
    $terms = get_terms($taxonomies, $args);
    if ( ! empty( $terms ) && ! is_wp_error( $terms ) ) {
        foreach ( $terms as $term ) {
            echo '<li><a href="' . get_term_link( $term ) .'">' . $term->name .'</a></li>';
        }
    }
    ?>

    狙い通りカテゴリid=2の親以下は表示されなくなりましたが
    それ以外のカテゴリがすべて表示されてしまいます…。

    そこで再度ご相談ですが、現在の記事ページのカテゴリのみ
    表示するにはどうすればよいでしょうか。

    素人で申し訳ございません。
    お知恵を拝借できますと幸いです。

    あまりレスが付きませんね。get_termsじゃないのでしょうか。
    効率化いいのか悪いのかわかりませんが、
    get_the_categoryでinclude用のカテゴリー配列を作って、指定してやるあるいはforeachの段階でifでincludeにあるカテゴリーとかするんでしょうか。

    孫まで限定なら下記の通りかなぁと思いますが、さらに奥深くまでやるなら再帰呼び出しが必要かなーと思います。
    そのあたりはちょっと試している時間がないので割愛。

    投稿のカテゴリー IDの 2 とその子と孫カテゴリーを非表示にするには
    $exclude = array(2); に子と孫カテゴリーIDを探して追加したらよいということですよね。その部分のみが下記のコードです。

    $parent_id = 2;
    $exclude = array($parent_id);
    $term_children =  get_term_children( $parent_id, 'category'); // 親ID 2 の子カテゴリーをチェックし、そのIDを配列に保存
    
    if($term_children){  // もし1つでも小カテゴリーがあれば、、、
      array_merge ($exclude, $term_children); // 子カテゴリーIDを $exclude に追記
    
      // 各子カテゴリー内に孫カテゴリーがあるかチェック
      foreach ($term_children as $child){
        $term = get_term_by ('id', $child, 'category'); 
        if($term){ 
           $exclude[] = $term->term_id; // 孫カテゴリーがあれば、追記
        }
      }
    }

    これで $exclude配列に、親ID 2 の子カテゴリーIDと孫カテゴリーIDが入っているはずですよ。

    おっと、get_terms を使えば簡単みたいですね。

    $parent_id = 2;
    $exclude = array($parent_id);
    $term_children =  get_terms( 'category', array('child_of' => $parent_id) );
    
    if($term_children){
     foreach($term_children as $child){
        $exclude[] = $child->term_id;
     }
    }

    で奥深いところまで全部探してくれますね。

    つまりは、下記のようなコードになるのかなと思います。

    <?php
        $cats = get_the_category();
    
        $parent_id = 2;
        $exclude = array($parent_id);
        $term_children =  get_terms( 'category', array('child_of' => $parent_id) );
        if($term_children){
          foreach($term_children as $child){
            $exclude[] = $child->term_id;
          }
        }
     
       foreach((array)$cats as $cat){
            if(!in_array($cat->cat_ID, $exclude)){
                echo '<a href="' . get_category_link($cat->cat_ID) . '">' . $cat->cat_name . '</a>';
            }
        } ?>
    トピック投稿者 sasakure_san

    (@sasakure_san)

    oisit様
    kimipooh様

    この度は色々とご指導いただき、誠にありがとうございます。
    kimipooh様よりご提示いただきましたコードを埋め込むことで
    無事、表示することができました!

    <?php
        $cats = get_the_category();
    	$parent_id = 2;
        $exclude = array($parent_id);
        $term_children =  get_terms( 'category', array('child_of' => $parent_id) );
        	if($term_children){
    			foreach($term_children as $child){
        		$exclude[] = $child->term_id;
     			}
     		};
        foreach((array)$cats as $cat){
            if(!in_array($cat->cat_ID, $exclude)){
                echo '<li><a href="' . get_category_link($cat->cat_ID) . '">' . $cat->cat_name . '</a></li>';
            }
        } ?>

    長々と初心者にお付き合いいただき、本当に感謝しております。
    また何かありましたらご指導いただけますと幸いです。

    この度は本当にありがとうございました!

9件の返信を表示中 - 1 - 9件目 (全9件中)
  • トピック「特定の親カテゴリ以下を非表示にさせたい」には新たに返信することはできません。