J'essaie de remplacer l'argument walker
de new My_Walker_Nav_Menu()
par une chaîne 'My_Walker_Nav_Menu'
dans cet appel wp_nav_menu (qui fonctionne tel quel)
wp_nav_menu(
array(
'theme_location' => 'header_nav',
'menu_class' => 'main-menu',
'container' => '',
'fallback_cb' => false,
'walker' => new My_Walker_Nav_Menu()
)
);
Lorsque je le change en chaîne, j'obtiens cette erreur Fatal error: Using $this when not in object context
Le cours est basique:
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";
}
}
Je dois le faire car apparemment L'actualisation partielle de Customizer ne fonctionne pas avec les marcheurs personnalisés.
Lorsque le personnaliseur détermine qu’il ne peut pas effectuer une actualisation partielle, il procède à une actualisation complète de la page. Les conditions pour lesquelles une modification de menu générera une actualisation complète de la page incluent:
...
- ou si wp_nav_menu () est appelé avec une instance d'objet walker, par opposition à une chaîne de nom de classe;
Quelqu'un d'autre avait ce problème (mentionné dans un commentaire) mais n'a pas eu de réponse. J'ai parcouru la documentation mais je n'arrive pas à trouver quoi que ce soit.
Toute aide est très appréciée.
Apparemment, les marcheurs de menu de navigation personnalisés ne sont pas pris en charge même s'ils étaient censés l'être. Je suis surpris que cela ne soit découvert que maintenant. Cependant, il existe une solution simple pour les faire fonctionner. Ajoutez simplement ceci à votre thème:
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.
Le correctif principal suivant éliminerait la nécessité de ce filtre:
--- 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 );