Cum să adaugi manual elemente în meniul personalizat
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!

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

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: am actualizat cu un exemplu despre cum să creezi pagini copil

@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!

@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: 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: Aici http://pastebin.com/Px16q43a. Am folosit pastebin.

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?

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

@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!

@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/.

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

Există o eroare în WordPress 3.4.2:
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.
