Categorias: PHP

Tags: Menu

Menu de Categorias Automático

Escrito por Amanda de Lavra

23 de dezembro de 2019

Para este blog, eu queria criar um menu no rodapé só de categorias. O problema é que, cada vez que acrescentasse uma categoria, iria precisar atualizar o menu. Decidi então descobrir se era possível que esse menu fosse atualizado automaticamente cada vez uma nova categoria fosse criada.

Descobri um plugin chamado JC Submenu, mas que não funcionou. Tentei então, eu mesma criar um código que gerasse esse menu automático.

Pesquisando o Codex do WordPress, achei a função wp_update_nav_menu_item ($menu_id, $menu_db_id = 0, $args). O principal problema foi que sem condicionantes, a cada atualização de página, geravam-se novos itens de menu duplicados. Então, como fazer para que só novas categorias fossem acrescentadas e não todas repetidamente?

A solução foi comparar as ids das categorias com a ‘menu-item-object-id’, mas para a comparação fazer sentido, era necessário que as arrays de categorias e itens de nav-menu estivessem na mesma ordem. O padrão da função get_categories é ordenar por ‘name’ e da função wp_get_nav_menu_items é por ‘menu_order’, sendo então necessário alterar o ‘orderby’ para ‘term_id’ e ‘ID’ respectivamente.

Abaixo está o código ao qual eu cheguei:

//cria itens de menu automaticamente a partir das categorias
function autopopular_menu_categoria() { 
	
	$categorias = get_categories(array('exclude' => '1', 'orderby' => 'term_id'));
	$navitens = wp_get_nav_menu_items(9, array('orderby' => 'ID'));
	$total_cat = count($categorias);
	$total_nav = count($navitens);
    
    if ($total_cat > $total_nav) {

    	for ($i = 0; $i < $total_cat; $i++) {

			if ($categorias[$i]->term_id != $navitens[$i]->object_id) {
				wp_update_nav_menu_item(9, 0, array(
					'menu-item-title' => $categorias[$i]->name,
				  	'menu-item-object-id' => $categorias[$i]->term_id,
				  	'menu-item-db-id' => 0,
			    		'menu-item-object' => 'category',
			    		'menu-item-depth' => 1,
			    		'menu-item-type' => 'taxonomy',
			    		'menu-item-url' => get_category_link($categorias[$i]->term_id),
			    		'menu-item-status' => 'publish',)
				);
    		}
    	}
    }
}
add_filter( 'init', 'autopopular_menu_categoria', 10);

Por fim, deu certo, mas ainda tinha um problema: o menu gerado não estava ordenado alfabeticamente, mas por ordem de criação das categorias. Esse problema eu não consegui sanar, então decidi ser prática e usar um widget de categorias no rodapé, ao invés de um menu. Não é bem o que eu queria, mas penso ser a melhor opção.

Fica aqui nesse post o código para registro.

Atualizado em 17/09/2022:

Encontrei um plugin que cumpre essa função. O nome dele é “Automatically Hierarchic Categories in Menu“. Ele é bem simples de usar, porém deu um erro quando tentei criar um menu com post tags, pois ele não insere /tag/ no link, mas funciona perfeitamente com categorias.

Posts relacionados

Customizações da página de login e painel administrativo do WordPress

Customizações da página de login e painel administrativo do WordPress

Para todo o site que eu faço, personalizo a página de login e também o wp-admin para ficar com a marca do cliente. Recentemente, aperfeiçoei o código para que o login ficasse no meio da página, tanto verticalmente quanto horizontalmente. Segue código usado aqui neste...

Aviso de Coming Soon quando não há posts no Blog no Elementor

Aviso de Coming Soon quando não há posts no Blog no Elementor

O cliente queria um blog no site, mas não tinha nenhum conteúdo ainda para publicar, por isso, pediu para que aparecesse Coming Soon! no lugar dos posts. O módulo Posts do Elementor não dá a opção de personalizar a mensagem quando não há posts na query. Simplesmente...

Remover Post Type Projects

Remover Post Type Projects

Eu estava fazendo um site que usaria o tipo de post nativo do Divi que é o Projeto, mas depois a agência mudou de ideia e achei melhor retirar completamente o post type do site. Achei um tutorial em:...