Agregar clase al elemento activo y su padre en el menú de navegación
Estoy usando el siguiente código para agregar el nombre de clase "active" al elemento actual del menú:
add_filter('nav_menu_css_class', 'add_active_class', 10, 2 );
function add_active_class($classes, $item) {
// Si el elemento es del nivel principal y está activo actualmente
if( $item->menu_item_parent == 0 && in_array('current-menu-item', $classes) ) {
$classes[] = "active";
}
return $classes;
}
Esto funciona de maravilla, pero solo para elementos sin menú desplegable. Si hay un elemento con elementos hijos, no agregará la clase activa al elemento padre.
¿Hay alguna manera de modificar este código para que el filtro agregue una clase "active" tanto al enlace actual como a su padre?
Dependiendo del contexto que necesites y basándote en el código que tienes, puedes probar esto:
add_filter('nav_menu_css_class', 'add_active_class', 10, 2 );
function add_active_class($classes, $item) {
$class_names = array( 'current-menu-item', 'current-menu-ancestor', 'current-menu-parent', 'current_page_parent', 'current_page_ancestor' );
if( $item->menu_item_parent == 0 && in_array( $class_names, $classes) ) {
$classes[] = "active";
}
return $classes;
}
ACTUALIZACIÓN: Si el código anterior no funciona debido al array como parámetro para la función in_array por la versión de PHP, prueba este código:
add_filter('nav_menu_css_class', 'add_active_class', 10, 2 );
function add_active_class($classes, $item) {
if( $item->menu_item_parent == 0 &&
in_array( 'current-menu-item', $classes ) ||
in_array( 'current-menu-ancestor', $classes ) ||
in_array( 'current-menu-parent', $classes ) ||
in_array( 'current_page_parent', $classes ) ||
in_array( 'current_page_ancestor', $classes )
) {
$classes[] = "active";
}
return $classes;
}
Si quieres que cualquier elemento actual tenga la clase active, puedes hacer esto:
add_filter('nav_menu_css_class', 'add_active_class', 10, 2 );
function add_active_class($classes, $item) {
if( in_array( 'current-menu-item', $classes ) ||
in_array( 'current-menu-ancestor', $classes ) ||
in_array( 'current-menu-parent', $classes ) ||
in_array( 'current_page_parent', $classes ) ||
in_array( 'current_page_ancestor', $classes )
) {
$classes[] = "active";
}
return $classes;
}

Hola @splashingpixels. Probé tu código pero parece no funcionar. Revisé el código fuente y la clase "active" no se está agregando.

¡Gracias @splashingpixels, eres increíble! Código impecable. Solo una pregunta más, que no sé si es posible o si es una restricción de Wordpress. Con este código, ahora todos los elementos padres tienen la clase "active" cuando es necesario. ¿Hay alguna manera de que si hago clic en un elemento del menú desplegable, también se agregue la clase active? ¿Para que la clase "active" se agregue tanto al padre como al hijo?

Sí, puedes, mira la respuesta actualizada... y por favor márcala como la respuesta si te funcionó... gracias.
