Cómo construir un Walker personalizado para menús en WordPress
En WordPress, los menús personalizados son una parte fundamental del desarrollo de temas avanzados. Si bien la función wp_nav_menu()es muy flexible, hay ocasiones en las que necesitas control total sobre el HTML que genera. Para esos casos, WordPress nos da la clase Walker_Nav_Menu, que podemos extender para crear un custom Walker.
¿Qué es un Walker en WordPress?
Un Walker es una clase que WordPress usa para recorrer estructuras jerárquicas (como menús o taxonomías anidadas) y generar el HTML correspondiente.
En el caso de los menús (wp_nav_menu()), WordPress utiliza la clase Walker_Nav_Menupara construir el HTML de los , , submenús, etc.
Cuando necesitas cambiar esa estructura, puedes extender Walker_Nav_Menuy reescribir algunos de sus métodos para modificar la salida HTML.
¿Cuándo deberías usar un custom Walker?
Deberías crear un Walker personalizado cuando:
- Necesitas agregar clases personalizadas a ciertos elementos.
- Quieres cambiar por completo la estructura HTML de los
y. - Usás un framework CSS como Bootstrap o Tailwind y necesitás adaptarlo.
- Querés incluir íconos, estructuras , o cualquier personalización compleja.
Métodos principales a sobrescribir
Cuando extends
Walker_Nav_Menu, los métodos más usados para modificar el HTML son:) end_lvl() // Fin de un submenú start_el() // Inicio de un ítem de menú (
- ) end_el() // Fin de un ítem de menú
Cómo crear un custom Walker para menús
Creamos un archivo llamado
CustomMenuWalker.phpdentro de tu tema o en un plugin.\n"; } public function endLvl( &$output, $depth = 0, $args = [] ) { $indent = str_repeat( "\t", $depth ); $output .= "$indent\n"; } public function startEl( &$output, $item, $depth = 0, $args = [], $id = 0 ) { $indent = ( $depth ) ? str_repeat( "\t", $depth ) : ''; $classNames = implode( ' ', $item->classes ); $classAttr = $classNames ? ' class="' . esc_attr( $classNames ) . '"' : ''; $output .= "$indent- "; $title = apply_filters( 'the_title', $item->title, $item->ID ); $attributes = ' href="' . esc_attr( $item->url ) . '"'; $output .= ''; $output .= esc_html( $title ); $output .= ''; } public function endEl( &$output, $item, $depth = 0, $args = [] ) { $output .= "
\n"; } }Cómo usar el Walker en wp_nav_menu()
Dentro del archivo
header.phpo donde imprimas el menú:'main_menu', 'container' => false, 'menu_class' => 'main-nav', 'walker' => new CustomMenuWalker() ]); ?>¿Dónde registrar el menú?
En tu archivo
functions.phpo en un plugin:'Menú principal' ]); } add_action( 'after_setup_theme', 'registerThemeMenus' );Estructura de archivos sugerida
/wp-content/themes/tu-tema/ │ ├── functions.php ├── header.php ├── inc/ │ └── CustomMenuWalker.php
Y en
functions.php, incluir la clase:Ejemplo: Walker para Bootstrap 5
Si estás usando Bootstrap, necesitas que los submenús tengan la clase
dropdown-menu, y los elementosliprincipales tengandropdowncondata-bs-toggle.Aquí un fragmento:
classes ); $classes = $hasChildren ? 'dropdown' : ''; $output .= ' - ) end_el() // Fin de un ítem de menú
