2

I am using wp_list_categories to display all terms of my custom taxonomy 'categories'.

The function is outputting all my terms successfully but the current category is not being highlighted, even though 'current_category' is set to 1 in my arguments.

The function is being outputted on taxonomy-categories.php, following the naming convention of my taxonomy categories.

It is not inside a loop, could that be why?

UPDATE, here is my function:

$args = array(
    'orderby'               => 'term_group',
    'title_li'              =>  NULL,
    'order'                 => 'ASC',
    'hide_empty'            => 1,
    'use_desc_for_title'    => 0,
    'feed'                  => '',
    'hierarchical'          => 1,
    'echo'                  => 1,
    'current_category'      => 1,
    'taxonomy'              => 'categories'
);
echo wp_list_categories($args);

Note: this works on my single-{post-type}.php template, but does not function on my taxonomy-{taxonomy}.php template.

2
  • You don't need to echo wp_list_categories($args) if you set the echo key to true. I would also try removing the current_category key entirely to see if that helps. It should by default, on the taxonomy template page display the current term from my understanding of it. Finally, the wp_list_categories() can be used anywhere be it inside or outside the loop.
    – Howdy_McGee
    Commented Nov 11, 2013 at 17:06
  • Bingo! You are right. Thank you. I never thought about the echo in my arguments.
    – jagershark
    Commented Nov 11, 2013 at 17:14

3 Answers 3

1

This will add a current-cat class to any / all categories connected to the post, not jut one.

Add this to functions.php

function tax_cat_active( $output, $args ) {

  if(is_single()){
    global $post;

    $terms = get_the_terms( $post->ID, $args['taxonomy'] );
    foreach( $terms as $term )
        if ( preg_match( '#cat-item-' . $term ->term_id . '#', $output ) )
            $output = str_replace('cat-item-'.$term ->term_id, 'cat-item-'.$term ->term_id . ' current-cat', $output);
  }

  return $output;
}
add_filter( 'wp_list_categories', 'tax_cat_active', 10, 2 );
4
  • This works perfectly on my single-{post-type}.php template. However I just realised it does not work on my taxonomy-{taxonomy}.php template. How can I get the same functionality on the taxonomy template?
    – jagershark
    Commented Nov 11, 2013 at 12:49
  • For @Howdy_McGee
    – jagershark
    Commented Nov 11, 2013 at 14:21
  • Could you post your wp_list_categories() code? It should have this functionality by default.
    – Howdy_McGee
    Commented Nov 11, 2013 at 14:47
  • I have updated the question with my code.
    – jagershark
    Commented Nov 11, 2013 at 16:36
4

The answer provided by Howdy_McGee produced a PHP notice for me that prevented it from working correctly. I changed $terms = get_the_terms( $post->ID, $args['taxonomy'] ); to $terms = get_the_terms( $post->ID, 'taxonomy' ); I also added a check that the post has terms associated with it to suppress additional PHP warnings if $terms is empty.

function tax_cat_active($output, $args) {
    if (is_single()) {
        global $post;
        $terms = get_the_terms($post->ID, 'category');
        if (!empty($terms)) {
            foreach( $terms as $term )
                if ( preg_match( '#cat-item-' . $term ->term_id . '#', $output ) )
                    $output = str_replace('cat-item-'.$term ->term_id, 'cat-item-'.$term ->term_id . ' current-cat', $output);
        }
    }
    return $output;
}
add_filter('wp_list_categories', 'tax_cat_active', 10, 2); 
1
  • +1 for corrections, and for those who want to use it: add in style.css (in your theme template folder) li.cat-item.cat-item-12.current-cat a{font-size: 1.5em;font-style: italic;} (where 12 is the Category ID which you need to change to correct ID and the style to own wishes) Remember that you have to add as many style lines as you have categories (with correct cat ID ofcourse)
    – Charles
    Commented Sep 14, 2016 at 0:25
0

Actually this functionality is already build in the wp_list_categories function.

Just use the current_category like this:

'current_category' => get_term_by( 'slug', get_query_var( 'term' ), get_query_var( 'taxonomy' ) ) ?? null,

Full example:

wp_list_categories(array(
                'child_of'            => 0,
                'current_category' => get_term_by( 'slug', get_query_var( 'term' ), get_query_var( 'taxonomy' ) ) ?? null,
                'depth'               => 0,
                'echo'                => 0,
                'exclude'             => '',
                'exclude_tree'        => '',
                'feed'                => '',
                'feed_image'          => '',
                'feed_type'           => '',
                'hide_empty'          => 1,
                'hide_title_if_empty' => false,
                'hierarchical'        => true,
                'order'               => 'ASC',
                'orderby'             => 'name',
                'separator'           => '<br />',
                'show_count'          => 1,
                'show_option_all'     => '',
                'show_option_none'    => __('No categories'),
                'style'               => 'list',
                'taxonomy'            => 'category',
                'title_li'            => '',
                'use_desc_for_title'  => 1,
            ));

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.