Como codificar itens de menu personalizados de código

22

Existe alguma maneira que eu possa codificar os itens de menu personalizados quando o primeiro tema instalado? Eu estou criando um tema que automaticamente fará algumas páginas comuns quando instalado. Então 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 códice é bem-vindo. Obrigado!

update: tentou o código daqui Segmentando menu específico 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 de modelos:

<?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 );

quando adicionar o código para adicionar novos itens no menu de navegação em functions.php o arquivo nocautes acontece na página de menu no painel de administração, mas os itens de menu atuais desapareceram no site!

    
por Sisir 23.04.2011 / 18:24
fonte

4 respostas

23

O problema com o seu código é que não está realmente adicionando os links para o menu e apenas para a saída do menu, daí o uso de um filtro (add_filter) para que você esteja apenas filtrando a saída do menu de fato mesmo se você não tem 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);
}

Comentei tudo para simplificar.

Para criar um menu de página infantil / subpágina / segundo nível (como você pode chamá-lo), basta definir menu-item-parent-id no 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,
    ));

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

  • Primeiro item - 'item-item-menu' = > 1
    • Primeiro item do primeiro filho - 'item-item-menu' = > 1
    • Primeiro item do segundo filho - 'menu-item-position' = > 1
      • Primeiro item segundo filho primeiro filho - 'menu-item-position' = > 1
  • Segundo item - 'item-item-de-menu' = > 2
  • 3º item - 'item-item-de-menu' = > 3
  • 4º item - 'item-item-menu' = > 4
por Bainternet 24.04.2011 / 05:03
fonte
7

Seu código original está muito próximo do dinheiro e eu realmente acho que a longa solução da @Bainternet (sem ofensa) é um exagero, então 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 é que você não estava retornando $ items após a função ter sido selecionada para o menu correto, e estava faltando o segundo argumento de retorno de chamada necessário para fazer a verificação ( $ args ).

    
por Foxinni 01.08.2012 / 12:43
fonte
1

Existe um erro no Wordpress 3.4.2:

enlace

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');
}

Veja enlace para ver um exemplo da classe Menu para criar menus simples.

    
por OzzyCzech 26.11.2012 / 15:29
fonte
0

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

    
por Grégocentrique 02.08.2013 / 15:43
fonte

Tags