Ecco la mia versione ottimizzata/estesa delle soluzioni precedentemente suggerite, che è praticamente completamente automatizzata. Non sono necessari ulteriori CSS o attributi di menu.
Questa versione ottiene dinamicamente un elenco di tipi di post personalizzati e se il tipo di post corrente è un tipo di post personalizzato, rimuove la classe 'current_page_parent' da tutte le voci di menu.
Inoltre controlla ogni voce di menu per vedere se è per una pagina con un modello di pagina come "pagina- {custom_post_type_slug} .php", e in tal caso, aggiungerà la classe 'current_page_parent'.
La priorità del filtro è 1, come alcuni temi, sostituisce il file corrente_pagina/ecc. classi con una classe come 'active' (ad esempio 'roots' fa questo), quindi questo filtro deve essere eseguito prima.
Infine, fa uso di 3 variabili statiche poiché questa funzione viene ripetutamente chiamata e queste (ovviamente) rimangono invariate attraverso tutte le chiamate.
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. Solo per segnalare una lacuna in tutte le soluzioni non CSS che ho visto finora, incluso il mio: Qualcosa non preso in considerazione sta evidenziando la voce di menu genitore/antenato di un oggetto che si collega ad una pagina che mostra i post dell'attuale tipo di messaggio personalizzato. Prendere in considerazione un tipo di messaggio personalizzato "prodotto" e un menu come:
Home Company News Contact
|
\--About Us
\--Products
"Prodotti" è una pagina con un modello "page-Product.php" e mostra una panoramica di tutti i messaggi di tipo 'prodotto'. È evidenziato a causa della soluzione pubblicata. Tuttavia, anche la "Società" come genitore/antenato dovrebbe essere evidenziata, ma non lo è. Qualcosa da tenere a mente.
+1 Trova eccellente, lieto di sentire in trac – TheDeadMedic
L'ho fatto con CSS e classi di corpo per ora. Grazie per la funzione però. – Craig
+1 piccolo piccolo frammento qui, mi ha salvato un sacco :) – Xavier