Вот моя оптимизированная / расширенная версия ранее предложенных решений, которая в значительной степени полностью автоматизирована. Больше никаких дополнительных атрибутов CSS или меню не требуется.
Эта версия динамически получает список пользовательских типов сообщений, и если текущий тип сообщений является пользовательским типом сообщений, то он удаляет класс 'current_page_parent' из всех пунктов меню.
Кроме того, он проверяет каждый элемент меню, чтобы определить, предназначен ли он для страницы с шаблоном страницы, таким как "page- {custom_post_type_slug} .php", и если это так, он добавит класс 'current_page_parent'.
Приоритет фильтра - 1, так как некоторые темы заменяют current_page_parent / etc. классы с таким классом, как «активный» (например, это делает «корни»), поэтому этот фильтр должен сначала выполняться.
Наконец, он использует 3 статические переменные, поскольку эта функция вызывается неоднократно, и они (очевидно) остаются неизменными во всех вызовах.
function theme_current_type_nav_class($css_class, $item) {
static $custom_post_types, $post_type, $filter_func;
if (empty($custom_post_types))
$custom_post_types = get_post_types(array('_builtin' => false));
if (empty($post_type))
$post_type = get_post_type();
if ('page' == $item->object && in_array($post_type, $custom_post_types)) {
if (empty($filter_func))
$filter_func = create_function('$el', 'return ($el != "current_page_parent");');
$css_class = array_filter($css_class, $filter_func);
$template = get_page_template_slug($item->object_id);
if (!empty($template) && preg_match("/^page(-[^-]+)*-$post_type/", $template) === 1)
array_push($css_class, 'current_page_parent');
}
return $css_class;
}
add_filter('nav_menu_css_class', 'theme_current_type_nav_class', 1, 2);
PS. Просто чтобы указать на один недостаток во всех не-CSS решениях, которые я видел до сих пор, включая мое собственное:
Что-то, что не принимается во внимание, выделяет пункт меню родителя / предка элемента, ссылающегося на страницу, которая отображает сообщения текущего пользовательского типа сообщения. Рассмотрим пользовательский тип записи "product" и меню вроде:
Home Company News Contact
|
\--About Us
\--Products
«Продукты» - это страница с шаблоном «page-product.php», которая показывает обзор постов типа «продукт». Это выделено благодаря опубликованному решению. Однако «Компания» как ее родитель / предок также должна быть выделена, но это не так. Что-то иметь в виду.