Tengo un menú definido en WP Admin que se ve así:
Quiero poder mostrar todos los enlaces secundarios en la barra lateral siempre que esté en una página principal. Por ejemplo, si el usuario está en mi página "Acerca de nosotros", quiero que aparezca una lista de los 4 enlaces resaltados en verde en la barra lateral.
Miré la documentación de wp_nav_menu () y no parece tener ninguna forma incorporada para especificar un nodo particular de un menú dado para usar como punto de partida al generar los enlaces.
Creé una solución para una situación similar que se basaba en las relaciones creadas por la página principal, pero estoy buscando una que utilice específicamente el sistema de menús. Cualquier ayuda sería apreciada.
Respuestas:
Esto todavía estaba en mi mente, así que lo revisé y armé esta solución, que no depende tanto del contexto:
Uso
fuente
Walker_Nav_Menu
clase. Al igual que todas las cosas del menú, demasiado para comentar. ¿Hacer una nueva pregunta al respecto?wp_filter_object_list
línea awp_filter_object_list( $items, array( 'object_id' => $args->submenu ), 'and', 'ID' );
@goldenapples: Tu Walker Class no funciona. Pero la idea es realmente buena. Creé un andador basado en tu idea:
Ahora puedes usar:
El resultado es una lista que contiene el elemento raíz actual y sus elementos secundarios (no sus elementos secundarios). Def: Elemento raíz: = El elemento del menú de nivel superior que corresponde a la página actual o es padre de una página actual o padre de un padre ...
Esto no responde exactamente la pregunta original, pero casi, ya que todavía existe el elemento de nivel superior. Esto está bien para mí, porque quiero el elemento de nivel superior como título de la barra lateral. Si desea deshacerse de esto, es posible que deba anular display_element o usar un analizador HTML.
fuente
Hola @jessegavin :
Los menús de navegación se almacenan en una combinación de tipos de publicaciones personalizadas y taxonomías personalizadas. Cada menú se almacena como un Término (es decir, "Acerca del menú" , que se encuentra en
wp_terms
) de una Taxonomía personalizada (es decirnav_menu
, que se encuentra enwp_term_taxonomy
).Cada elemento del menú de navegación se almacena como una publicación de
post_type=='nav_menu_item'
(es decir, "Acerca de la empresa" , que se encuentra enwp_posts
) con sus atributos almacenados como meta meta (entradawp_postmeta
) utilizando unmeta_key
prefijo de_menu_item_*
dónde_menu_item_menu_item_parent
está la ID de la publicación del elemento de menú de navegación principal del elemento de menú.La relación entre menús y elementos de menú se almacena en
wp_term_relationships
donde seobject_id
relaciona con el$post->ID
elemento de menú Nav y se$term_relationships->term_taxonomy_id
relaciona con el menú definido colectivamente enwp_term_taxonomy
ywp_terms
.Estoy bastante seguro de que sería posible conectar ambos
'wp_update_nav_menu'
y'wp_update_nav_menu_item'
crear menús realeswp_terms
y un conjunto paralelo de relaciones enwp_term_taxonomy
ywp_term_relationships
donde cada elemento del menú de navegación que tenga elementos del menú de navegación secundaria también se convierta en su propio menú de navegación.También querrá enganchar
'wp_get_nav_menus'
(que sugerí que se agregue a WP 3.0 basado en un trabajo similar que estaba haciendo hace unos meses) para asegurarse de que los menús de navegación generados no se muestren para su manipulación por parte del usuario en el administrador, de lo contrario, saldría de la sincronización muy rápido y luego tendrías una pesadilla de datos en tu mano.Suena como un proyecto divertido y útil, pero es un poco más de código y prueba de lo que puedo afrontar en este momento, en parte porque cualquier cosa que sincronice los datos tiende a ser un PITA cuando se trata de solucionar todos los errores (y porque los clientes que pagan me están presionando para que haga las cosas. :) Pero armado con la información anterior, soy un motivado desarrollador de plugins de WordPress que podría codificarlo si quisieran.
Por supuesto, ahora te das cuenta de que si lo codificas, estás obligado a publicarlo aquí para que todos podamos beneficiarnos de tu generosidad. :-)
fuente
wp_nav_menu()
, deberá clonar los menús porquewp_nav_menu()
está estrechamente acoplado a la estructura del menú . La otra opción es copiar elwp_nav_menu()
código y realizar las modificaciones necesarias para mostrar como un submenú.Esta es una extensión de Walker que debe hacer lo que estás buscando:
Basado libremente en el código de mfields al que hice referencia en mi comentario anteriormente. Todo lo que hace es verificar al recorrer el menú para ver si el elemento actual es (1) el elemento del menú actual, o (2) un antecesor del elemento del menú actual, y expande el subárbol debajo de él solo si alguna de esas condiciones es verdadera . Espero que esto funcione para usted.
Para usarlo, simplemente agregue un argumento de "caminante" cuando llame al menú, es decir:
fuente
$top_level_elements
y agregue su propia prueba antes de la llamada$this->display_element
.depth
parámetro a la llamadawp_nav_menu
, en caso de que su tema de alguna manera anule el valor predeterminado de 0 (mostrar todos los niveles)?Actualización: hice esto en un complemento. Descarga aquí .
Necesitaba resolver esto yo mismo y finalmente terminé escribiendo un filtro en los resultados de la búsqueda del menú. Le permite usarlo
wp_nav_menu
normalmente, pero elija una subsección del menú basada en el título del elemento padre. Agregue unsubmenu
parámetro al menú así:Incluso puede ir varios niveles de profundidad colocando barras en:
O si lo prefieres con una matriz:
Utiliza una versión babosa del título, lo que debería hacer que perdone cosas como mayúsculas y signos de puntuación.
fuente
$loc = split( "/", $loc );
en el complemento con$loc = preg_split( "~/~", $loc );
Reuní la siguiente clase para mí. Encontrará el elemento principal de navegación superior de la página actual, o puede darle un ID de navegación superior de destino en el constructor del caminante.
Llamada de navegación:
fuente
@davidn @hakre Hola, tengo una solución fea sin un analizador de HTML o anular display_element.
fuente
La salida del menú de navegación incluye muchas clases para el elemento actual, el antepasado del elemento actual, etc. En algunas situaciones, he podido hacer lo que desea hacer dejando que la salida del árbol de navegación completa, y luego usando css para reducirlo a solo hijos de la página actual, etc.
fuente
¡Hice un andador modificado que debería ayudar! No es perfecto: deja algunos elementos vacíos, pero funciona. La modificación es básicamente esos $ current_branch bits. Espero que ayude a alguien!
}
fuente
Mira el código en mi plugin o úsalo para tu propósito;)
Este complemento agrega un widget mejorado de "Menú de navegación". Ofrece muchas opciones que se pueden configurar para personalizar la salida del menú personalizado a través del widget.
Las características incluyen:
elemento seleccionado (opción para incluir el elemento principal).
http://wordpress.org/extend/plugins/advanced-menu-widget/
fuente