web-dev-qa-db-ja.com

wp_list_pagesの場合はclass = "parent"?

<div class="menu">
    <ul>
        <?php wp_list_pages('exclude=&title_li='); ?>
    </ul>
</div>

次のような出力を作成します。

<div class="menu">
    <ul>
        <li><a href="#">Page 1</a></li>
        <li><a href="#">Page with Subpages</a>
            <ul class="children">
                <li><a href="#">Page with another subpage</a>
                    <ul class="children">
                        <li><a href="#">subsubpage</a></li>
                    </ul>
                </li>
            </ul>
        </li>
        <li><a href="#">Page 3</a></li>
        <li><a href="#">Page 4</a></li>
    </ul>
</div>

子を持つすべてのページにはul class="children"が適用されています。すべてのページに子供がいるというクラス名を追加するための関数(または他の方法)を作成することは可能ですか?上記の私の例では、 "サブページのあるページ"とその最初の子ページ "別のサブページのあるページ"にのみli.parentを適用する必要があります。

それはサーバーサイドで可能ですか?私はJavaScriptでそれを行うことができますが、私はそれをサーバーサイドで行うためのより良い、よりクリーンな方法があるのだろうか?

ありがとうございました

1
mathiregister

あー!私が思っていたよりも少し複雑です - フィルタpage_css_classだけが$argsを返してくれれば、多くの手間が省けます(これをtracに送ってもいいです)。

3.3以降、これと同じくらい簡単です。

function add_parent_class( $css_class, $page, $depth, $args )
{
    if ( ! empty( $args['has_children'] ) )
        $css_class[] = 'parent';
    return $css_class;
}
add_filter( 'page_css_class', 'add_parent_class', 10, 4 );

WordPress 3.3より前のバージョンでは、これが主役です。

/**
 * Extend the default page walker class to append class names for pages that
 * are parents.
 * @uses Walker_Page
 */ 
class My_Page_Walker extends Walker_Page
{
    /**
     * Filter in the classes for parents.
     */
    function _filterClass( $class )
    {
        $class[] = 'parent'; // change this to whatever classe(s) you require
        return $class;
    }

    /**
     * This is effectively a wrapper for the default method, dynamically adding
     * and removing the class filter when the current item has children.
     */
    function start_el( &$output, $page, $depth, $args, $current_page )
    {
        if ( !empty($args['has_children']) )
            add_filter( 'page_css_class', array( &$this, '_filterClass') );

        parent::start_el( $output, $page, $depth, $args, $current_page );

        if ( !empty($args['has_children']) )
            remove_filter( 'page_css_class', array( &$this, '_filterClass') );
    }
}

私はあなたのfunctions.phpにクラスを置くことをお勧めします、そしてそれはあなたがそれを使いたい場所ならどこでも利用可能です。

それを使うには、wp_list_pages()をそのように呼び出します。

// You need to pass the walker argument to wp_list_pages(). You must use an
// array to do this.
wp_list_pages(array(
    'walker'   => new My_Page_Walker,
    'title_li' => ''
));
7
TheDeadMedic