サポート » 使い方全般 » カテゴリ(タクソノミ)リンクリストの親だけリンク無しでdivタグで出力

  • 解決済 san3san

    (@sansanko)


    <li><a href="">親1</a>
         <ul>
              <li><a href="">子1A</a></li>
              <li><a href="">子1B</a></li>
         </ul>
    </li>
    <li><a href="">親2</a>
         <ul>
              <li><a href="">子2A</a></li>
              <li><a href="">子2B</a></li>
         </ul>
    </li>

    wp_list_categories() と使うと、通常上記のように出力されるカテゴリーのメニューリストですが、
    部分的に出力形式が変わった状態にしたいのです。
    下記のように親カテゴリはリンクをさせず、かつ、親子のブロックを
    divタグで出力するにはどうすればいいでしょう?

    <div><h1>親1</h1>
         <ul>
              <li><a href="">子1A</a></li>
              <li><a href="">子1B</a></li>
         </ul>
    </div>
    <div><h1>親2</h1>
         <ul>
              <li><a href="">子2A</a></li>
              <li><a href="">子2B</a></li>
         </ul>
    </div>

    完全に煮詰まってしまって困り果てました。
    よろしくお願いします。

15件の返信を表示中 - 1 - 15件目 (全17件中)
  • パラメータ’echo=0’で非表示にして、preg_replace()で置換してから出力してはいかがでしょうか?
     
    PHP: preg_replace – Manual

    ありがとうございます。
    時間がかかりそうですがマニュアルをじっくり読んでやってみます。

    すみません。正規表現による置換だと無理がありそうです。
    walkerパラメータで、Walker_Categoryを継承したクラスを作成して、出力を改変した方が楽かもしれません。
     
    今回のやりたいこととは違いますが、フォーラム » 使い方全般 » wp_list_categoriesのリストにクラス付加のように使います。

    モデレーター jim912

    (@jim912)

    sansankoさん、sansankoさん

    一度に取得するより負荷はかかりますが、比較的取り組みやすい方法であれば、

    1. get_termsのparentパラメーターを0で指定し、親カテゴリーのみを取得
    2. 取得した親カテゴリーをループし、divと親カテゴリー名を表示
    3. wp_list_categoriesのchild_ofパラメーターに親カテゴリーのidを指定して、子カテゴリーのリストを表示

    が良いのではないかと思います。

    popupさん
    ありがとうございます。
    教えていただいた過去の投稿を参考にして、なんとか近いものができてきました。

    walkerパラメータを使って
    start_el()で親カテゴリに対してブロック先頭にdivをつける+カテゴリ名をリンクなしh2指定
    end_el()で親カテゴリに対してブロック末尾に /div につける
    でひとまずどうにかなりましたが、いくつか疑問点があります。

    1)リストの表示形式指定をしたいのですが、下記のように指定すると反映されません。
    どこか記述が間違っていますか? それともこの方法では無理でしょうか?

    <?php
    $MyWalker = new MyWalker();
    $args = array(
    'orderby' => 'name',
    'order' => 'ASC',
    'style' => 'list',
    'show_count' => 1,
    'hide_empty' => 0,
    'hierarchical' => 1,
    'title_li' => 0,
    'taxonomy' => '*****',
    'walker' => $MyWalker,
    );
    ?>
    
    <?php
    wp_list_categories($args);
    ?>

    2)実は最初の質問時には書いていませんでしたが、
    もうひとつ、小カテゴリを囲むulタグにもクラス指定をしたいのです。
    試してみたところ、単純に元々のulタグに新たなulがついて二重になっただけでした。
    これは他にも対応方法がありそうだと思ったので質問しませんでしたが、
    もしwalkerパラメータで一度に解決できそうでしたら
    ヒントを教えていただけますでしょうか。

    そうでなければアクションフックを使う感じですか?
    (アクションフックも使ったことが無いのでよく分かっていません。)

    どうぞよろしくお願いいたします。

    jim912さん
    どうもありがとうございます。

    ループ指定はちょっと考えてみたのですが、
    親カテゴリが順次増えていく予定のため
    ID指定で子を呼び出すのは今回は現実的でないと諦めました。

    ID指定以外で、親と子をセットでひとつずつ呼び出す方法は
    全く見当がつきませんでした。

    しかし「やっぱりこういう場合にもループ指定を使うってアイデア自体はアリなんだな」と
    わかって、超初心者としてはちょっとほっとしました。
    どうもありがとうございました。

    モデレーター jim912

    (@jim912)

    sansankoさん

    get_termsで親のIDは取得できますので、親カテゴリが増えた場合でも自動的に追加されます。

    こんにちは

    考えてみました、動きますか?
    functions.php

    class MyWalker extends Walker_Category {
    
    	function start_el(&$output, $category, $depth, $args) {
    		extract($args);
    
    		$cat_name = esc_attr( $category->name );
    
    		$link = '<a href="%1$s" rel="%2$s">%3$s</a>';
    
    		$link = sprintf($link
    							, esc_attr( get_term_link($category) )
    							, $category->slug
    							, $cat_name
    							);
    
    		if($category->category_parent > 0 ){
    
    			$output .= '<li class="'.$class.'">'.$link;
    		}
    		if($category->category_parent == 0){
    			$output .= '<div><h1>'.$cat_name.'</h1>';
    		}	
    
    	}
    
    	function end_el( &$output, $page, $depth = 0, $args = array() ) {
    		if ( 'list' != $args['style'] )
    			return;
    
    		if($depth > 0){
    			$output .= "</li>\n";
    		}else{
    			$output .= "</div>\n";
    
    		}
    	}
    
    }

    //template

    <?php
    $MyWalker = new MyWalker();
    $args = array('walker' => $MyWalker);
    ?>
    
    <?php
    wp_list_categories($args);
    ?>

    訂正:ごみが残っていたので

    <?php
    $MyWalker = new MyWalker();
    $args = array('walker' => $MyWalker,'echo' => 0);
    $result = str_replace(array( '<li class="categories">カテゴリー<ul>'),'',wp_list_categories($args));
    echo rtrim( $result,'</ul></li>');
    
    ?>

    jim912さん

    IDは指定せずに取得だけすればいいんですね。なるほど。
    どうもありがとうございます。
    今回はやりかけたwalkerパラメータでやってみますが、それも使えるように勉強してみます。

    1)については、nobitaさんの回答で解決するでしょうか?
     
    2)については、元々'<ul class=’children’>’となるulのことでしょうか?
    start_el、end_elメソッドの他に、さらにstart_lvlメソッドを追加して書き換えると可能だと思います。

    nobitaさん
    丁寧にありがとうございます。大丈夫です。
    バックスラッシュでの改行とrtrim()もありがとうございます。
    綺麗なhtmlになりいました。

    ただ、指定している記事数のカウント表示ができません。
    下記のように指定していて、なぜか’show_count’だけが効きません。他は効いています。

    <?php
    $MyWalker = new MyWalker();
    $args = array(
    'orderby' => 'name',
    'order' => 'desc',
    'style' => 'list',
    'show_count' => 1,
    'hide_empty' => 0,
    'title_li' => 0,
    'taxonomy' => 'category',
    'walker' => $MyWalker,
    'echo' => 0
    );
    
    ?>

    あと、子カテゴリのliタグにはクラス指定は必要ないので省いていますが
    子カテゴリ全体を囲むulタグにクラス指定が必要です。
    (jQueryで開閉式のメニューを実現するために、こういう出力にしたい)

    それはフィルターフック?を使うしかないでしょうか?

    popupさん
    すみません。回答を見逃しておりました。

    1)については、ほぼ解決ですが
    ‘show_count’だけが効かない点が問題として残っています。

    2)については、おっしゃるとおり元々'<ul class=’children’>’となるulのことです。
    start_lvl ですね。調べてみます。
    本当にありがたいです!

    popupさん

    ありがとうございます。
    2)について、下記のコードで解決できました。

    function start_lvl(&$output, $depth, $args) {
            $indent = str_repeat("\t", $depth);
            $output .= "$indent<ul class=''>\n";
                    //$output .= "$indent\n";
        }

    こちらも参考になりました。

    ‘show_count’が効かない点も、分かりましたらよろしくお願いします。

    こんにちは

    jQueryで開閉式のメニューを実現するために、こういう出力にしたい

    http://d.hatena.ne.jp/tenman/20111109/p1

15件の返信を表示中 - 1 - 15件目 (全17件中)
  • トピック「カテゴリ(タクソノミ)リンクリストの親だけリンク無しでdivタグで出力」には新たに返信することはできません。