Como exibir apenas um submenu no WordPress

Em sites muito grandes, muitas vezes precisamos exibir apenas um submenu, uma parte do menu principal, igualzinho como na navegação, mas sem criar um novo menu, afinal quanto menos coisas para gerenciar melhor. Não seria ideal se a função wp_nav_menus do WordPress aceitasse um parâmetro que restringisse todo um menu a apenas uma parte dele? Pois bem, através dos hooks no WordPress podemos criar este parâmetro com facilidade.

O código abaixo é adaptado de uma resposta no stackflow. A função wp_nav_menus() aplica o filtro wp_nav_menu_objects nos itens do menu já ordenados e é exatamente aí que vamos atuar. Coloque o seguinte código no functions.php do seu tema:

 function wp_nav_menu_objects_submenu_of( $sorted_menu_items, $args ) {
    if( isset( $args->submenu_of ) ) {
        $menu_item_parents = array(); // Array que conterá os IDs de todos os pais dentro do submenu
        foreach( $sorted_menu_items as $key => $item ) {
            if( $item->object_id == (int) $args->submenu_of ) { // O ID que passamos é o primeiro pai
            	$menu_item_parents[] = $item->ID;
            }

            if( in_array( $item->menu_item_parent, $menu_item_parents ) ) { // Se o pai do item sendo verificado está no nosso array ele fica e o id dele entra no nosso array de pais...
                $menu_item_parents[] = $item->ID;
            } else { // ...caso contrário ele é removido
                unset( $sorted_menu_items[ $key ] );
            }
        }
    }
    return $sorted_menu_items;
}
add_filter( 'wp_nav_menu_objects' , 'wp_nav_menu_objects_submenu_of', 10, 2 ); 

Para exibir o menu use:

 wp_nav_menu( array(
	'theme_location' => 'primary',
	'submenu_of'     => get_the_ID(), // Passando o ID da página atual
) ); 

Com a chamada para add_filter associamos nossa função ao filtro wp_nav_menu_objects, assim todo menu exibido através da função wp_nav_menu() passará por ela. O primeiro passo é verificar se o parâmetro submenu_of foi passado na chamada da função, caso afirmativo fazemos nossa mágica, senão passamos a variável como veio. O importante dos filtros é sempre retornar alguma coisa, ok?

Os itens do menu possuem dois IDs diferentes: o ID do item do menu ($item->ID) e o ID do conteúdo associado a ele ($item->object_id). Por exemplo: temos um post com ID 5 (get_the_ID() e $item->ID seria 5), mas o seu ID no menu principal do site é 12 ($item->object_id == 12). Precisamos então exibir todos os itens de menu que tem menu_item_parent 12 e não trabalhamos em nada mais com o 5. O único ID do conteúdo que temos é o que foi passado pelo parâmetro submenu_of, mas a relação dos submenus é baseada na propriedade menu_item_parent, que aponta para o ID do item do menu. Daí por diante vamos andando pelos itens coletando seus IDs e testando se eles são pais de outros elementos. Como cada novo elemento pode ser pai de outros, juntamos todos esses IDs para testar os próximos elementos. Deu pra entender?

Entender o que são hooks é fundamental para soluções limpas dentro do WordPress. Agora que você já viu como eles ajudam a exibir só uma parte de um menu, quer ver como eles auxiliam na customização de widgets?

Tags:

Comentários