Como codificar itens de menu personalizados


22

Existe alguma maneira de codificar os itens de menu personalizados quando o primeiro tema é instalado? Estou criando um tema que criará automaticamente algumas páginas comuns quando instalado. Então, eu preciso saber se também posso adicioná-los ao menu personalizado do Wordpress para que o cliente não precise adicioná-los manualmente?

Em outras palavras: como inserir / criar item de menu personalizado programaticamente?

Deixe-me saber se algo não está claro. Guia para a página apropriada do codex é bem-vindo. Obrigado!


update: código experimentado a partir daqui Menu específico de segmentação com wp_nav_menu_items

Registro do menu:

function register_my_menus() {
  register_nav_menus(
    array('main-menu' => __( 'Main Menu' ) )
  );
}

add_action( 'init', 'register_my_menus' );

Uso do modelo:

<?php wp_nav_menu( array( 'theme_location' => 'main-menu' ) ); ?>

Código para adicionar novos itens:

function new_nav_menu_items($items) {
    if( $args->theme_location == 'main-menu' ){
    $homelink = '<li class="home"><a href="' . home_url( '/' ) . '">' . __('Home') . '</a></li>';
    $items = $homelink . $items;
    return $items;
    }
}
add_filter( 'wp_nav_menu_items', 'new_nav_menu_items', 10, 2 );

ao adicionar o código para adicionar novos itens no menu nav em functions.phpnada de arquivo, acontece na página de menu no painel de administração, mas os itens de menu atuais desaparecem no site!

Respostas:


23

O problema com o seu código é que ele não está realmente adicionando os links ao menu e apenas a saída do menu, portanto, o uso de um filtro (add_filter); portanto, você está apenas filtrando a saída do menu, mesmo que não o faça Se você tiver um menu, seu link será mostrado com o código que você está usando. Mas, para criar um link e adicioná-lo a um menu, você pode usar este código:

$run_once = get_option('menu_check');
if (!$run_once){
    //give your menu a name
    $name = 'theme default menu';
    //create the menu
    $menu_id = wp_create_nav_menu($name);
    //then get the menu object by its name
    $menu = get_term_by( 'name', $name, 'nav_menu' );

    //then add the actuall link/ menu item and you do this for each item you want to add
    wp_update_nav_menu_item($menu->term_id, 0, array(
        'menu-item-title' =>  __('Home'),
        'menu-item-classes' => 'home',
        'menu-item-url' => home_url( '/' ), 
        'menu-item-status' => 'publish'));

    //then you set the wanted theme  location
    $locations = get_theme_mod('nav_menu_locations');
    $locations['main-menu'] = $menu->term_id;
    set_theme_mod( 'nav_menu_locations', $locations );

    // then update the menu_check option to make sure this code only runs once
    update_option('menu_check', true);
}

Eu comentei todo o texto para simplificar.

Para criar um menu de página secundária / subpágina / segundo nível (como você pode chamá-lo), basta definir menu-item-parent-ido novo item, por exemplo:

//create the top level menu item (home)
$top_menu = wp_update_nav_menu_item($menu->term_id, 0, array( 
    'menu-item-title' =>  __('Home'),
    'menu-item-classes' => 'home',
    'menu-item-url' => home_url( '/' ), 
    'menu-item-status' => 'publish'
    'menu-item-parent-id' => 0,
    ));
//Sub menu item (first child)
$first_child = wp_update_nav_menu_item($menu->term_id, 0, array( 
    'menu-item-title' =>  __('First_Child'),
    'menu-item-classes' => 'home',
    'menu-item-url' => home_url( '/' ), 
    'menu-item-status' => 'publish'
    'menu-item-parent-id' => $top_menu,
    ));
//Sub Sub menu item (first child)
$Second_child = wp_update_nav_menu_item($menu->term_id, 0, array( 
    'menu-item-title' =>  __('Second_Child'),
    'menu-item-classes' => 'home',
    'menu-item-url' => home_url( '/' ), 
    'menu-item-status' => 'publish'
    'menu-item-parent-id' => $first_child,
    ));

Também você pode definir a posição pelo código menu-item-position e eu acho que é feito assim:

  • Primeiro item - 'menu-item-position' => 1
    • Primeiro item primeiro filho - 'menu-item-position' => 1
    • Primeiro item segundo filho - 'menu-item-position' => 1
      • Primeiro item segundo filho primeiro filho - 'menu-item-position' => 1
  • Segundo item - 'menu-item-position' => 2
  • 3º item - 'posição do item de menu' => 3
  • 4º item - 'posição do item de menu' => 4

Essas são as funções que eu estava procurando :) O codex não inclui os seguintes :( Mais uma pergunta, como posso adicionar um item filho ao item Home.
Avisarei

@Sisir: i atualizado com um exemplo de como criar páginas filhas
Bainternet

@Bainternet: recebi esse erro quando o código foi executado pela primeira vez Fatal error: Cannot use object of type stdClass as array in C:\wamp\www\citystir\wp-admin\menu.php on line 25. Mas o menu é criado e, quando a página é atualizada, tudo funciona, mas nada aparece na Appearance -> Menu Theme Locationseção. Estamos muito perto :) Obrigado!
Sisir

@Bainternet: Meu palpite é que o código está recebendo um erro ao tentar executá-lo. $locations = get_theme_mod('nav_menu_locations');Portanto, os códigos anteriores a isso (toda a inserção do menu é concluída) são executados e o código depois (definir a localização do tema desejado) não é executado .
Sisir

@ Sisir: o código está funcionando muito bem, qual é o nome do local do seu tema e me mostre o código exato que você está usando, vou ver se posso ajudar.
Bainternet

8

Seu código original está muito próximo do dinheiro e eu acho seriamente que esta solução longa da @Bainternet (sem ofensa) é um exagero; portanto, dê uma olhada nisso:

function new_nav_menu_items($items, $args) {
    if( $args->theme_location == 'primary' ){
        $homelink = '<li class="home"><a href="' . home_url( '/' ) . '">' . __('Home') . '</a></li>';
        $items = $homelink . $items;
    }
    return $items;
}
add_filter( 'wp_nav_menu_items', 'new_nav_menu_items', 10, 2 );

Seu único problema era que você não retornava $ itens após a função ter verificado o menu correto e estava faltando o segundo argumento de retorno de chamada necessário para fazer a verificação ( $ args ).


Como você definiria a localização do item de menu usando esse método?
Michael N

1

Há um erro no Wordpress 3.4.2:

https://github.com/WordPress/WordPress/commit/ae96b842f9f55ecfb22da705a4902b9d25580259#wp-includes/nav-menu.php

Você precisa criar o termo relação manualmente:

$menu = wp_get_nav_menu_object('top menu');
$id = wp_update_nav_menu_item($menu->term_id, 0, $data);

if ($menu->term_id && (!is_object_in_term($id, 'nav_menu', (int)$menu->term_id))) {
    wp_set_post_terms($id, array((int)$this->id), 'nav_menu');
}

Consulte https://gist.github.com/4148529 para obter um exemplo da classe Menu para criação simples de menus.


0

Para obter informações, o usuário atual tem direitos para adicionar termos, meus itens de menu foram criados, mas não foram adicionados na tabela wp_terms_relationship antes de adicionar uma chamada a wp_set_current_user (1);

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.