{"id":714,"date":"2016-12-28T19:33:37","date_gmt":"2016-12-28T22:33:37","guid":{"rendered":"https:\/\/felipeelia.com.br\/?p=714"},"modified":"2016-12-28T19:41:26","modified_gmt":"2016-12-28T22:41:26","slug":"como-exibir-apenas-um-submenu-no-wordpress","status":"publish","type":"post","link":"https:\/\/felipeelia.com.br\/como-exibir-apenas-um-submenu-no-wordpress\/","title":{"rendered":"Como exibir apenas um submenu no WordPress"},"content":{"rendered":"
Em sites muito grandes, muitas vezes precisamos exibir apenas um submenu, uma parte do menu principal, igualzinho como na navega\u00e7\u00e3o, mas sem criar um novo menu, afinal quanto menos coisas para gerenciar melhor. N\u00e3o seria\u00a0ideal se\u00a0a fun\u00e7\u00e3o wp_nav_menus<\/a> do WordPress aceitasse um par\u00e2metro que restringisse todo um menu a apenas uma parte dele? Pois bem, atrav\u00e9s dos\u00a0hooks no WordPress<\/a> podemos criar este par\u00e2metro com facilidade.<\/p>\n O c\u00f3digo abaixo \u00e9 adaptado de uma resposta no stackflow<\/a>. A fun\u00e7\u00e3o Para exibir o menu use:<\/p>\n Com a chamada para Os itens do menu possuem dois IDs diferentes: o ID do item do menu ( Entender o que s\u00e3o hooks<\/a> \u00e9 fundamental para solu\u00e7\u00f5es limpas dentro do WordPress. Agora que voc\u00ea j\u00e1 viu como eles ajudam a exibir s\u00f3 uma parte de um menu, quer ver como eles auxiliam na customiza\u00e7\u00e3o de widgets<\/a>?<\/p>\n","protected":false},"excerpt":{"rendered":" WordPress e submenus: quer exibir apenas uma parte de um menu maior, sem criar outro para n\u00e3o dificultar a manuten\u00e7\u00e3o? Leia esse tutorial e saiba como.<\/p>\n","protected":false},"author":1,"featured_media":715,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_uag_custom_page_level_css":"","footnotes":""},"categories":[30],"tags":[],"yoast_head":"\nwp_nav_menus()<\/code> aplica o filtro\u00a0
wp_nav_menu_objects<\/code> nos itens do menu j\u00e1 ordenados e \u00e9 exatamente a\u00ed que vamos atuar. Coloque o seguinte c\u00f3digo no
functions.php<\/code> do seu tema:<\/p>\n
function wp_nav_menu_objects_submenu_of( $sorted_menu_items, $args ) {\r\n if( isset( $args->submenu_of ) ) {\r\n $menu_item_parents = array(); \/\/ Array que conter\u00e1 os IDs de todos os pais dentro do submenu\r\n foreach( $sorted_menu_items as $key => $item ) {\r\n if( $item->object_id == (int) $args->submenu_of ) { \/\/ O ID que passamos \u00e9 o primeiro pai\r\n \t$menu_item_parents[] = $item->ID;\r\n }\r\n\r\n if( in_array( $item->menu_item_parent, $menu_item_parents ) ) { \/\/ Se o pai do item sendo verificado est\u00e1 no nosso array ele fica e o id dele entra no nosso array de pais...\r\n $menu_item_parents[] = $item->ID;\r\n } else { \/\/ ...caso contr\u00e1rio ele \u00e9 removido\r\n unset( $sorted_menu_items[ $key ] );\r\n }\r\n }\r\n }\r\n return $sorted_menu_items;\r\n}\r\nadd_filter( 'wp_nav_menu_objects' , 'wp_nav_menu_objects_submenu_of', 10, 2 ); <\/code><\/pre>\n
wp_nav_menu( array(\r\n\t'theme_location' => 'primary',\r\n\t'submenu_of' => get_the_ID(), \/\/ Passando o ID da p\u00e1gina atual\r\n) ); <\/code><\/pre>\n
add_filter<\/code> associamos nossa fun\u00e7\u00e3o ao filtro
wp_nav_menu_objects<\/code>, assim todo menu exibido atrav\u00e9s da fun\u00e7\u00e3o
wp_nav_menu()<\/code> passar\u00e1 por ela. O primeiro passo \u00e9 verificar se o par\u00e2metro
submenu_of<\/code> foi passado na chamada da fun\u00e7\u00e3o, caso afirmativo fazemos nossa m\u00e1gica, sen\u00e3o passamos a vari\u00e1vel como veio. O importante dos filtros \u00e9 sempre retornar alguma coisa, ok?<\/p>\n
$item->ID<\/code>) e o ID do conte\u00fado associado a ele (
$item->object_id<\/code>). Por exemplo: temos um post com ID 5 (
get_the_ID()<\/code> e
$item->ID<\/code> seria 5), mas o seu ID no menu principal do site \u00e9 12 (
$item->object_id == 12<\/code>). Precisamos ent\u00e3o exibir todos os itens de menu que tem
menu_item_parent<\/code> 12 e n\u00e3o trabalhamos em nada mais com o 5. O \u00fanico ID do conte\u00fado que temos \u00e9 o que foi passado pelo par\u00e2metro
submenu_of<\/code>, mas a rela\u00e7\u00e3o dos submenus \u00e9 baseada na propriedade
menu_item_parent<\/code>, que aponta para o ID do item do menu. Da\u00ed por diante vamos andando pelos itens coletando seus IDs e testando se eles s\u00e3o pais de outros elementos. Como cada novo elemento pode ser pai de outros, juntamos todos esses IDs para testar os pr\u00f3ximos elementos. Deu pra entender?<\/p>\n