Cum să adaugi manual elemente în meniul personalizat

23 apr. 2011, 19:24:11
Vizualizări: 44.4K
Voturi: 23

Există vreo modalitate prin care pot adăuga manual elementele meniului personalizat la prima instalare a temei? Creez o temă care va genera automat câteva pagini comune la instalare. Așa că trebuie să știu dacă pot să le adaug și în meniul personalizat WordPress astfel încât clientul să nu trebuiască să le adauge manual?

Cu alte cuvinte: cum se pot insera/crea elemente de meniu personalizate programatic?

Anunțați-mă dacă ceva nu este clar. Orice ghid către pagina codex potrivită este binevenit. Mulțumesc!


actualizare: am încercat codul de aici Targetarea meniului specific cu wp_nav_menu_items

Înregistrarea meniului:

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

add_action( 'init', 'register_my_menus' );

Utilizare în șablon:

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

Cod pentru adăugarea elementelor noi:

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

Când adaug codul pentru elementele noi în meniul de navigare în fișierul functions.php nu se întâmplă nimic în pagina de meniu din panoul de administrare, dar elementele curente ale meniului dispar de pe site!

0
Toate răspunsurile la întrebare 4
14
25

Problema cu codul tău este că de fapt nu adaugă linkurile în meniu ci doar în output-ul meniului, de aceea folosești un filtru (add_filter) deci doar filtrezi output-ul meniului. De fapt, chiar dacă nu ai un meniu, linkul tău va fi afișat cu codul pe care îl folosești. Dar pentru a crea un link și a-l adăuga într-un meniu poți folosi acest cod:

$run_once = get_option('menu_check');
if (!$run_once){
    //dă-i un nume meniului tău
    $name = 'meniul implicit al temei';
    //creează meniul
    $menu_id = wp_create_nav_menu($name);
    //apoi obține obiectul meniului după nume
    $menu = get_term_by( 'name', $name, 'nav_menu' );

    //apoi adaugă link-ul efectiv/itemul de meniu și faci asta pentru fiecare item pe care vrei să îl adaugi
    wp_update_nav_menu_item($menu->term_id, 0, array(
        'menu-item-title' =>  __('Acasă'),
        'menu-item-classes' => 'home',
        'menu-item-url' => home_url( '/' ), 
        'menu-item-status' => 'publish'));

    //apoi setezi locația dorită în temă
    $locations = get_theme_mod('nav_menu_locations');
    $locations['main-menu'] = $menu->term_id;
    set_theme_mod( 'nav_menu_locations', $locations );

    // apoi actualizezi opțiunea menu_check pentru a te asigura că acest cod rulează o singură dată
    update_option('menu_check', true);
}

Am adăugat comentarii peste tot pentru a fi mai simplu.

Pentru a crea o pagină copil/sub pagină/meniu de nivel secundar (cum ai vrea să îl numești), trebuie doar să setezi menu-item-parent-id în noul item, de exemplu:

//creează itemul de meniu de nivel superior (acasă)
$top_menu = wp_update_nav_menu_item($menu->term_id, 0, array( 
    'menu-item-title' =>  __('Acasă'),
    'menu-item-classes' => 'home',
    'menu-item-url' => home_url( '/' ), 
    'menu-item-status' => 'publish'
    'menu-item-parent-id' => 0,
    ));
//Item submeniu (primul copil)
$first_child = wp_update_nav_menu_item($menu->term_id, 0, array( 
    'menu-item-title' =>  __('Primul_Copil'),
    'menu-item-classes' => 'home',
    'menu-item-url' => home_url( '/' ), 
    'menu-item-status' => 'publish'
    'menu-item-parent-id' => $top_menu,
    ));
//Item sub-submeniu (al doilea copil)
$Second_child = wp_update_nav_menu_item($menu->term_id, 0, array( 
    'menu-item-title' =>  __('Al_Doilea_Copil'),
    'menu-item-classes' => 'home',
    'menu-item-url' => home_url( '/' ), 
    'menu-item-status' => 'publish'
    'menu-item-parent-id' => $first_child,
    ));

de asemenea poți seta poziția prin cod cu menu-item-position și cred că se face astfel:

  • Primul item - 'menu-item-position' => 1
    • Primul copil al primului item - 'menu-item-position' => 1
    • Al doilea copil al primului item - 'menu-item-position' => 1
      • Primul copil al celui de-al doilea copil - 'menu-item-position' => 1
  • Al doilea item - 'menu-item-position' => 2
  • Al treilea item - 'menu-item-position' => 3
  • Al patrulea item - 'menu-item-position' => 4
24 apr. 2011 06:03:11
Comentarii

