サポート » 使い方全般 » list_categories(‘&show_count=1’)のカテゴリの数字をタグで囲めますか?

  • 解決済 makoto69

    (@makoto69)


    はじめまして、よろしくお願いします。

    show_count=1でカテゴリー内の記事数を表示させると
    <?php wp_list_categories('&show_count=1'); ?>

    <li class="cat-item cat-item-11">
    <a href="http://example/category/example/" title="example に含まれる投稿をすべて表示">example</a> (2)
    </li>

    こんな風なソースを吐き出しますが、この場合の「(2)」の部分を任意のタグで囲む方法がありましたら教えてください。

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

    (@jim912)

    makoto69さん、こんにちは。

    方法はありますが、その前にCSSだけで意図した表示ができないか検討してみたほうが良いですね。

    タグを追加する方法としては

    1. wp_list_categoriesでフックして記事数の部分を置換処理
    2. wp-includes/classes.phpのWalker_Categoryクラス内のstart_elメソッド内での記事数追加部分を直接改変

    といったところが現実的かと思います。

    トピック投稿者 makoto69

    (@makoto69)

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

    「フック」という概念?があるんですね、初めてしりました。
    おかげさまで希望通りの表示にする事ができましたが
    置換処理もまったく判らないレベルなので
    以下の記述で問題はないか不安です。
    どうでしょうか?

    1.functions.phpに以下を追加
    add_filter('wp_list_categories','spanCategoriesNum');

    2.プラグインを作成して以下を記述

    function spanCategoriesNum($categoryNum){
    echo str_replace(array("(",")"),array("<span>(",")</span>"),"$categoryNum");
    }

    モデレーター jim912

    (@jim912)

    makoto69さん、こんにちは。

    概ね良いですが、下記の点改善した方が良いです。

    1. add_filterと実行する関数は同じ箇所に記述した方が同期がとれます。
    2. フィルターフックはechoさせずにreturnで改変したデータを戻します。それでないと複数フックが登録してある場合、後に実行されるべきフックが実行されなくなってしまいます。それに全てのフックがその場でechoされる訳ではないので
    3. 提示いただいたコードだと(と)を全て置換してしまいます。正規表現など用いて、より特定させた方が良いです。
    function spanCategoriesNum($categoryNum){
    	$categoryNum = preg_replace( '|(</a>\)? )(\([\d]+\))|', '$1<span>$2</span>', $categoryNum );
    	return $categoryNum;
    }
    add_filter('wp_list_categories','spanCategoriesNum');
    トピック投稿者 makoto69

    (@makoto69)

    返事が遅くなってしまいすみません。
    コードまでありがとうございます。

    やはり正規表現が使えると幅が広がりますね
    しかし教えていただいたものが、どういうものが解析しようと
    正規表現を解説しているサイトを眺めましたが
    なかなか簡単にはいかないですね、精進します。

    1と2承知しました
    同じ場所に書いたほうが判りやすくて良いですね。

    ありがとうございました。

4件の返信を表示中 - 1 - 4件目 (全4件中)
  • トピック「list_categories(‘&show_count=1’)のカテゴリの数字をタグで囲めますか?」には新たに返信することはできません。