2013-12-17 2 views
4

Я реализую тему в Wordpress. В этой теме есть главное меню навигации с горизонтальными подменю под каждым родительским элементом. Он помещает «активный» класс в текущие родительские элементы, просматриваемые в данный момент (в противном случае он не будет показывать элементы дочерних элементов для детей). Мне каким-то образом удалось сохранить «активный» класс в текущих родительских элементах, используя эти две функции в functions.php.Wordpress - поддерживайте «активный» класс в исходном пункте меню

/** 
* Wp Nav Menu Customizer. 
*/ 
function special_nav_class($classes, $item){ 
    if(in_array('current-menu-item', $classes)){ 
      $classes[] = 'active '; 
    } 
    return $classes; 
} 
add_filter('nav_menu_css_class' , 'special_nav_class' , 10 , 2); 


class SH_Last_Walker extends Walker_Nav_Menu{ 

    function display_element($element, &$children_elements, $max_depth, $depth=0, $args, &$output) { 

     $id_field = $this->db_fields['id']; 

     //If the current element has children, add class 'sub-menu' 
     if(isset($children_elements[$element->$id_field])) { 
      $classes = empty($element->classes) ? array() : (array) $element->classes; 
      $classes[] = 'has-sub-menu'; 
      $element->classes =$classes; 
     } 
     // We don't want to do anything at the 'top level'. 
     if(0 == $depth) 
      return parent::display_element($element, $children_elements, $max_depth, $depth, $args, $output); 

     //Get the siblings of the current element 
     $parent_id_field = $this->db_fields['parent'];  
     $parent_id = $element->$parent_id_field; 
     $siblings = $children_elements[ $parent_id ] ; 

     //No Siblings?? 
     if(! is_array($siblings)) 
      return parent::display_element($element, $children_elements, $max_depth, $depth, $args, $output); 

     //Get the 'last' of the siblings. 
     $last_child = array_pop($siblings); 
     $id_field = $this->db_fields['id']; 

      //If current element is the last of the siblings, add class 'last' 
     if($element->$id_field == $last_child->$id_field){ 
      $classes = empty($element->classes) ? array() : (array) $element->classes; 
      $classes[] = 'last'; 
      $element->classes =$classes; 
     } 

     return parent::display_element($element, $children_elements, $max_depth, $depth, $args, $output); 
    } 
} 

Но теперь моя проблема заключается в том, что, когда я нажимаю на подменю или ребенка любого пункта меню родительского успешно берет меня на странице ребенка, но удаляет «активный» класс от родителей и ставит его на детей (из-за него просматриваемая страница). Я не хочу, чтобы этот класс передавался детям, я хочу, чтобы он был там (на родительском элементе), когда он просматривается детьми.

Любая помощь будет высоко оценена.

+0

Если вам просто нужны изменения стиля для родительского элемента в меню, вы можете управлять им легко с помощью CSS или JQuery. – sven

ответ

9

Если вы хотите, чтобы выпадающий родоначальник был активен, когда элемент дочернего меню активен, вы можете проверить, существует ли в настоящее время пред-предка или текущего-предка .. в вашем случае, Лучше всего проверять имя-предка.

function special_nav_class($classes, $item){ 
    if(in_array('current-menu-item', $classes) || in_array('current-menu-ancestor', $classes)){ 
      $classes[] = 'active '; 
    } 
    return $classes; 
} 

Я надеюсь, что это помогло бы, есть хороший день :)

+2

спасибо soooooooooooooooooooooooooooo много Sovit Tamrakar. ты мой герой. вы сделали мой день. люблю тебя, приятель;) – Ali

+0

Отличный .. теперь это заставляет меня чувствовать себя хорошо :) Приятного дня @ Али –

0

Если все, что вы хотите, чтобы добавить стиль или другие свойства, ориентированные на родительский элемент, то WordPress предоставляет вам встроенные классы для него, например:

, когда вы находитесь на странице ребенка вы можете увидеть классы, как current-menu-parent current-page-parent current_page_parent current_page_ancestor, добавленные на родительскую страницу WordPress, вы можете выбрать любой из них, чтобы нацелиться на родительский элемент.

+0

хорошая информация, но это встроенные классы wordpress, предположим, что у меня есть собственный класс, а затем как сказать wordpress, который использует мой класс в элементе меню родителя или предка текущей страницы. это то, что я хотел знать :) – Ali

Смежные вопросы