J'essaie d'ajouter une structure de menu personnalisée pour mon thème WordPress. Voici ce que je veux qu'il ressemble:
<li>
<a href="link_to_parent_item" class="main-category" tabindex="3">Parent Name</a>
<div class="sub-menu">
<div class="sub-links pull-left">
<a href="link_to_child_item">Child Name1</a>
<a href="link_to_child_item">Child Name2</a>
</div>
</div>
</li>
J'ai écrit un programme personnalisé pour faire cela, mais cela ne me donne pas ce que je veux vraiment. Voici mon cours de marcheur:
class loggmax_class_walker extends Walker_Nav_Menu{
// Start level, beginning tags
function start_lvl(&$output, $depth) {
$indent = ( $depth ) ? str_repeat( "\t", $depth ) : '';
$output .= "\n$indent";
$output .= '<div class="sub-menu">';
$output .= '<div class="sub-links pull-left">';
}
function end_lvl(&$output, $depth) {
$indent = ( $depth ) ? str_repeat( "\t", $depth ) : '';
$output .= "$indent</div>";
$output .= '</div>';
}
// Start element (beginning list items)
function start_el( &$output, $item, $depth=0, $args=array(),$current_object_id=0 ) {
$this->curItem = $item;
$indent = ( $depth ) ? str_repeat( "\t", $depth ) : '';
$class_names = $value = '';
$classes = empty( $item->classes ) ? array() : (array) $item->classes;
$classes[] = 'menu-item-' . $item->ID;
$class_names = join( ' ', apply_filters( 'nav_menu_css_class', array_filter( $classes ), $item, $args ) );
$class_names = $class_names ? ' class="' . esc_attr( $class_names ) . '"' : '';
$id = apply_filters( 'nav_menu_item_id', 'menu-item-'. $item->ID, $item, $args );
$id = $id ? ' id="' . esc_attr( $id ) . '"' : '';
$atts = array();
$atts['title'] = ! empty( $item->attr_title ) ? $item->attr_title : '';
$atts['target'] = ! empty( $item->target ) ? $item->target : '';
$atts['rel'] = ! empty( $item->xfn ) ? $item->xfn : '';
$atts['href'] = ! empty( $item->url ) ? $item->url : '';
$atts['slug'] = ! empty( $item->slug ) ? $item->slug : '';
$atts = apply_filters( 'nav_menu_link_attributes', $atts, $item, $args );
$attributes = '';
$item_output = '';
foreach ( $atts as $attr => $value ) {
if ( ! empty( $value ) ) {
$value = ( 'href' === $attr ) ? esc_url( $value ) : esc_attr( $value );
$attributes .= ' ' . $attr . '="' . $value . '"';
}
}
// Check if it is a submenu
if ( $depth == 1 ) {
$output .= '<a'. $attributes. ' >';
$output .= apply_filters( 'the_title', $item->title, $item->ID );
$output .= '</a>';
} elseif ( $depth == 0 ) {
$item_output .= '<li>';
$item_output .= '<a'. $attributes. ' class="main-category">';
$item_output .= apply_filters( 'the_title', $item->title, $item->ID );
$item_output .= '</a>';
}
$output .= apply_filters( 'walker_nav_menu_start_el', $item_output, $item, $depth, $args );
}
}
et ce code est dans mon header.php
if ( has_nav_menu( 'primary-menu' ) )
wp_nav_menu( array(
'theme_location' => 'primary-menu',
'container' => 'ul',
'menu_class' => 'pull-left',
'items_wrap' => '<ul id="%1$s" class="%2$s">%3$s</ul>',
'walker' => new loggmax_class_walker()
) );
et voici ce qui est affiché:
<li>
<a href="link_here" class="main-category">Parent Title</a>
<div class="sub-menu">
<div class="sub-links pull-left">
<a href="link_here">Child Title</a></li>
<a href="link_here">Child Title 2</a></li>
</div>
</li>
Comment supprimer l'étiquette de liste finale </li>
en cours d'impression dans les éléments de sous-menu?
Il semble que le
<li></li>
dans la fonction end_lvl et également dans $ item_output. Bien que je n’ai aucune expérience de l’écriture du code du promeneur, j’avais déjà utilisé un marcheur Bootstrap, de sorte qu’ils pourraient ne pas vous être utiles. Peut-être que jeter un coup d’œil sur les liens suivants pourrait vous aider?
Ancienne question, mais vous pouvez remplacer le </li>
dans la fonction end_el()
du Walker (voir wp-includes/class-walker-nav-menu.php); dans votre cas, quelque chose comme:
public function end_el( &$output, $item, $depth = 0, $args = array() ) {
if ( isset( $args->item_spacing ) && 'discard' === $args->item_spacing ) {
$n = '';
} else {
$n = "\n";
}
if ( $depth == 0 ) {
$output .= "</li>{$n}";
} else {
$output .= "{$n}";
}
}