Cómo codificar los elementos del menú personalizado

22

¿Hay alguna forma de que pueda codificar los elementos de menú personalizados cuando se instala el primer tema? Estoy creando un tema que automáticamente creará algunas páginas comunes cuando se instale. ¿Entonces necesito saber si también puedo agregarlos al menú personalizado de Wordpress para que el cliente no tenga que agregarlos manualmente?

En otras palabras: ¿cómo insertar / crear un elemento de menú personalizado mediante programación?

Déjame saber si algo no está claro. La guía a la página apropiada del códice es bienvenida. Gracias!

actualización: probé el código desde aquí Menú específico de orientación con wp_nav_menu_items

Registro de menú:

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

add_action( 'init', 'register_my_menus' );

Uso de la plantilla:

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

Código para agregar nuevos elementos:

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

cuando agregue el código para agregar nuevos elementos en el menú de navegación en functions.php nothings file sucede en la página del menú en el panel de administración, ¡pero los elementos del menú actual desaparecieron en el sitio!

    
pregunta Sisir 23.04.2011 - 18:24

4 respuestas

23

El problema con su código es que en realidad no agrega los enlaces al menú y solo a la salida del menú, por lo tanto, se utiliza un filtro (add_filter), por lo que solo está filtrando la salida del menú, incluso si Si no tiene un menú, su enlace se mostrará con el código que está utilizando. Pero para crear un enlace y agregarlo a un menú, puede 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);
}

Comenté todo para simplificarlo.

Para crear un menú de página secundaria / subpágina / segundo nivel (como pueda llamarlo), solo necesita establecer menu-item-parent-id en el nuevo elemento, por ejemplo:

//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,
    ));

también puede establecer la posición por código con menu-item-position y creo que se hace así:

  • Primer elemento: 'menu-item-position' = > 1
    • Primer elemento del primer elemento: 'menu-item-position' = > 1
    • Segundo elemento del segundo elemento: 'menu-item-position' = > 1
      • Primer elemento Segundo hijo Primer hijo - 'menu-item-position' = > 1
  • Segundo elemento: 'menu-item-position' = > 2
  • 3er elemento - 'menu-item-position' = > 3
  • 4to elemento - 'menu-item-position' = > 4
respondido por el Bainternet 24.04.2011 - 05:03
7

Su código original es muy cercano al dinero y creo seriamente que esta solución larga de @Bainternet (sin ofensas) es excesiva, así que eche un vistazo a esto:

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

Su único problema fue que no estaba devolviendo $ elementos después de que la función verificara el menú correcto, y faltaba el segundo argumento de devolución de llamada que se necesitaba para realizar la comprobación ( $ args ).

    
respondido por el Foxinni 01.08.2012 - 12:43
1

Hay un error en Wordpress 3.4.2:

enlace

Es necesario crear el término relación 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 enlace para ver un ejemplo de la clase de Menú para crear un menú simple.

    
respondido por el OzzyCzech 26.11.2012 - 15:29
0

Para obtener información, el usuario actual tiene que tener derechos para agregar términos, se crearon mi menu_items pero no se agregaron en la tabla wp_terms_relationship antes de agregar una llamada a wp_set_current_user (1);

    
respondido por el Grégocentrique 02.08.2013 - 15:43

Lea otras preguntas en las etiquetas