Ändern Sie den Namen einer Li-class in einem benutzerdefinierten Walker für WordPress

Ich baue ein Nav, das eine class auf die Haupt-LI’s und die verschachtelten LI’s angewendet hat. Beispiel:

  • Test
  • Test
    • test
    • test

Ich habe herausgefunden, wie man classn für die ULs und alle LI’s bekommt, aber ich kann herausfinden, wie man eine andere class für die verschachtelten LI’s bekommt.

Hier ist meine benutzerdefinierte Walker:

Dies ändert die UL-class des Nestes

  class My_Walker_Nav_Menu extends Walker_Nav_Menu { function start_lvl(&$output, $depth) { $indent = str_repeat("\t", $depth); $output .= "\n$indent

Dadurch werden alle Fremd-WordPress-classn entfernt und das classn-Nav-Haupt-Element wird zu allen Li’s hinzugefügt

  public function start_el( &$output, $item, $depth, $args ) { $attributes = ''; ! empty ( $item->attr_title ) // Avoid redundant titles and $item->attr_title !== $item->title and $attributes .= ' title="' . esc_attr( $item->attr_title ) .'"'; ! empty ( $item->url ) and $attributes .= ' href="' . esc_attr( $item->url ) .'"'; $attributes = trim( $attributes ); $title = apply_filters( 'the_title', $item->title, $item->ID ); $item_output = "$args->before$args->link_before$title" . "$args->link_after$args->after"; // Since $output is called by reference we don't need to return anything. $output .= $indent . '

Ich kann einfach nicht herausfinden, wie man die class auf den verschachtelten LI’s ändert. Nichts, was ich getan habe, hat funktioniert. Irgendwelche Tipps?

Solutions Collecting From Web of "Ändern Sie den Namen einer Li-class in einem benutzerdefinierten Walker für WordPress"

Fehlerbehebung

Durch das Aktivieren der WP_DEBUG Konstante in wp-config.php die folgenden Fehler wp-config.php :

– functionsunterschriften

Wenn Strikte Standards aktiviert sind, wird ein Fehler angezeigt, der inkompatible Methodensignaturen aufführt. Obwohl nicht unbedingt notwendig, möchte ich so viele Fehler wie möglich eliminieren. Um dies zu korrigieren, müssen die Walker_Nav_Menu der neuen Walker_Nav_Menu class den start_el() und start_lvl() der class Walker_Nav_Menu , so dass die neue class als Ersatz für die Walker_Nav_Menu class Walker_Nav_Menu , ohne alle möglichen Parameter / argumentbezogene Fehler.

Dies:

 class Wpse_145991_Walker_Nav_Menu extends Walker_Nav_Menu { function start_lvl( &$output, $depth ) { //... } public function start_el( &$output, $item, $depth, $args ) { //... } } 

sollte das werden:

 class Wpse_145991_Walker_Nav_Menu extends Walker_Nav_Menu { function start_lvl( &$output, $depth = 0, $args = array() ) { //... } function start_el( &$output, $item, $depth = 0, $args = array(), $id = 0 ) { //... } } 

Notice: Undefined variable: indent

In der Nähe der neuen Methode start_el() der neuen class sehen Sie die Zeile

 $output .= $indent . ' 

$indent wird jedoch nie innerhalb der Methode definiert. Walker classn neigen dazu, eine $indent Variable für die Formatierung von HTML-Leerstellen auf eine Anzahl von $depth Tab-Zeichen zu setzen. Es ist nicht funktional relevant, aber das kann korrigiert werden, indem man $indent irgendwo vor der oben genannten Zeile definiert:

 $indent = str_repeat("\t", $depth); 

Zu diesem Zeitpunkt sollte die in der Frage angegebene Implementierung ein Menü erstellen, ohne dass Fehler oder Warnungen ausgegeben werden.


Angeben verschiedener classn für verschiedene Tiefen

Theorie

Wenn ein Walker_Nav_Menu wird, wird den beiden Methoden start_el() und start_lvl() ein $depth Argument übergeben, das als repräsentativ für die Anzahl der “levels”, “submenüs” oder

    -Elemente angesehen werden kann das aktuelle Element und das Datenstammverzeichnis (dh das oberste

      -Element.

      Walker_Nav_Menu $ depth Parameter

      Implementierung

      Durch bedingtes Verzweigen basierend auf dieser $depth können Sie verschiedene classn für verschiedene Elemente und Ebenen zuweisen. Wenn Sie beispielsweise einen switch , können Sie die classn für jedes Element und jede Stufe feineinstellen:

       class Wpse_145991_Walker_Nav_Menu extends Walker_Nav_Menu { function start_lvl( &$output, $depth = 0, $args = array() ) { $indent = str_repeat( "\t", $depth ); // Select a CSS class for this `
        ` based on $depth switch( $depth ) { case 0: // Top-level submenus get the 'nav-main-sub-list' class $class = 'nav-main-sub-list'; break; case 1: case 2: case 3: // Submenus nested 1-3 levels deep get the 'nav-other-sub-list' class $class = 'nav-other-sub-list'; break; default: // All other submenu `
        `s receive no class break; } // Only print out the 'class' attribute if a class has been assigned if( isset( $class ) ) $output .= "\n$indent
        \n"; else $output .= "\n$indent
        \n"; } function start_el( &$output, $item, $depth = 0, $args = array(), $id = 0 ) { $indent = str_repeat("\t", $depth); $attributes = ''; ! empty ( $item->attr_title ) // Avoid redundant titles and $item->attr_title !== $item->title and $attributes .= ' title="' . esc_attr( $item->attr_title ) .'"'; ! empty ( $item->url ) and $attributes .= ' href="' . esc_attr( $item->url ) .'"'; $attributes = trim( $attributes ); $title = apply_filters( 'the_title', $item->title, $item->ID ); $item_output = "$args->before$args->link_before$title" . "$args->link_after$args->after"; // Select a CSS class for this `
      • ` based on $depth switch( $depth ) { case 0: // Top-level `
      • `s get the 'nav-main-item' class $class = 'nav-main-item'; break; default: // All other `
      • `s receive no class break; } // Only print out the 'class' attribute if a class has been assigned if( isset( $class ) ) $output .= $indent . '
      • '; else $output .= $indent '
      • '; $output .= apply_filters( 'walker_nav_menu_start_el', $item_output, $item, $depth, $args ); } }