web-dev-qa-db-fra.com

wp_list_categories () - la classe de chat également dans les posts?

J'ai écrit ma propre fonction pour lister tous les termes de taxonomie d'une taxonomie donnée…

function wr_list_taxonomy($taxonomy, $orderby, $hierarchical) {
    $show_count   = 0;
    $pad_counts   = 0;
    $title        = '';

    $args = array(
      'taxonomy'     => $taxonomy,
      'orderby'      => $orderby,
      'show_count'   => $show_count,
      'pad_counts'   => $pad_counts,
      'hierarchical' => $hierarchical,
      'title_li'     => $title
    );

    return wp_list_categories( $args );
}

Donc, cette fonction fonctionne exactement comme wp_list_categories() et crée également une classe "cat courant" une fois que je suis sur une page de terme.

Alors imaginez ma structure d'URL…

www.mysite.com/term //current-cat works perfect
www.mysite.com/term/a-post-associated-with-this-term //current-cat not assigned

Existe-t-il une chance de faire fonctionner la classe "chat actuel" une fois que je suis dans un poste mais dans cette "catégorie" comme indiqué ci-dessus?

mise à jour:

La fonction wr_list_taxonomy() est appelée dans mon fichier header.php.

<nav id="main-nav">
            <ul class="wr-nav" role="navigation">
                    <?php
                        global $post;
                        $taxonomy = 'event_type';
                        $term_id = 0;
                        $terms = wp_get_post_terms( $post->ID, $taxonomy, array("fields" => "ids") );
                        if ( !empty($terms) )
                            $term_id = $terms[0];
                        wr_list_taxonomy($taxonomy, 'name', 1, $term_id); ?>
            </ul>
</nav>

J'ai mis à jour la fonction wr_list_taxonomy() à votre version.

De plus, j'ai une autre fonction qui pourrait être pertinente pour la chose que je veux…

/**
 * Add category-slug as classname to wp_list_categories()
 */

add_filter('wp_list_categories', 'add_slug_css_list_categories', 10, 2);

function add_slug_css_list_categories($list, $args) {

    if ( $args["taxonomy"] == "event_type" ) {
        $cats = get_terms('event_type');
        $class = 'term term-';
    } else {
        $cats = get_categories();
        $class = 'category-';
    }

    foreach( $cats as $cat ) {
        $find = 'cat-item-' . $cat->term_id . '"';
        $replace = $class . $cat->slug . '"';
        $list = str_replace( $find, $replace, $list );
        $find = 'cat-item-' . $cat->term_id . ' ';
        $replace = $class . $cat->slug . ' ';
        $list = str_replace( $find, $replace, $list );
    }

    return $list;
}

Cette fonction ajoute la "catégorie-slug" à chaque élément <li> de la fonction wr_list_taxonomy(). Cela fonctionne bien.

J'ai juste besoin que la classe "current-cat" soit également appliquée lorsque je suis sur un site single.php (post) associé à la "catégorie actuelle" dans laquelle je suis.

1
mathiregister

Oui bien sur. Vous devez juste obtenir le terme id et le mettre sur les arguments. Vérifier wp_list_categories()

function wr_list_taxonomy($taxonomy, $orderby, $hierarchical, $cat_id) {
    $show_count   = 0;
    $pad_counts   = 0;
    $title        = '';
    $cat_id = 0;

    $args = array(
      'taxonomy'     => $taxonomy,
      'orderby'      => $orderby,
      'show_count'   => $show_count,
      'pad_counts'   => $pad_counts,
      'hierarchical' => $hierarchical,
      'title_li'     => $title,
      'current_category' => $cat_id
    );

    return wp_list_categories( $args );
}

Vous devez passer l'id de la catégorie ou du terme. Pour que ça marche.

Comment obtenez-vous l'ID de la catégorie?

Par exemple:

    global $post;
    $taxonomy = 'my-tax';
    $term_id = 0;
    if(is_singular('post')){ // post type is optional.
      $terms = wp_get_post_terms( $post->ID, $taxonomy, array("fields" => "ids") );
      if(!empty($terms))
        $term_id = $terms[0]; //we need only one term id
    }

   wr_list_taxonomy($taxonomy, $orderby, $hierarchical, $term_id);

C'est juste un exemple simple et il y a d'autres façons de le faire. Cela dépend de l'endroit où vous utilisez le code.

1
Sisir