Add ancestor class to single posts

Ok so, when you open a single post page (i.e. single.php), you don’t get any current_page_item nor current-page-ancestor classes on your wp_nav_menu, right? And you can’t tell the user in which section they currently are.
Well, this function checks if the name in the labels array of your custom-post-type or category (if it’s a standard post) matches the page title and, if that’s the case, it adds the current-page-ancestor class to your nav menu.
Just copy and paste the snippet in your functions.php file and you’re done.

P.S. Obviously, if the generic name in the labels doesn’t exactly match the title of the page, it won’t add the class, so double-check that.

Code Snippet:

function add_single_post_ancestor_nav_class($classes, $item){
    global $post;
    $is_ancestor = false;
    if ( is_single() ) {
        if ( $post->post_type != 'post' ) {
        	// Checks if the custom-post-type label name matches the title of the nav-page-item
        	$post_type_obj = get_post_type_object($post->post_type);
        	$post_type_labels = $post_type_obj->labels;
        	$post_type_name = $post_type_labels->name;
        	if( $item->title == $post_type_name ) { $is_ancestor = true; }
        else {
        	// Checks if one of the single-post categories matches the title of the nav-page-item
        	$categories = get_categories();
        	foreach ( $categories as $category ) {
        		if ( in_category($category->name) && $item->title == $category->name ) { $is_ancestor = true; }
        if( $is_ancestor ){ $classes[] = 'current-page-ancestor'; }
    return $classes;
add_filter('nav_menu_css_class' , 'add_single_post_ancestor_nav_class' , 10 , 2);

Posted in Posts