Sehen Sie sich diese Antwort an, sie erklärt, wie Sie benutzerdefiniertes HTML zu den WordPress-Menüs hinzufügen: https://stackoverflow.com/a/12251157/1627227
BEARBEITEN:
Ich habe ein Beispiel zusammengestellt, das zu Ihrer Frage passt. Sie können es platzieren Funktionen.php. Beachten Sie die Kommentare, sie erklären, wo Sie Ihren benutzerdefinierten Code hinzufügen können.
Nachdem Sie dies eingerichtet haben, müssen Sie zu dem Punkt gehen, an dem Ihr Menü (wp_nav_menu()) wird genannt. In der Antwort, auf die ich verlinkt habe, gibt es den vollständigen Funktionsaufruf wp_nav_menu. Sie müssen jedoch diese Zeile hinzufügen: 'walker' => new Custom_Walker_Nav_Menu in das arguments-Array, um Ihr benutzerdefiniertes Walker-Objekt in diesem bestimmten Menü zu verwenden.
Hoffe du hast es verstanden 😉
Tut mir leid, ich verstehe es nicht. Wo soll ich das “class=”dropdown-toggle” data-toggle=”dropdown”” für ein übergeordnetes Element einfügen? und wo ist das b-tag im link?
– Kräh
31. Oktober 2012 um 17:06 Uhr
Ich habe ein Beispiel hinzugefügt, das die gewünschten Änderungen auf den Code anwendet. Wenn noch etwas unklar ist, sagen Sie mir bitte, ob Sie Ihr Design handcodiert haben oder ob Sie ein heruntergeladenes Design verwenden. Auch der Code erfordert, dass Sie die verwenden WordPress-Menüs und wp_nav_menu um Ihre Menüs aufzurufen.
– Martinczerwi
2. November 2012 um 9:48 Uhr
Ah, vielen Dank! Aber ich brauche die Klasse “Dropdown-Menü” nur in übergeordneten Menüpunkten. Das Attribut “data-toggle=”dropdown”” sollte nur in Links von übergeordneten Menüpunkten auftauchen. Und in diesem Link brauche ich diesen Code: <b class="caret"></b> In dem <ul> des Untermenüs brauche ich die Klasse “Dropdown-Menü” Die Frage ist: Wie kann ich prüfen, ob es ein Untermenü gibt oder ob der Menüpunkt ein übergeordneter Eintrag ist?
– Kräh
2. November 2012 um 16:35 Uhr
Es tut mir wirklich leid, ich habe das Caret übersehen und hatte auch einen Fehler in der HTML-Syntax. Ich habe den Code oben bearbeitet. Ob Sie sich im Hauptmenü befinden, erkennen Sie an der $depth-Variable. $depth ist die Menüebene, für das Hauptmenü ist es 0, je tiefer die Ebene, desto höher die Zahl.
– Martinczerwi
2. November 2012 um 16:55 Uhr
Danke, aber jetzt habe ich die Attribute und Klassen in jedem Element mit Tiefe = 0. Ich brauche sie nur, wenn es ein Untermenü gibt. gibt es dafür eine variable?
– Kräh
2. November 2012 um 17:08 Uhr
Seit WordPress 3.6.0 können Sie den Filter nav_menu_link_attributes verwenden:
add_filter( 'nav_menu_link_attributes', 'add_class_to_items_link', 10, 3 );
function add_class_to_items_link( $atts, $item, $args ) {
// check if the item has children
$hasChildren = (in_array('menu-item-has-children', $item->classes));
if ($hasChildren) {
// add the desired attributes:
$atts['class'] = 'dropdown-toggle';
$atts['data-toggle'] = 'dropdown';
$atts['data-target'] = '#';
}
return $atts;
}
Die Tags haben leider keinen Filter, den wir verwenden könnten, also brauchen wir einen Rollator:
class MY_Menu_Walker extends Walker_Nav_Menu {
public function start_lvl( &$output, $depth = 0, $args = array() ) {
$indent = str_repeat("\t", $depth);
$output .= "\n$indent<ul class=\"sub-menu dropdown-menu\">\n";
}
}
fügen Sie dann beim Aufruf des Menüs die Walker-Option hinzu:
wp_nav_menu( array('walker' => new MY_Menu_Walker));
Ich könnte erfolgreich sein, wenn ich nur das erste Code-Snippet verwende. Danke @VictorBV
Sie können dies verwenden, um zu überprüfen, ob es ein Untermenü gibt:
$has_children = $wpdb->get_var("SELECT COUNT(meta_id)
FROM wp_postmeta
WHERE meta_key='_menu_item_menu_item_parent'
AND meta_value="".$item->ID.""");
Dann machen Sie einfache Kontrollen
if ( $has_children > 0 ) {
// These lines adds your custom class and attribute
$attributes .= ' class="dropdown-toggle"';
$attributes .= ' data-toggle="dropdown"';
}
Denken Sie daran, einzustellen $wpdb als global:
global $wp_query, $wpdb;
Tada~
Sie können es in der functions.php platzieren.
class My_Walker_Nav_Menu extends Walker_Nav_Menu {
function display_element( $element, &$children_elements, $max_depth, $depth=0, $args, &$output ){
$GLOBALS['dd_children'] = ( isset($children_elements[$element->ID]) )? 1:0;
$GLOBALS['dd_depth'] = (int) $depth;
parent::display_element( $element, $children_elements, $max_depth, $depth, $args, $output );
}
function start_lvl(&$output, $depth) {
$indent = str_repeat("\t", $depth);
$output .= "\n$indent<ul class=\"dropdown-menu\">\n";
}
function start_el( &$output, $item, $depth = 0, $args = array(), $id = 0 )
{
global $wp_query, $wpdb;
$indent = ( $depth ) ? str_repeat( "\t", $depth ) : '';
$li_attributes="";
$class_names = $value="";
$classes = empty( $item->classes ) ? array() : (array) $item->classes;
//Add class and attribute to LI element that contains a submenu UL.
if ($args->has_children){
$classes[] = 'dropdown';
$li_attributes .= 'data-dropdown="dropdown"';
}
$classes[] = 'menu-item-' . $item->ID;
//If we are on the current page, add the active class to that menu item.
$classes[] = ($item->current) ? 'active' : '';
//Make sure you still add all of the WordPress classes.
$class_names = join( ' ', apply_filters( 'nav_menu_css_class', array_filter( $classes ), $item, $args ) );
$class_names=" class="" . esc_attr( $class_names ) . '"';
$id = apply_filters( 'nav_menu_item_id', 'menu-item-'. $item->ID, $item, $args );
$id = strlen( $id ) ? ' id="' . esc_attr( $id ) . '"' : '';
$has_children = $wpdb->get_var(
$wpdb->prepare("
SELECT COUNT(*) FROM $wpdb->postmeta
WHERE meta_key = %s
AND meta_value = %d
", '_menu_item_menu_item_parent', $item->ID)
);
$output .= $indent . '<li' . $id . $value . $class_names .'>';
$output .= $indent . '<li' . $id . $value . $class_names . $li_attributes . '>';
//Add attributes to link element.
$attributes = ! empty( $item->attr_title ) ? ' title="' . esc_attr( $item->attr_title ) .'"' : '';
$attributes .= ! empty( $item->target ) ? ' target="' . esc_attr( $item->target ) .'"' : '';
$attributes .= ! empty( $item->xfn ) ? ' rel="' . esc_attr( $item->xfn ) .'"' : '';
$attributes .= ! empty( $item->url ) ? ' href="' . esc_attr( $item->url ) .'"' : '';
// Check if menu item is in main menu
if ( $depth == 0 && $has_children > 0 ) {
// These lines adds your custom class and attribute
$attributes .= ' class="dropdown-toggle"';
$attributes .= ' data-toggle="dropdown"';
}
$item_output = $args->before;
$item_output .= '<a'. $attributes .'>';
$item_output .= $args->link_before . apply_filters( 'the_title', $item->title, $item->ID ) . $args->link_after;
// Add the caret if menu level is 0
if ( $depth == 0 && $has_children > 0 ) {
$item_output .= ' <b class="caret"></b>';
}
$item_output .= '</a>';
$item_output .= $args->after;
$output .= apply_filters( 'walker_nav_menu_start_el', $item_output, $item, $depth, $args );
}
}
Platzieren Sie diesen Code dann in Ihrer Vorlage, wo Sie dieses Menü anzeigen möchten.