¿Hay alguna forma de tomar los elementos del menú de navegación como una matriz multidimensional en lugar de una matriz plana?
Por una estructura en forma de árbol me refiero a algo que preservaría la relación entre los elementos secundarios y primarios, así (esto es solo un ejemplo) ...
array(
array(
'post_type' => 'page',
'post_name' => 'Home',
'children' => array()
),
array(
'post_type' => 'page',
'post_name' => 'About Us',
'children' => array(
array(
'post_type' => 'page',
'post_name' => 'Our History',
'children' => array()
)
)
)
)
Hay una wp_get_nav_menu_items()
función, pero devuelve una matriz unidimensional con todos los elementos en el mismo nivel, que no es lo que quiero. ¿WordPress incluye una forma integrada de obtener una matriz multidimensional para mis elementos de menú? Si no, ¿cuál es la mejor manera de obtener wp_get_nav_menu_items()
una estructura similar a un árbol en una matriz multidimensional en términos de rendimiento?
Walker
clase maneja la profundidad de los elementos del menú de navegación ordenados automáticamente, incluso si la matriz es plana.Respuestas:
El problema de construir un árbol a partir de una matriz plana se ha resuelto aquí con esta solución recursiva ligeramente modificada:
donde agregamos el
wpse_children
atributo prefijado para evitar la colisión de nombres.Ahora solo tenemos que definir una función auxiliar simple:
Ahora es muy fácil transformar un menú de navegación en su estructura de árbol con:
Para JSON, simplemente podemos usar:
Para una versión ligeramente diferente, donde seleccionamos a mano los atributos, mira la primera revisión de esta respuesta aquí .
Actualización: Clase Walker
Aquí hay una idea bastante esquemática de cómo podríamos intentar conectarnos con la parte recursiva del
display_element()
método de laWalker
clase abstracta .donde
WPSE_Nav_Menu_Tree
es una extensión de laWalker_Nav_Menu
clase:Esto podría darnos un enfoque alternativo si funciona.
fuente
wp_get_nav_menu_items
recursivamente.En resumen, la función siguiente crea el árbol de objetos al colocar a los niños en una nueva propiedad de niños dentro del objeto padre.
Código:
Uso:
Salida:
fuente
Versión modificada de la respuesta aceptada donde tiene en cuenta la
menu_order
propiedad de los elementos del menú para mantener el orden correcto de la matriz plana original.menu_order
WordPress lo configura automáticamente, por lo que no es necesario verificar nada:Uso:
fuente
Puede haber un malentendido aquí sobre los elementos del menú de navegación de WordPress como estructuras en forma de árbol.
¡Las estructuras en forma de árbol en WordPress NO SON ARREGLOS MULTIDIMENSIONALES!
Tenga en cuenta que si bien la matriz de elementos de menú devueltos es plana, sigue siendo una estructura en forma de árbol porque cada elemento contiene información sobre su origen (el valor principal es 0 si el elemento no tiene elemento primario o la identificación del elemento principal si es hace).
Cuando pasa dicha matriz a la
Walker
clase, recorre los resultados y crea dos matrices: una que contiene elementos de nivel superior y otra que contiene elementos secundarios en formato$parent_id => array()
donde la matriz contiene elementos de menú que son elementos secundarios directos de ese elemento.Luego, el caminante recorre la matriz de elementos de nivel superior, procesa ese elemento y luego verifica la matriz secundaria para ver si hay elementos secundarios para el elemento actual, y procesa cada uno de ellos de la misma manera, de forma recursiva.
Si desea saber cómo convertir una estructura similar a un árbol de WordPress en una matriz multidimensional, esa es una pregunta completamente diferente (y técnicamente no es una pregunta de WordPress). Pero la información que devuelve
wp_get_nav_menu_items()
es una estructura en forma de árbol ... y puede usarlaWalker
tal como está para manejarla.Si desea ver el código exacto que ejecuta la clase Walker de WordPress para recorrer la matriz, eche un vistazo a Walker-> walk () en WordPress Trac desde las líneas 213-258 . Podría usar ese código tal como está para construir una matriz multidimensional, si eso es lo que busca.
Caminantes
WordPress está diseñado para usar la
Walker
clase para procesar sus estructuras en forma de árbol. Si simplemente está renderizando un menú, o realmente solo necesita el resultado final, es posible que desee considerar usarwp_nav_menu()
para generar su menú ...Ejemplo:
Extendería la clase Walker (por ejemplo
Your_Walker()
) para obtener cualquier salida que necesite. Para ver un ejemplo, vea esta entrada en el Codex .fuente
$sorted_menu_items
sigue siendo una matriz "plana" y la salida de la opción B es una cadena.wp_get_nav_menu_items()
devuelve una estructura en forma de árbol, es decir, una matriz donde cada elemento contiene datos de parentesco. Estas estructuras están destinadas a representarse con unaWalker
clase. Si el caso de uso aquí simplemente implica convertir una matriz "plana" en una matriz multidimensional basada en datos de parentesco (p'post_parent' => 123
. Ej. ), Esta pregunta no es técnicamente acerca de WordPress y debe moverse al Desbordamiento de pila.