2013-12-10 2 views
0

У меня проблема с предоставлением дочерним элементам только того класса, который я хочу.Предоставление другого элемента для дочерних элементов: wp_nav_menu (walker)

Любой может дать мне несколько советов или любую небольшую помощь по поводу того, что мне нужно написать на моих функциях.php? Вот мой код: sidebar.php:

<?php 
    wp_nav_menu(array(
     'container' => 'div', 
     'container_class' => 'menu', 
     'items_wrap' => '%3$s', 
     'walker' => new ik_walker 
    )); 
?> 

functions.php:

class ik_walker extends Walker_Nav_Menu{ 

    var $tree_type = array('post_type', 'taxonomy', 'custom'); 
    var $db_fields = array('parent' => 'menu_item_parent', 'id' => 'db_id'); 

    function display_element($element, &$children_elements, $max_depth, $depth=0, $args, &$output) 
    { 
     $id_field = $this->db_fields['id']; 
     if (is_object($args[0])) { 
      $args[0]->has_children = ! empty($children_elements[$element->$id_field]); 
     } 
     return parent::display_element($element, $children_elements, $max_depth, $depth, $args, $output); 
    }  

    function start_lvl(&$output, $depth) { 
     $output .= "<i class=\"dropdown icon\"></i>\n"; 
     $output .= "<div class=\"menu\">\n"; 
    } 

    function end_lvl(&$output, $depth) { 
     $indent = str_repeat("\t", $depth); 
     $output .= "</div></div>\n"; 
    } 

    function start_el(&$output, $item, $depth, $args) { 
     $value = ''; 
     $classes = empty($item->classes) ? array() : (array) $item->classes; 
     $classes = in_array('current-menu-item', $classes) ? array('current-menu-item') : array(); 
     $class_names = join(' ', apply_filters('nav_menu_css_class', array_filter($classes), $item, $args)); 
     $class_names = strlen(trim($class_names)) > 0 ? ' class="' . esc_attr($class_names) . '"' : ''; 
     $id = apply_filters('nav_menu_item_id', '', $item, $args); 
     $id = strlen($id) ? ' id="' . esc_attr($id) . '"' : ''; 
     $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  ) .'"' : ''; 
     $item_output = $args->before; 


     if ($args->has_children){ 

      $item_output .= "<div class=\"ui simple dropdown item\">\n"; 
      $item_output .= $args->link_before . apply_filters('the_title', $item->title, $item->ID) . $args->link_after; 
     } 

     else { 
      $item_output .= "<div class=\"ui simple dropdown item\">\n"; 
      $item_output .= "<a". $attributes . $id . $value . $class_names . ">\n"; 
      $item_output .= $args->link_before . apply_filters('the_title', $item->title, $item->ID) . $args->link_after; 
      $item_output .= "\n</a><i class=\"dropdown icon\"></i></div>\n"; 
     } 

     $item_output .= $args->after; 
     $output .= apply_filters('walker_nav_menu_start_el', $item_output, $item, $depth, $args); 
    } 




} 

Я хочу выход быть похожим на это:

<div class="menu"> 
    <div class="ui simple dropdown item"> 
    CATEGORY WITH SUB-CATEGORIES 
    <i class="dropdown icon"></i> 
    <div class="menu"> 
     <div class="item" ><a href="#">Sub Category 1</a></div> 
     <div class="item" ><a href="#">Sub Category 2</a></div> 
     <div class="item" ><a href="#">Sub Category 3</a></div> 
    </div> 
    </div><!-- /.ui .simple .dropdown .item --> 

    <div class="ui simple dropdown item"> 
    CATEGORY WITHOUT SUB-CATEGORY 
    </div> 
</div> <!-- /.menu --> 

в данный момент меню отображается так (классы ui простой выпадающий элемент выводятся, но я хочу, чтобы они были только: item, также без <i> предмет.)

<div class="menu"> 
    <div class="ui simple dropdown item"> 
    CATEGORY WITH SUB-CATEGORIES 
    <i class="dropdown icon"></i> 
    <div class="menu"> 
     <div class="ui simple dropdown item"><a href="#">Sub Category 1</a><i class="dropdown icon"></i></div> 
     <div class="ui simple dropdown item"><a href="#">Sub Category 2</a><i class="dropdown icon"></i></div> 
     <div class="ui simple dropdown item"><a href="#">Sub Category 3</a><i class="dropdown icon"></i></div> 
    </div> 
    </div><!-- /.ui .simple .dropdown .item --> 

    <div class="ui simple dropdown item"> 
    CATEGORY WITHOUT SUB-CATEGORY 
    </div> 
</div> <!-- /.menu --> 

Спасибо!

ответ

0

Именно эти строки, которые вы должны сосредоточиться на, в функции start_el() -

$classes = empty($item->classes) ? array() : (array) $item->classes; 
$classes = in_array('current-menu-item', $classes) ? array('current-menu-item') : array(); 

Они захватывая классы по умолчанию из $item, который, очевидно, вы не хотите. Если вы хотите, чтобы они все имеют только один вызов item (не утруждая current-menu-item), а затем заменить это -

$classes = array('item'); 

Однако, если вы хотите по-прежнему включают в себя current-menu-item затем заменить его с этим -

$classes = in_array('current-menu-item', $item->classes) ? array('current-menu-item') : array(); 
$classes[] = 'item'; 
Смежные вопросы