web-dev-qa-db-de.com

Die Verwendung eines Strings anstelle der Instanziierung von Objektklassen für das Argument walker unterbricht das Menü wp_nav_menu

Ich versuche, das Argument walker von new My_Walker_Nav_Menu() durch eine Zeichenfolge 'My_Walker_Nav_Menu' in diesem Aufruf von wp_nav_menu zu ersetzen (das funktioniert wie es ist).

wp_nav_menu(
     array(
           'theme_location'    => 'header_nav',
           'menu_class'             => 'main-menu',
           'container'         => '',
           'fallback_cb'       => false,
           'walker' => new My_Walker_Nav_Menu()
           )
     );

Wenn ich es in eine Zeichenfolge ändere, erhalte ich den folgenden Fehler: Fatal error: Using $this when not in object context

Der Unterricht ist einfach:

class My_Walker_Nav_Menu extends Walker_Nav_Menu {
    function start_lvl(&$output, $depth = 0, $args = Array()) {
        $indent = str_repeat("\t", $depth);
        if('header_nav' == $args->theme_location ){
            $output .='<span class="toggle-submenu fa fa-angle-down"></span>';
        }
        $output .= "\n$indent<ul class=\"sub-menu\">\n";
    }
}

Ich muss dies tun, weil anscheinend die teilweise Aktualisierung des Customizers bei benutzerdefinierten Walkern nicht funktioniert.

Wenn der Customizer feststellt, dass keine Teilaktualisierung durchgeführt werden kann, wird eine vollständige Seitenaktualisierung durchgeführt. Zu den Bedingungen für eine vollständige Seitenaktualisierung bei einer Menüänderung gehören:

...

  • oder wenn wp_nav_menu () mit einer Walker-Objektinstanz im Gegensatz zu einer Klassennamenzeichenfolge aufgerufen wird;

Jemand anderes hatte dieses Problem (in einem Kommentar erwähnt), bekam aber keine Antwort. Ich habe die Dokumente durchsucht, kann aber anscheinend nichts finden.

Jede Hilfe wird sehr geschätzt.

3
Mihai

Anscheinend werden benutzerdefinierte Navigationsmenüwanderer nicht unterstützt, obwohl dies eigentlich vorgesehen war. Ich bin überrascht, dass dies erst jetzt entdeckt wurde. Es gibt jedoch eine einfache Lösung, mit der Sie sie zum Laufen bringen können. Fügen Sie dies einfach zu Ihrem Thema hinzu:

add_filter( 'wp_nav_menu_args', function( $args ) {
    if ( isset( $args['walker'] ) && is_string( $args['walker'] ) && class_exists( $args['walker'] ) ) {
        $args['walker'] = new $args['walker'];
    }
    return $args;
}, 1001 ); // 1001 because \WP_Customize_Nav_Menus::filter_wp_nav_menu_args() runs at 1000.

Mit dem folgenden Kern-Patch wird dieser Filter nicht mehr benötigt:

--- src/wp-includes/nav-menu-template.php
+++ src/wp-includes/nav-menu-template.php
@@ -526,6 +526,9 @@ function _wp_menu_item_classes_by_context( &$menu_items ) {
  */
 function walk_nav_menu_tree( $items, $depth, $r ) {
    $walker = ( empty($r->walker) ) ? new Walker_Nav_Menu : $r->walker;
+   if ( is_string( $walker ) && class_exists( $walker ) ) {
+       $walker = new $walker();
+   }
    $args = array( $items, $depth, $r );

    return call_user_func_array( array( $walker, 'walk' ), $args );
3
Weston Ruter