wp_get_nav_menu_items () funktioniert nicht mit slug

9

Nach dem docs , wp_get_nav_menu_items()Parameter 1 akzeptiert

(string) (Required) Menu name, ID, or slug.

So registriere ich meine Menüs

register_nav_menus(
    array(
        'primary' => 'Navigation primaire',
        'secondary' => 'Navigation secondaire',
    )
);

Hier ist, wie ich versucht habe, eine zu laden

var_dump( wp_get_nav_menu_items('primary') );             // bool(false)
var_dump( wp_get_nav_menu_items('navigation-primaire') ); // bool(false)
var_dump( wp_get_nav_menu_items('Navigation primaire') ); // bool(false)

var_dump( wp_get_nav_menu_items(51) );                      // array([...]) (correct)

Die Funktion gibt das Menü also nur zurück, wenn ich die ID verwende. Ich würde den Slug viel lieber verwenden, da meine Website mehrsprachig ist und ich nicht je nach Sprache unterschiedliche IDs verwenden möchte.

Mache ich etwas falsch oder ist das ein Kernfehler? Ich habe dies beim TwentySixteen-Thema mit deaktiviertem mehrsprachigen Plugin (Polylang) versucht.

irgendwo anders
quelle

Antworten:

14

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

primaryist nicht die Schnecke. my-primary-navist 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;

}
JoeMoe1984
quelle
2

Kleine Änderung an der akzeptierten Antwort

Nachdem Sie ein Menü aus dem Menü entfernt haben, $locations[ $menu_slug ]kehren 0Sie zurück. Fügen Sie daher diese Prüfung hinzu:

function get_menu_items_by_registered_slug($menu_slug) {
  $menu_items = array();

  if ( ($locations = get_nav_menu_locations()) && isset($locations[$menu_slug]) && $locations[$menu_slug] != 0 ) {
    $menu = get_term( $locations[ $menu_slug ] );
    $menu_items = wp_get_nav_menu_items($menu->term_id);
  }

  return $menu_items;
}
Narek Malkhasyan
quelle
0

Versuche dies:

    $menu_name = 'primary'; 

    if ( ( $locations = get_nav_menu_locations() ) && isset( $locations[ $menu_name ] ) ) {
        $menu = wp_get_nav_menu_object( $locations[ $menu_name ] );

        $menu_items = wp_get_nav_menu_items($menu->term_id);
        // Your output code
    }
Ignat B.
quelle
Könnten Sie ein wenig erklären, warum Ihre Antwort funktionieren würde?
cjbj
Scheint bei mir nicht zu funktionieren. get_nav_menu_locations()Gibt ein Array mit einem einzelnen Element ( 'primary' => 51) zurück, gibt jedoch wp_get_nav_menu_items()false zurück, wenn ein Slug verwendet wird.
Jemand
Ich habe gerade festgestellt, dass ich das Array von get_nav_menu_locations () verwenden kann, um das richtige Menü pro Sprache zu laden, ohne Konstanten definieren zu müssen. Vielen Dank, dass Sie mich auf die Funktion aufmerksam gemacht haben.
Jemand
0
custom_menu('primary');

function custom_menu( $theme_location ) {
if ( ($theme_location) && ($locations = get_nav_menu_locations()) && isset($locations[$theme_location]) ) {
    $menu = get_term( $locations[$theme_location], 'nav_menu' );
    $menu_items = wp_get_nav_menu_items($menu->term_id);
    //your menu code.
}
Abuzer Killibacak
quelle