web-dev-qa-db-fra.com

class = "parent" pour wp_list_pages?

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

crée la sortie suivante ...

<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" est appliqué à toutes les pages avec des enfants. Est-il possible de créer une fonction (ou tout autre moyen) pour ajouter un nom de classe à toutes les pages ayant des enfants? Dans mon exemple ci-dessus, seule la "page avec sous-pages" et sa première page enfant "page avec une autre sous-page" doivent avoir un li.parent appliqué.

Est-ce possible sur le côté des serveurs? Je suis capable de le faire avec javascript, mais je me demande s'il existe une méthode plus efficace et plus propre pour le faire côté serveur?

je vous remercie

1
mathiregister

Phew! Un peu plus complexe que je l’aurais souhaité - si seulement le filtre page_css_class repassait $args, cela épargnerait beaucoup d’efforts (peut le soumettre à trac).

Depuis 3.3 c'est aussi simple que cela!

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 );

Pour ceux qui utilisent WordPress 3.3, voici le bourreau de travail:

/**
 * 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') );
    }
}

Je conseillerais de placer la classe dans votre functions.php, elle sera alors disponible où vous le souhaitez.

Pour l'utiliser, appelez wp_list_pages() comme suit;

// 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