Eu tenho um menu definido no WP Admin que se parece com isso:
Quero poder exibir todos os links filhos na barra lateral sempre que estiver na página pai. Por exemplo, se o usuário estiver na minha página "Sobre nós", desejo que uma lista dos 4 links destacados em verde apareça na barra lateral.
Eu olhei para a documentação de wp_nav_menu () e ela não parece ter nenhuma maneira interna de especificar um nó específico de um determinado menu para usar como ponto de partida na geração dos links.
Criei uma solução para uma situação semelhante que se baseava nos relacionamentos criados pelo pai da página, mas estou procurando um que use especificamente o sistema de menus. Qualquer ajuda seria apreciada.
Respostas:
Ainda estava em minha mente, então eu a revisitei e montei esta solução, que não depende tanto do contexto:
Uso
fonte
Walker_Nav_Menu
aula. Como todas as coisas do menu demais para comentar - faça uma nova pergunta sobre isso?wp_filter_object_list
linha parawp_filter_object_list( $items, array( 'object_id' => $args->submenu ), 'and', 'ID' );
@ goldenapples: Sua classe Walker não funciona. Mas a ideia é realmente boa. Eu criei um andador com base na sua ideia:
Agora você pode usar:
A saída é uma lista que contém o elemento raiz atual e seus filhos (não seus filhos). Def: Elemento raiz: = O item de menu de nível superior que corresponde à página atual ou é pai de uma página atual ou pai de um pai ...
Isso não responde exatamente à pergunta original, mas quase, já que ainda existe o item de nível superior. Isso é bom para mim, porque quero o elemento de nível superior como um título da barra lateral. Se você deseja se livrar disso, pode ser necessário substituir o display_element ou usar um analisador de HTML.
fonte
Oi @jessegavin :
Os menus de navegação são armazenados em uma combinação de tipos de postagem personalizados e taxonomias personalizadas. Cada menu é armazenado como um termo (ou seja, "Sobre o menu" , encontrado em
wp_terms
) de uma taxonomia personalizada (ou sejanav_menu
, encontrado emwp_term_taxonomy
).Cada item do menu Nav é armazenado como uma postagem de
post_type=='nav_menu_item'
(por exemplo, "Sobre a empresa" , encontrada emwp_posts
) com seus atributos armazenados como meta meta (inwp_postmeta
) usando ummeta_key
prefixo de_menu_item_*
onde_menu_item_menu_item_parent
é o ID da postagem do item do menu Nav do pai do item de menu.O relacionamento entre menus e itens de menu é armazenado em
wp_term_relationships
ondeobject_id
se refere ao$post->ID
item de menu Nav e o$term_relationships->term_taxonomy_id
se refere ao menu definido coletivamente emwp_term_taxonomy
ewp_terms
.Tenho certeza de que seria possível conectar os dois
'wp_update_nav_menu'
e'wp_update_nav_menu_item'
criar menus reaiswp_terms
e um conjunto paralelo de relaçõeswp_term_taxonomy
ewp_term_relationships
onde cada item do menu Nav que possui itens de sub-menu Nav também se torna seu próprio menu Nav.Você também gostaria de conectar
'wp_get_nav_menus'
(o que sugeri ser adicionado ao WP 3.0 com base em algum trabalho semelhante que eu fazia alguns meses atrás) para garantir que os menus de navegação gerados não sejam exibidos para manipulação pelo usuário no administrador; caso contrário, eles sairia da sincronização muito rápido e você teria um pesadelo de dados na sua mão.Soa como um projeto divertido e útil, mas é um pouco mais de código e teste do que posso me dar ao luxo de lidar agora, em parte porque qualquer coisa que sincronize dados tende a ser uma PITA quando se trata de resolver todos os erros (e porque clientes pagantes estão me pressionando para fazer as coisas. :) Mas, armado com as informações acima, sou bastante desenvolvedor de plugins WordPress motivado que poderia codificá-lo, se quisesse.
É claro que você percebe agora que, se codificá-lo, é obrigado a publicá-lo aqui para que todos possamos nos beneficiar da sua generosidade! :-)
fonte
wp_nav_menu()
, precisará clonar os menus porquewp_nav_menu()
está fortemente acoplado à estrutura do menu . A outra opção é copiar owp_nav_menu()
código e fazer as modificações necessárias para exibir como um submenu.Esta é uma extensão de walker que deve fazer o que você está procurando:
Baseado livremente no código dos mfields, referi no meu comentário anterior. Tudo o que faz é verificar ao percorrer o menu se o elemento atual é (1) o item de menu atual ou (2) um ancestral do item de menu atual e expande a subárvore abaixo apenas se uma dessas condições for verdadeira . Espero que funcione para voce.
Para usá-lo, basta adicionar um argumento "walker" ao chamar o menu, ou seja:
fonte
$top_level_elements
e adicionar seu próprio teste antes da chamada para$this->display_element
.depth
parâmetro para a chamadawp_nav_menu
, caso seu tema esteja substituindo o padrão de 0 (mostrar todos os níveis)?Atualização: Eu fiz isso em um plugin. Faça o download aqui .
Eu mesmo precisava resolver isso e acabei escrevendo um filtro nos resultados da pesquisa do menu. Permite que você use
wp_nav_menu
normalmente, mas escolha uma subseção do menu com base no título do elemento pai. Adicione umsubmenu
parâmetro ao menu da seguinte maneira:Você pode até atingir vários níveis de profundidade colocando barras:
Ou se você preferir com uma matriz:
Ele usa uma versão slug do título, que deve perdoar coisas como letras maiúsculas e pontuação.
fonte
$loc = split( "/", $loc );
no plugin por$loc = preg_split( "~/~", $loc );
Eu montei a seguinte aula para mim. Ele encontrará o pai de navegação superior da página atual ou você pode fornecer um ID de navegação superior de destino no construtor walker.
Chamada de navegação:
fonte
@davidn @hakre Oi, eu tenho uma solução feia sem um parser HTML ou substituição de display_element.
fonte
A saída do menu nav inclui muitas classes para o item atual, ancestral do item atual, etc. Em algumas situações, eu consegui fazer o que você deseja, deixando a saída da árvore de navegação inteira e, em seguida, usando o css para reduzi-lo para apenas filhos da página atual etc.
fonte
Eu fiz um andador modificado que deve ajudar! Não é perfeito - deixa alguns elementos vazios, mas funciona. A modificação é basicamente os bits $ current_branch. Espero que ajude alguém!
}
fonte
Confira o código no meu plugin ou use-o para o seu propósito;)
Este plugin adiciona o widget "Menu de navegação" aprimorado. Ele oferece muitas opções que podem ser definidas para personalizar a saída do menu personalizado através do widget.
Características incluem:
item selecionado (opção para incluir o item pai).
http://wordpress.org/extend/plugins/advanced-menu-widget/
fonte