Por meio das funções da API, desejo definir um novo menu de navegação , selecioná-lo no tema atual e inserir algumas páginas como itens de menu. Isso deve ser feito, por exemplo, em uma ativação de tema.
Por meio de um processo (moderadamente doloroso) de engenharia reversa, o banco de dados insere e atualiza após a configuração manual do menu e dos itens de Navegação. estou criando:
if (!term_exists('footer-nav', 'nav_menu')) {
$menu = wp_insert_term('Footer nav', 'nav_menu', array('slug' => 'footer-nav'));
// Select this menu in the current theme
update_option('theme_mods_'.get_current_theme(), array("nav_menu_locations" => array("primary" => $menu['term_id'])));
// Insert new page
$page = wp_insert_post(array('post_title' => 'Blog',
'post_content' => '',
'post_status' => 'publish',
'post_type' => 'page'));
// Insert new nav_menu_item
$nav_item = wp_insert_post(array('post_title' => 'News',
'post_content' => '',
'post_status' => 'publish',
'post_type' => 'nav_menu_item'));
add_post_meta($nav_item, '_menu_item_type', 'post_type');
add_post_meta($nav_item, '_menu_item_menu_item_parent', '0');
add_post_meta($nav_item, '_menu_item_object_id', $page);
add_post_meta($nav_item, '_menu_item_object', 'page');
add_post_meta($nav_item, '_menu_item_target', '');
add_post_meta($nav_item, '_menu_item_classes', 'a:1:{i:0;s:0:"";}');
add_post_meta($nav_item, '_menu_item_xfn', '');
add_post_meta($nav_item, '_menu_item_url', '');
wp_set_object_terms($nav_item, 'footer-nav', 'nav_menu');
}
Isso parece funcionar, mas:
- é uma maneira robusta e elegante de fazer isso?
- Estou perdendo algo totalmente óbvio que faria tudo isso em uma linha de código?
menus
navigation
api
julien_c
fonte
fonte
Como complemento ao analisador do ZaMoose, veja como você criaria um item de menu "Tipo de página " (não um item " Personalizado "):
Supondo que você conheça apenas a página lesada, por exemplo.
fonte
Tenho alguns problemas com a resposta aceita - isso não está errado, mas postarei meu próprio código abaixo, que considero que pode ter um resultado melhor para algumas pessoas, já que tive a mesma pergunta, mas queria fazer o mesmo coisa com menos código.
Primeiro, o código acima cria itens de navegação do tipo "URL", o que é bom para algumas pessoas, mas eu quero vincular a PAGES, não URLs, porque esse é um recurso importante das navegações do WordPress e os clientes inevitavelmente movem as coisas para que eu nunca use o URL tipo de item de navegação.
Além disso, apenas uma matriz plana de filhos é tratada pelo código publicado. Eu criei uma função para declarar recursivamente os novos itens de navegação, armazenando os metadados retornados (principalmente o ID após serem criados no loop) e um parâmetro para aceitar filhos.
Basta editar
$nav_items_to_add
e o restante é tratado recursivamente. Existem 3 chaves necessárias em cada matriz. Primeiro, a chave da matriz é a lesma, assim'shop' => array( ... )
como o que você deseja para uma página com a lesmashop
.['title']
é a maneira como o item de navegação será identificado no front end.path
é o caminho para a página dentro da hierarquia de páginas do WordPress; portanto, isso é idêntico à lesma se a página for um pai de nível superior e, seshop
fosse filhahome
, seria'path' => 'home/shop'
.A última chave opcional da matriz é
['parent']
onde você pode declarar outra chave na matriz como pai da atual. É importante observar que os itens são adicionados recursivamente, para que o pai precise existir antes de tentar criar um filho. Isso significa que a declaração deve acontecer para o item de navegação pai antes de ser filho.fonte
Para adicionar um item de menu programaticamente. você pode conectar ao
wp_nav_menu_items
filtro. coloque o código abaixo em seu tema functions.php para adicionar o item de menu Login / Logout no menu principal. 'Primário' é o nome / ID do menu registrado.fonte