web-dev-qa-db-fra.com

Comment mettre en évidence toutes les catégories actuelles lors de la visualisation d'un seul message?

Lorsqu’un seul article est affiché, le wp_list_categories fonction déjà marque la catégorie actuelle de cet article en affectant la classe CSS current-cat.

Si la publication est mappée sur plusieurs catégories, seule la première catégorie (classée par ordre hiérarchique) est marquée.

Comment attribuer la classe current-cat à à toutes catégories de la publication?

2
tfrommen

Afin d’affecter la classe current-cat à toutes les catégories de la publication en cours, nous allons étendre la fonction wp_list_categories au moyen d’une variable Walker dédiée.

Supposons que la configuration actuelle se présente comme suit:

$args = array(
    'hierarchical' => 0,
    'title_li' => '',
    'show_option_none' => '',
);
wp_list_categories($args);

Maintenant, nous ajoutons le randonneur (que nous allons configurer à l’étape suivante) et un nouvel argument highlight qui fournira un tableau des identifiants de catégorie de la publication actuelle, qui seront gérés par notre marcheur. Bien sûr, nous devons également renseigner le tableau même.

Cela conduit à ce qui suit:

$highlight = array();
$categories = get_the_category();
foreach ($categories as $category)
    $highlight[] = $category->cat_ID;

$args = array(
    'hierarchical' => 0,
    'title_li' => '',
    'show_option_none' => '',
    'highlight' => $highlight,
    'walker' => new TFCategoryWalker(),
);
wp_list_categories($args);

La dernière étape est le marcheur lui-même. Fondamentalement, nous prenons la classe par défaut Walker_Category et ajoutons ce qui manque. Par conséquent, nous n'avons qu'à personnaliser la fonction start_el. Directement après l’instanciation de la variable $class, nous ajoutons ce qui suit:

if (! $highlight) $highlight = array();
elseif (! is_array($highlight)) $highlight = array($highlight);
if (in_array($category->term_id, $highlight)) $class .= ' current-cat';

Et c'est tout.


En somme, il s’agit de la nouvelle classe de marcheur, que nous avons insérée dans notre fichier functions.php:

class TFCategoryWalker extends Walker_Category {

    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) ) . '" ';
            if ( $use_desc_for_title == 0 || empty($category->description) )
                    $link .= 'title="' . esc_attr( sprintf(__( 'View all posts filed under %s' ), $cat_name) ) . '"';
            else
                    $link .= 'title="' . esc_attr( strip_tags( apply_filters( 'category_description', $category->description, $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 ) ) . '"';
                    if ( empty($feed) ) {
                            $alt = ' alt="' . sprintf(__( 'Feed for all posts filed under %s' ), $cat_name ) . '"';
                    } else {
                            $title = ' title="' . $feed . '"';
                            $alt = ' alt="' . $feed . '"';
                            $name = $feed;
                            $link .= $title;
                    }
                    $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";
                    $class = 'cat-item cat-item-' . $category->term_id;

                    // START customization
                    if (! $highlight) $highlight = array();
                    elseif (! is_array($highlight)) $highlight = array($highlight);
                    if (in_array($category->term_id, $highlight)) $class .= ' current-cat';
                    // END customization

                    if ( !empty($current_category) ) {
                            $_current_category = get_term( $current_category, $category->taxonomy );
                            if ( $category->term_id == $current_category )
                                    $class .=  ' current-cat';
                            elseif ( $category->term_id == $_current_category->parent )
                                    $class .=  ' current-cat-parent';
                    }
                    $output .=  ' class="' . $class . '"';
                    $output .= ">$link\n";
            } else {
                    $output .= "\t$link<br />\n";
            }
    } // function start_el

} // class TFCategoryWalker

Références:

3
tfrommen