Да, проблема была в шаблоне, но иная.
По умолчанию в классе обхода пунктов меню, расширяющем класс Walker_Nav_menu, условие определения пункта как активного было таким:
if(in_array('current-menu-item', $item->classes)) ...
Пришлось его расширить, добавив дополнительные проверки. Не знаю, насколько это правильно, возможно в WP должны быть такие возможности по умолчанию. Я добавил такие условия:
(strpos($item->url, $post->post_name) > 0) || // для стандартных страниц
(strpos($item->url, $post->post_type) > 0) || // для записей пользовательских типов
(get_the_category($post)[0]->name == $item->title) // для стандартных записей рубрики