web-dev-qa-db-ja.com

ウォーカーに追加の分類名が付けられますか?

私はWordpressの初心者なので、もしあなた方の誰かが私を正しい方法で微笑ませてくれたら幸いです。とにかく、私が気にしているのは、wp_list_categories(および同様の関数)が不要なクラスや不要なものを大量に生成する方法です。

Walker_Categoryを基にした独自のwalkerクラスを作成しようとしましたが、うまくいくようです。クラスとして必要なのは、「現在の」クラスが現在のカテゴリであるときに表示されることですが、表示されない場合は、クラスをまったく表示したくありません。

しかし、どういうわけか私は私の分類名で追加のクラスを得ています。私はwalkerクラスを何度も見てきましたが、分類名が$ classに格納されるべきであることがどこに示されているか見ていないようです。私もオリジナルのWalkerクラスを調べましたが、それについてはあまり得られていません。

助けてください? :)

 class Meow_Walker extends Walker_Category {

    var $tree_type = 'category';
    var $db_fields = array ('parent' => 'parent', 'id' => 'term_id');
    function start_lvl( &$output, $depth = 0, $args = array() ) {
        if ( 'list' != $args['style'] )
            return;

        $indent = str_repeat("\t", $depth);
        $output .= "$indent<ul class='children'>\n";
    }
    function end_lvl( &$output, $depth = 0, $args = array() ) {
        if ( 'list' != $args['style'] )
            return;

        $indent = str_repeat("\t", $depth);
        $output .= "$indent</ul>\n";
    }

    function start_el( &$output, $category, $depth = 0, $args = array(), $id = 0 ) {
        extract($args);

        $cat_name = esc_attr( $category->name );
        $cat_name = apply_filters( 'list_cats', $cat_name, $category );
        $link = '<a href="' . esc_url( get_term_link($category) ) . '"';
        $link .= '>';
        $link .= $cat_name . '</a>';

        if ( !empty($feed_image) || !empty($feed) ) {
            $link .= ' ';

            if ( empty($feed_image) )
                $link .= '(';

            $link .= '<a href="' . esc_url( get_term_feed_link( $category->term_id, $category->taxonomy, $feed_type ) ) . '"';

            $link .= '>';

            if ( empty($feed_image) )
                $link .= $name;
            else
                $link .= "<img src='$feed_image'$alt$title" . ' />';

            $link .= '</a>';

            if ( empty($feed_image) )
                $link .= ')';
        }

        if ( !empty($show_count) )
            $link .= ' (' . intval($category->count) . ')';

        if ( 'list' == $args['style'] ) {
            $output .= "\t<li";
            if ( !empty($current_category) ) {
                $_current_category = get_term( $current_category, $category->taxonomy );
                if ( $category->term_id == $current_category )
                    $class .=  'current';
                elseif ( $category->term_id == $_current_category->parent )
                    $class .=  'current-parent';
            }
            $output .=  ' class="' . $class . '"';
            $output .= ">$link\n";
        } else {
            $output .= "\t$link<br />\n";
        }
    }

    function end_el( &$output, $page, $depth = 0, $args = array() ) {
        if ( 'list' != $args['style'] )
            return;

        $output .= "</li>\n";
    }

}

編集:回避策が見つかりましたが、$ classがどこから分類名を取得するのかを知りたいのですが...

2
AKG

編集wp_list_categories()コードを見た後、classパラメータを関数に渡すことができることに気づきました。空の文字列を渡すと、組み込みのWalkerは常にclass=""をエコーし​​ます。 class属性を完全に取り除くには、まだカスタムウォーカーを使用してstart_elを編集する必要があります。

function start_el( &$output, $category, $depth = 0, $args = array(), $id = 0 ) {
    // ...
    if ( 'list' == $args['style'] ) {
        $output .= "\t<li";
        if ( !empty($current_category) ) {
            $_current_category = get_term( $current_category, $category->taxonomy );
            if ( $category->term_id == $current_category )
                $class =  'current'; // removed string operator. not needed here anymore.
            elseif ( $category->term_id == $_current_category->parent )
                $class =  'current-parent'; // see above
        }
        if ( $class ) // skip output if no class is set
            $output .=  ' class="' . $class . '"';
        $output .= ">$link\n";
    } else {
        $output .= "\t$link<br />\n";
    }
    // ...
}

WordPressがstart_elのコールバックを実行するたびに、分類名(およびデフォルトのクラス)とその他の情報を4番目のパラメータ$argsとして渡します。

デフォルトクラスを削除するには、extract()行の前にある$argsのクラス要素を設定解除または削除します。

function start_el( &$output, $category, $depth = 0, $args = array(), $id = 0 ) {
    unset( $args['class'] );
    extract($args);
    // ...   
}

また、ウォーカーが$classを設定するコードを変更して、文字列演算子を削除することもできます。

if ( $category->term_id == $current_category )
    $class = 'current';
elseif ( $category->term_id == $_current_category->parent )
    $class = 'current-parent';
0
Daniel