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.




