Take the 2-minute tour ×
WordPress Development Stack Exchange is a question and answer site for WordPress developers and administrators. It's 100% free, no registration required.

My WordPress site has a bunch of posts, all filed by a top-level category and a bunch of subcategories therein.

I have the main site nav rendering the category pages, which, when clicked, get all posts in that top-level category as an 'archive'.

The category highlights as you'd expect when you visit one of these category pages, however, when visiting a single post in this category, no highlighting for me. I'd expect that the top-level category to which this post belongs would be highlighted and it looks as if that is the intended behaviour.

So, my question is: What can I do to make the category the post belongs to highlight in the main nav when I'm viewing a single post?

The site gets quite a lot of traffic so I am keen to get a solution that scales well.

share|improve this question
    
Sure am, wp_nav_menu –  gravy Feb 12 at 21:10
add comment

1 Answer 1

up vote 1 down vote accepted

There are several built-in CSS classes that come with the wp_nav_menu.

In your case, you are looking for something like a current category class, which is not included. But we can easily add that to the CSS classes:

function wpse_134409_current_category_class($classes, $item) {
    if (
        is_single()
        && 'category' === $item->object
        && in_array($item->object_id, wp_get_post_categories($GLOBALS['post']->ID))
    )
        $classes[] = 'current-category';

    return $classes;
} // function wpse_134409_current_category_class

add_filter('nav_menu_css_class', 'wpse_134409_current_category_class', 10, 2);

Please note: this code is untested!

Now you can target your menu item like so:

#menu-id li.current-category {
    /* styles */
}
share|improve this answer
    
Awesome, just what I needed. I even noticed the deliberate amend that you left in there for me (swapped around the arguments of in_array). –  gravy Feb 13 at 14:58
1  
Oh, my bad. That wasn't by purpose. ;) –  t f Feb 13 at 15:05
add comment

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

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