Da niemand wirklich erklärt hat, warum die Funktion nicht so funktioniert, wie Sie es gedacht haben, werde ich versuchen, sie ausführlich zu erklären, da ich gerade in dieselbe Falle geraten bin wie Sie.
Hier ist den Dokumenten nicht wirklich klar, worauf sich der Slug bezieht. Die meisten Leute würden annehmen, dass es der Slug des registrierten Menüs ist, aber das ist nicht korrekt. Es ist eigentlich der Slug des Begriffs für die Taxonomie nav_menu.
Lassen Sie uns in den Quellcode eintauchen, um zu sehen, wie der Wordpress-Kern den Slug des Menüs interpretiert.
function wp_get_nav_menu_items( $menu, $args = array() ) {
$menu = wp_get_nav_menu_object( $menu );
....
Die erste Zeile zeigt, dass eine Funktion namens wp_get_nav_menu_object () verwendet wird, um das Menü abzurufen. Es übergibt den $menu
als ersten Parameter an diese Funktion. Da dies das ist, was wir für unsere Schnecke verwenden, müssen wir in die Quelle eintauchen wp_get_nav_menu_object()
.
function wp_get_nav_menu_object( $menu ) {
$menu_obj = false;
if ( is_object( $menu ) ) {
$menu_obj = $menu;
}
if ( $menu && ! $menu_obj ) {
$menu_obj = get_term( $menu, 'nav_menu' );
if ( ! $menu_obj ) {
$menu_obj = get_term_by( 'slug', $menu, 'nav_menu' );
}
if ( ! $menu_obj ) {
$menu_obj = get_term_by( 'name', $menu, 'nav_menu' );
}
}
....
wir können sehen, dass diese Funktion die get_term_by
Funktion verwendet, um die abzurufen $menu_obj
. Hier bekommen wir unsere Speisekarte.
Wenn Sie im Wordpress-Administrationsbereich ein Menü erstellen, wird ein neuer Begriff erstellt. Begriffe, haben Schnecken basierend auf ihrem Namen. Wenn Sie also den Menünamen "My Awesome Menu" haben, generiert Wordpress einen Slug mit dem Namen "my-awesome-menu". Möglicherweise haben Sie das Menü als "primär" registriert, aber das ist nicht der Slug, auf den sich diese Funktionen beziehen. Es ist eigentlich der Menübegriff Slug.
Um klar zu sein, sagen wir einfach, Sie haben ein Menü wie folgt registriert:
register_nav_menu('primary', 'my primary nav');
primary
ist nicht die Schnecke. my-primary-nav
ist auch nicht die Schnecke.
Da wir (als Beispiel) ein Menü mit dem Namen "My Awesome Menu" erstellt haben und der Slug "my-awesome-menu" lautet, können Sie es folgendermaßen abrufen:
$awesome_menu = wp_get_nav_menu_items( 'my-awesome-menu' );
Sie können selbst sehen, was der Slug ist, indem Sie die Datenbank in der Tabelle wp_terms (oder was auch immer Ihr Präfix ist) überprüfen und dort nach Ihrem Menünamen suchen.
Da Sie eine mehrsprachige Site oder sogar eine Multisite verwenden, ist diese Methode nicht der beste Weg, dies zu tun. Da der Name und die Schnecke möglicherweise unterschiedlich sein könnten.
Die beste Methode besteht also darin, alle Menüpositionen abzurufen, mit get_nav_menu_locations()
denen ein assoziatives Array zurückgegeben wird, wobei der Schlüssel der Slug des registrierten Menüs und der Wert die ID des für seine Position ausgewählten Menübegriffs ist.
Mit der Term-ID können wir diese Term-Informationen abrufen und dann den richtigen Slug zurückgeben, den die Funktion benötigt.
Unten finden Sie eine Funktion, die die wp_get_nav_items()
Funktion verwendet, aber Sie würden den registrierten Menü-Slug übergeben. In Ihrem Fall wäre dies "primär".
Codelösung
// kind of a long function name but whatevs
function get_menu_items_by_registered_slug($menu_slug) {
$menu_items = array();
if ( ( $locations = get_nav_menu_locations() ) && isset( $locations[ $menu_slug ] ) ) {
$menu = get_term( $locations[ $menu_slug ] );
$menu_items = wp_get_nav_menu_items($menu->term_id);
}
return $menu_items;
}
get_nav_menu_locations()
Gibt ein Array mit einem einzelnen Element ('primary' => 51
) zurück, gibt jedochwp_get_nav_menu_items()
false zurück, wenn ein Slug verwendet wird.quelle