In WordPress werden Navigationsmenüs unabhängig von ihrer Position erzeugt und gefüllt. Die Position wird später definiert. Die folgende Prozedur ist eine Möglichkeit, ein Navigationsmenu anzulegen und als Hauptmenü darzustellen:
- Ein neues Navigationsmenü anlegen
$menu_id = wp_create_nav_menu('my-nav-menu');
- Menüeinträge erzeugen, entweder als Hauptmenü ohne Link
$item_id = wp_update_nav_menu_item($menu_id, 0, [
'menu-item-title' => __('main menu', 'textdomain'),
'menu-item-classes' => 'my_class',
'menu-item-url' => '',
'menu-item-parent-id' => 0,
'menu-item-status' => 'publish'
]);
oder als Untermenü mit Link auf eine Seitewp_update_nav_menu_item($menu_id, 0, [
'menu-item-title' => __('submenu', 'textdomain'),
'menu-item-classes' => 'my_other_class',
'menu-item-url' => home_url("/my_page"),
'menu-item-parent-id' => $item_id,
'menu-item-status' => 'publish'
]); - Das Menü an einer der im Theme definierten Positionen anzeigen. Welche Positionen vorhanden sind, hängt vom Theme ab. Die Position „primary” habe ich zwar bisher in jedem Theme gefunden, prüfe es aber trotzdem:
$locations = get_nav_menu_locations();
if (array_key_exists('primary', $locations)) {
$locations['primary'] = $menu_id;
set_theme_mod('nav_menu_locations', $locations);
}
Falls „primary” nicht existiert, muss die Menüposition in der Admin-Oberfläche unter Design -> Menus gesetzt werden.
Das ganze funktioniert unter den herkömmlichen Themes, die noch über die „Design”-Menüs konfiguriert werden.
Ab Twenty Twenty-Two gibt es den „Website-Editor”, und einige Unterpunkte von „Design” sind verschwunden, unter anderem auch „Menus”. Dann lassen sich den Menüs keine Positionen zuordnen und das „primary” Menu ist u.U. nicht sichtbar. Die Funktion get_nav_menu_locations()
liefert ein leeres Array zurück. Eine Lösung dafür habe ich noch nicht gefunden.
Quellen:
- https://developer.wordpress.org/reference/functions/wp_create_nav_menu/
- https://developer.wordpress.org/reference/functions/wp_update_nav_menu_item/
- https://developer.wordpress.org/reference/functions/get_nav_menu_locations/
- https://developer.wordpress.org/reference/functions/set_theme_mod/
- https://wordpress.stackexchange.com/questions/44736/programmatically-add-a-navigation-menu-and-menu-items