Cum să creezi un meniu dropdown Bootstrap cu wp_nav_menu în WordPress
Încerc să construiesc o temă WordPress cu Bootstrap, dar meniul de navigare îmi creează probleme. Aș dori ca dropdown-ul să funcționeze ca în Bootstrap, dar nu știu cum să fac asta.
Acesta este meniul meu:
<ul class="nav">
<?php wp_nav_menu( array( 'items_wrap' => '%3$s' ) ); ?>
</ul>
Iată ce am în functions.php pentru meniu:
add_action('after_setup_theme', 'blankslate_setup');
function blankslate_setup(){
register_nav_menus(
array( 'main-menu' => __( 'Main Menu', 'blankslate' ) )
);
}
function my_wp_nav_menu_args( $args = '' )
{
$args['container'] = false;
return $args;
} // funcție
add_filter( 'wp_nav_menu_args', 'my_wp_nav_menu_args' );
Când adaug un submeniu (prin Aspect - Meniuri), acesta este codul generat:
<ul class="nav">
<li id="menu-item-18" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-18"><a href="#">Părinte</a>
<ul class="sub-menu">
<li id="menu-item-19" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-19"><a href="#">Copil</a></li>
</ul>
</li>
</ul>
Pentru ca meniul meu să funcționeze cu Bootstrap, am nevoie să fie generat astfel:
<ul class="nav">
<li class="dropdown"><a href="#" class="dropdown-toggle" data-toggle="dropdown">Părinte <b class="caret"></b></a>
<ul class="dropdown-menu">
<li><a href="#">Copil</a></li>
</ul>
</li>
</ul>
Deci am nevoie de:
- Adăugarea clasei "dropdown" pentru elementele de meniu care au subelemente
- Adăugarea class="dropdown-toggle" data-toggle="dropdown" la elementul .dropdown a
- Adăugarea
<b class="caret"></b>
după numele meniului dropdown (în interiorul elementului .dropdown a) - Adăugarea
class="dropdown-menu"
la<ul class="sub-menu">
Sper că cineva mă poate ajuta!

Va trebui să scrii un walker personalizat care extinde clasa Walker_Nav_Menu
, aproximativ astfel:
class My_Custom_Nav_Walker extends Walker_Nav_Menu {
function start_lvl(&$output, $depth = 0, $args = array()) {
$output .= "\n<ul class=\"dropdown-menu\">\n";
}
function start_el(&$output, $item, $depth = 0, $args = array(), $id = 0) {
$item_html = '';
parent::start_el($item_html, $item, $depth, $args);
if ( $item->is_dropdown && $depth === 0 ) {
$item_html = str_replace( '<a', '<a class=\"dropdown-toggle\" data-toggle=\"dropdown\"', $item_html );
$item_html = str_replace( '</a>', ' <b class=\"caret\"></b></a>', $item_html );
}
$output .= $item_html;
}
function display_element($element, &$children_elements, $max_depth, $depth = 0, $args, &$output) {
if ( $element->current )
$element->classes[] = 'active';
$element->is_dropdown = !empty( $children_elements[$element->ID] );
if ( $element->is_dropdown ) {
if ( $depth === 0 ) {
$element->classes[] = 'dropdown';
} elseif ( $depth === 1 ) {
// Nivel suplimentar de meniu dropdown,
// așa cum se vede în http://twitter.github.com/bootstrap/components.html#dropdowns
$element->classes[] = 'dropdown-submenu';
}
}
parent::display_element($element, $children_elements, $max_depth, $depth, $args, $output);
}
}
Nu sunt sigur ce ai nevoie la punctele 3 și 4, totuși.

Mulțumesc, o să încerc. Am uitat să încadrez niște cod la punctele 3 și 4 :)

Ok, acum are sens, cred că codul de mai sus ar trebui să rezolve totul.

crezi că ar exista o modalitate de a face asta în functions.php? Sau în alt fel care să-mi permită să modific doar tema.

Poți folosi asta în totalitate în functions.php
, poate folosește un include
către un fișier extern pentru a păstra lucrurile mai organizate, dar asta e tot.
