Come codificare voci di menu personalizzate


22

Esiste un modo per codificare le voci di menu personalizzate quando viene installato il primo tema? Sto creando un tema che renderà automaticamente alcune pagine comuni una volta installato. Quindi devo sapere se posso anche aggiungerli al menu personalizzato di Wordpress in modo che il client non debba aggiungerli manualmente?

In altre parole: come inserire / creare una voce di menu personalizzata a livello di codice?

Fammi sapere se qualcosa di poco chiaro. La guida alla pagina del codice appropriata è benvenuta. Grazie!


aggiornamento: codice provato da qui Targeting menu specifico con wp_nav_menu_items

Registrazione menu:

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

add_action( 'init', 'register_my_menus' );

Uso del modello:

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

Codice per l'aggiunta di nuovi elementi:

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 si aggiunge il codice per l'aggiunta di nuovi elementi nel menu di navigazione nei functions.phpfile nulla accade nella pagina del menu nel pannello di amministrazione, ma le voci di menu correnti scompaiono nel sito!

Risposte:


23

Il problema con il tuo codice è che in realtà non sta aggiungendo i collegamenti al menu e solo all'output del menu, quindi l'uso di un filtro (add_filter) quindi stai semplicemente filtrando l'output del menu in realtà anche se non lo fai avere un menu il link verrà mostrato con il codice che si sta utilizzando. Ma per creare un collegamento e aggiungerlo a un menu è possibile utilizzare questo codice:

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

Ho commentato dappertutto per renderlo più semplice.

Per creare una pagina figlio / sottopagina / menu di secondo livello (come mai lo si può chiamare), è sufficiente impostare menu-item-parent-idil nuovo elemento, ad esempio:

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

inoltre puoi impostare la posizione per codice con menu-item-position e penso che sia fatto in questo modo:

  • Primo elemento - 'menu-item-position' => 1
    • Primo elemento primo figlio - 'menu-item-position' => 1
    • Primo elemento secondo figlio - 'menu-item-position' => 1
      • Primo elemento secondo figlio primo figlio - 'menu-item-position' => 1
  • Seconda voce - 'menu-item-position' => 2
  • 3a voce - 'menu-item-position' => 3
  • 4a voce - 'menu-item-position' => 4

Queste sono le funzioni che stavo cercando :) il codice non include queste :( Un'altra domanda su come posso aggiungere un elemento figlio all'elemento Home. Ti farò sapere non appena arrivo sul mio PC. Grazie!
Sisir

@Sisir: ho aggiornato con un esempio come creare pagine figlio
Bainternet,

@Bainternet: ottenuto questo errore quando si esegue il codice per la prima volta Fatal error: Cannot use object of type stdClass as array in C:\wamp\www\citystir\wp-admin\menu.php on line 25. Ma il menu viene creato e quando la pagina viene aggiornata tutto funziona ma nella Appearance -> Menu Theme Locationsezione non viene visualizzato nulla . Siamo davvero vicini :) Grazie!
Sisir,

@Bainternet: La mia ipotesi è che il codice stia ricevendo errori quando tenta di eseguire il codice $locations = get_theme_mod('nav_menu_locations');Quindi, i codici precedenti (tutto l'inserimento del menu viene eseguito) vengono eseguiti e il codice successivo (imposta la posizione del tema desiderato) non viene eseguito .
Sisir,

@Sisir: il codice funziona bene, qual è il nome della località del tuo tema e mostrami il codice esatto che stai usando, vedrò se posso aiutarti.
Bainternet,

8

Il tuo codice originale è molto vicino ai soldi e penso seriamente che questa lunga soluzione di @Bainternet (senza offesa) sia eccessiva, quindi dai un'occhiata a questo:

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

Il tuo unico problema era che non stavi restituendo $ items dopo che la funzione controllava il menu corretto e mancava il secondo argomento di callback necessario per effettuare il check ( $ args ).


Come imposteresti la posizione della voce di menu usando questo metodo?
Michael N,

1

C'è un bug in Wordpress 3.4.2:

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

Devi creare manualmente il termine relazione:

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

Vedi https://gist.github.com/4148529 per un esempio della classe Menu per una semplice creazione di menu.


0

Per informazione, l'utente corrente deve ottenere i diritti per aggiungere termini, i miei menu_item sono stati creati ma non aggiunti nella tabella wp_terms_relationship prima di aggiungere una chiamata a wp_set_current_user (1);

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.