Acelea sunt funcțiile pe care le căutam :) codex nu le include pe acestea :( Încă o întrebare, cum pot adăuga un element copil la elementul Home. Vă voi anunța imediat ce ajung la PC. Mulțumesc!

Sisir Sisir
24 apr. 2011 20:42:31

@Sisir: am actualizat cu un exemplu despre cum să creezi pagini copil

Bainternet Bainternet
25 apr. 2011 03:12:57

@Bainternet: am primit această eroare când am rulat codul prima dată Fatal error: Cannot use object of type stdClass as array in C:\wamp\www\citystir\wp-admin\menu.php on line 25. Dar meniul a fost creat și când am reîmprospătat pagina totul funcționează, dar nu apare nimic în secțiunea Appearance -> Menu Theme Location. Suntem foarte aproape :) Mulțumesc!

Sisir Sisir
28 apr. 2011 22:36:24

@Bainternet: Presupun că codul primește o eroare când încearcă să ruleze linia $locations = get_theme_mod('nav_menu_locations'); Așadar, codul dinaintea acestei linii (toată inserarea meniurilor este făcută) este executat, dar codul de după (setarea locației dorite în temă) nu se execută.

Sisir Sisir
28 apr. 2011 22:48:38

@Sisir: codul funcționează perfect, care este numele locației din tema ta și arată-mi exact codul pe care îl folosești, voi încerca să te ajut.

Bainternet Bainternet
29 apr. 2011 03:26:01

@Bainternet: Aici http://pastebin.com/Px16q43a. Am folosit pastebin.

Sisir Sisir
29 apr. 2011 19:35:00

@Sisir: care este numele locației de meniu?

Bainternet Bainternet
29 apr. 2011 21:46:52

am folosit acest cod în meniul de navigare wp_nav_menu( array( 'theme_location' => 'main-menu' ) ); deci presupun că numele locației pentru temă este main-menu, corect?

Sisir Sisir
30 apr. 2011 10:54:09

da, dar tot trebuie să înregistrezi această locație pentru temă folosind register_nav_menu( $location, $description ); înainte de a încerca să atribui un meniu acelei locații.

Bainternet Bainternet
30 apr. 2011 15:04:16

@Bainternet : Mulțumesc! Numele locației temei este acum vizibil. Dar eroarea era încă prezentă până când am pus-o într-o funcție și apoi am adăugat funcția în pagina de opțiuni a temei mele. Acum se va executa doar când butonul este apăsat. Se pare că astfel eroarea a dispărut. Totul funcționează bine acum. Mulțumesc pentru ajutor. Sper să ajungi mereu la întrebările mele ;)

Sisir Sisir
1 mai 2011 14:19:45

Mă bucur că ai reușit.

Bainternet Bainternet
1 mai 2011 17:00:05

@Bainternet: Bună, a trebuit să te deranjez din nou :) Prin funcția wp_update_nav_menu_item() elementele de meniu sunt adăugate ca link personalizat. Există vreo modalitate prin care pot adăuga elemente de meniu de tip post, pagină? Motivul este că acum, când actualizez permalink-ul, linkurile personalizate nu se actualizează. Dar dacă ar fi elemente de meniu de tip pagină, s-ar actualiza automat. Cred că m-am exprimat clar. Mulțumesc!

Sisir Sisir
23 mai 2011 23:50:13

@Bainternet: Salut, atributul menu-item-position trebuie să fie incremental de la elementul de sus al meniului până jos, indiferent dacă există subelemente sau nu. Am găsit asta aici: http://www.acousticwebdesign.net/wordpress/how-to-create-wordpress-3-navigation-menus-in-your-theme-or-plugin-code/.

Clawsy Clawsy
12 mai 2016 09:46:10

Chiar și după 9 ani, informația este încă utilă!

Beee Beee
6 dec. 2020 02:54:57
Arată celelalte 9 comentarii
1
12

Codul tău original este foarte aproape de soluție și cred serios că această soluție lungă oferită de @Bainternet (fără supărare) este exagerată, așa că uită-te la aceasta în schimb:

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

Singura ta problemă a fost că nu returnai $items după ce funcția verifică meniul corect și îți lipsea al doilea argument de callback necesar pentru a face verificarea ($args).

1 aug. 2012 13:43:05
Comentarii

Cum ai seta locația elementului de meniu folosind această metodă?

User User
4 nov. 2014 03:05:11
0

Există o eroare în WordPress 3.4.2:

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

Trebuie să creați relația termenului manual:

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

Consultați https://gist.github.com/4148529 pentru un exemplu al clasei Menu pentru crearea simplă a meniurilor.

26 nov. 2012 16:29:38
0

Pentru informație, utilizatorul curent trebuie să aibă drepturi de a adăuga termeni, elementele mele de meniu au fost create dar nu au fost adăugate în tabelul wp_terms_relationship înainte să adaug un apel la wp_set_current_user(1);

2 aug. 2013 16:43:18