Poprzez funkcje API chcę zdefiniować nowe menu Nawigacji , wybrać je w bieżącym motywie, a następnie wstawić kilka Stron jako elementy menu. Należy to zrobić na przykład podczas aktywacji motywu.
Poprzez (umiarkowanie bolesny) proces inżynierii wstecznej wstawianie i aktualizowanie bazy danych po ręcznym skonfigurowaniu menu i elementów nawigacji, poskładałem następujące kroki, w których „stopka-nawigacja” to identyfikator ślimaka menu nawigacji I ” m tworzę:
if (!term_exists('footer-nav', 'nav_menu')) {
$menu = wp_insert_term('Footer nav', 'nav_menu', array('slug' => 'footer-nav'));
// Select this menu in the current theme
update_option('theme_mods_'.get_current_theme(), array("nav_menu_locations" => array("primary" => $menu['term_id'])));
// Insert new page
$page = wp_insert_post(array('post_title' => 'Blog',
'post_content' => '',
'post_status' => 'publish',
'post_type' => 'page'));
// Insert new nav_menu_item
$nav_item = wp_insert_post(array('post_title' => 'News',
'post_content' => '',
'post_status' => 'publish',
'post_type' => 'nav_menu_item'));
add_post_meta($nav_item, '_menu_item_type', 'post_type');
add_post_meta($nav_item, '_menu_item_menu_item_parent', '0');
add_post_meta($nav_item, '_menu_item_object_id', $page);
add_post_meta($nav_item, '_menu_item_object', 'page');
add_post_meta($nav_item, '_menu_item_target', '');
add_post_meta($nav_item, '_menu_item_classes', 'a:1:{i:0;s:0:"";}');
add_post_meta($nav_item, '_menu_item_xfn', '');
add_post_meta($nav_item, '_menu_item_url', '');
wp_set_object_terms($nav_item, 'footer-nav', 'nav_menu');
}
To wydaje się działać, ale:
- czy to solidny i elegancki sposób na zrobienie tego?
- czy brakuje mi czegoś całkowicie oczywistego, co zrobiłoby to wszystko w jednym wierszu kodu?
menus
navigation
api
julien_c
źródło
źródło
Jako uzupełnienie anwsera ZaMoose, oto jak utworzysz pozycję menu „Typ strony ” (a nie „ niestandardową ”):
Zakładając, że znasz tylko ślimak strony.
źródło
Mam kilka problemów z zaakceptowaną odpowiedzią - to nie jest źle, ale opublikuję własny kod, poniżej którego, moim zdaniem, może być lepszy wynik dla niektórych osób, ponieważ miałem to samo pytanie, ale chciałem zrobić to samo rzecz z mniejszym kodem.
Po pierwsze, powyższy kod tworzy elementy nawigacyjne typu „URL”, co jest w porządku dla niektórych osób, ale chcę link do STRON, a nie adresów URL, ponieważ jest to ważna funkcja nawigacji WordPress, a klienci nieuchronnie przenoszą rzeczy, więc nigdy nie używam adresu URL typ elementu nawigacyjnego.
Ponadto tylko wysłany kod obsługuje tylko płaską tablicę dzieci. Stworzyłem funkcję rekurencyjnego deklarowania nowych elementów nawigacyjnych, przechowywania ich zwróconych metadanych (głównie ID po utworzeniu w pętli) oraz parametr do akceptowania dzieci.
Po prostu edytuj,
$nav_items_to_add
a reszta jest obsługiwana rekurencyjnie. W każdej tablicy są 3 wymagane klucze. Po pierwsze, kluczem tablicy jest ślimak, więc'shop' => array( ... )
to, czego chcesz dla strony ze ślimakiemshop
.['title']
to sposób, w jaki element nawigacyjny zostanie oznaczony na interfejsie.path
jest ścieżką do strony w hierarchii stron WordPress, więc jest to identyczne jak ślimak, jeśli strona jest rodzicem najwyższego poziomu, a jeśli byłabyshop
dzieckiemhome
, byłaby'path' => 'home/shop'
.Ostatni opcjonalny klucz tablicy to miejsce, w
['parent']
którym możesz zadeklarować inny klucz w tablicy jako element nadrzędny bieżącego klucza. Ważne jest, aby pamiętać, że elementy są dodawane rekurencyjnie, więc rodzic musi istnieć przed próbą utworzenia dziecka. Oznacza to, że deklaracja powinna zostać wydana dla nadrzędnego elementu nawigacji, zanim będzie on podrzędny.źródło
Aby dodać pozycję menu Programowo. możesz zaczepić, aby
wp_nav_menu_items
przefiltrować. umieść poniżej kodu w funkcjach motywu. php, aby dodać pozycję menu logowania / wylogowania w menu głównym. „Podstawowy” to nazwa / identyfikator zarejestrowanego menu.źródło