it-swarm.com.de

wp_get_nav_menu_items () funktioniert nicht mit slug

Laut docs akzeptiert wp_get_nav_menu_items() Parameter 1

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

Daher gibt die Funktion das Menü nur zurück, wenn ich die ID verwende. Ich würde den Slug lieber verwenden, da meine Website mehrsprachig ist und ich nicht abhängig von der Sprache unterschiedliche IDs verwenden möchte.

Mache ich etwas falsch oder ist das ein Kernfehler? Ich habe es mit dem TwentySixteen-Thema versucht, wobei mein mehrsprachiges Plugin deaktiviert war (Polylang).

6
Brian

Da niemand wirklich erklärt hat, warum die Funktion nicht so funktioniert, wie Sie es sich vorgestellt haben, werde ich sie ausführlich erläutern, da ich mich in dieselbe Falle wie Sie verliebt habe.

Hier ist den Dokumenten nicht wirklich klar, worauf sich der Slug bezieht. Die meisten Leute würden davon ausgehen, dass es sich um das registrierte Menü handelt, aber das ist nicht korrekt. Es ist eigentlich die Bezeichnung für die Taxonomie nav_menu.

Tauchen wir in den Quellcode ein, 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 es eine Funktion mit dem Namen wp_get_nav_menu_object () verwendet, 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 für wp_get_nav_menu_object() eintauchen.

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 Funktion get_term_by verwendet, um den $menu_obj abzurufen. Hier bekommen wir unsere Speisekarte.

Wenn Sie im Wordpress-Administrationsbereich ein Menü erstellen, wird ein neuer Begriff erstellt. Begriffe haben Schnecken aus 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, dies ist jedoch nicht der Punkt, auf den sich diese Funktionen beziehen. Es ist eigentlich der Menübegriff Schnecke.

Nehmen wir einfach an, Sie haben ein Menü wie das folgende registriert:

register_nav_menu('primary', 'my primary nav');

primary ist nicht die Schnecke. my-primary-nav ist auch nicht die Schnecke.

Da wir ein Menü mit dem Namen "My Awesome Menu" (als Beispiel) 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 Website oder sogar eine Website mit mehreren Websites verwenden, ist diese Methode nicht die beste Lösung. Da der Name und die Schnecke möglicherweise unterschiedlich sein könnten.

Die beste Methode ist es also, alle Menüpositionen mit get_nav_menu_locations() abzurufen, wodurch ein assoziatives Array zurückgegeben wird, bei dem die Taste 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 die Term-Informationen abrufen und dann den richtigen Slug zurückgeben, den die Funktion benötigt.

Im Folgenden finden Sie eine Funktion, die die Funktion wp_get_nav_items() verwendet, Sie jedoch den registrierten Menü-Slug übergeben würden. In Ihrem Fall wäre dies "primär".

Code-Lö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;

}
12
JoeMoe1984

Kleine Änderung an der akzeptierten Antwort

Nachdem Sie ein Menü aus dem Menü entfernt haben, gibt $locations[ $menu_slug ]0 zurück. Es empfiehlt sich daher, die folgende Prüfung hinzuzufügen:

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;
}
1
Narek

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
    }
0
Ignat B.
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.
}
0