#javascript #html #jquery #wordpress #bootstrap
Есть сайт на WordPress, где в тему хочу добавить bootstrap меню с выпадающим списком при наведении. Регистрирую меню стандартным способом: 'Верхнее меню' )); wp_nav_menu( array( 'container' => 'div', 'container_class' => 'collapse navbar-collapse navbar-ex1-collapse', 'menu_class'=>'nav navbar-nav navbar-right', 'theme_location'=>'top' ) ); ?> Затем хочу перенести в него функционал этого меню, но есть проблемы с добавлением в ссылку классов class="dropdown-toggle" атрибутов data-toggle="dropdown" и во внутренний список ul класса dropdown-menu. Как это можно сделать? фидл .dropdown:hover > .dropdown-menu { display: block; }
Ответы
Ответ 1
Нужно использовать класс Walker, следующий код при добавлении в function.php, добавляет нужные классы к пунктам меню и ссылкам внутри него, при этом стандартные классы меню wordpress не выводятся. class mainMenuWalker extends Walker_Nav_Menu { function start_el(&$output, $item, $depth, $args) { // назначаем классы li-элементу и выводим его $class_names = ' class="main-menu_item"'; $output.= '
- \n";// указываем нужный нам класс,
теперь все вложенные теги ul будут иметь указанный класс.
}
// если необходимо обозначить тег li, что он является родительским элементом
вложенного списка модифицируем немного функцию display_element.
function display_element( $element, &$children_elements, $max_depth, $depth=0,
$args, &$output ) {
//получим id элемента пункта меню
$parent_elem = $this->db_fields['id'];
// проверим есть ли в нем вложенный список
if ( !empty( $children_elements[ $element->$parent_elem ] ) ) {
// запишем в массив classes необходимый нам класс и присвоим элементу списка
$element->classes['parent_class'] = 'parent-item';
}
Walker_Nav_Menu::display_element( $element, $children_elements, $max_depth,
$depth, $args, $output );
}
//Ну а здесь уже приведем в нужный нам вид классы li элемента
function start_el(&$output, $item, $depth, $args) {
// назначаем классы li-элементу и выводим его
//для этого добавим наш класс в массив classes
$item->classes['my_class'] = 'main-menu_item';
// и напрямую укажем какие классы из массива мы хотим использовать.
$class_names = ' class="' .esc_attr( $item->classes['my_class'] .' '. $item->classes['parent_class']
). '"';
$output.= '
- '; // назначаем атрибуты a-элементу $attributes.= !empty( $item->url ) ? ' href="' .esc_attr($item->url). '" class="main-menu_link" ' : ''; $item_output = $args->before; // проверяем, на какой странице мы находимся $current_url = (is_ssl()?'https://':'http://').$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']; $item_url = esc_attr( $item->url ); $item_output.= ''.$item->title.''; // заканчиваем вывод элемента $item_output.= $args->after; $output.= apply_filters( 'walker_nav_menu_start_el', $item_output, $item, $depth, $args ); } } PS Eсли хотим использовать все классы и дефолтные, указываем просто массив $item->classes тогда строка будет иметь вид: $class_names = join( ' ', $item->classes ); $class_names = ' class="' .esc_attr( $class_names ). '"'; $output.= '
Комментариев нет:
Отправить комментарий