2017-02-15 12 views
1

Я создал новое меню в теме colormag, которое отлично работает, показывая элемент подменю при наведении до уровня 6, после чего все подменю отображаются сразу (сразу два уровня). меню имеет 8 уровней.Уровень навигации в Wordpress

параметр глубины в 'wp_nav_menu' установлен в 0. Пробужденный 1,2,3 ... 6: работает отлично, 7 и выше вызывает проблему, упомянутую выше.

любая помощь пожалуйста? спасибо!

+1

поделитесь своим кодом – Jadeye

+0

и ссылкой на сайт также –

ответ

0
**nav-menu-template.php** 
<?php 

require_once ABSPATH . WPINC . '/class-walker-nav-menu.php'; 

function wp_nav_menu($args = array()) { 
    static $menu_id_slugs = array(); 

    $defaults = array('menu' => '', 'container' => 'div', 'container_class' => '', 'container_id' => '', 'menu_class' => 'menu', 'menu_id' => '', 
    'echo' => true, 'fallback_cb' => 'wp_page_menu', 'before' => '', 'after' => '', 'link_before' => '', 'link_after' => '', 'items_wrap' => '<ul id="%1$s" class="%2$s">%3$s</ul>', 
    'depth' => 0, 'walker' => '', 'theme_location' => ''); 

    $args = wp_parse_args($args, $defaults); 
    /** 
    * Filters the arguments used to display a navigation menu. 
    * 
    * @since 3.0.0 
    * 
    * @see wp_nav_menu() 
    * 
    * @param array $args Array of wp_nav_menu() arguments. 
    */ 
    $args = apply_filters('wp_nav_menu_args', $args); 
    $args = (object) $args; 

    /** 
    * Filters whether to short-circuit the wp_nav_menu() output. 
    * 
    * Returning a non-null value to the filter will short-circuit 
    * wp_nav_menu(), echoing that value if $args->echo is true, 
    * returning that value otherwise. 
    * 
    * @since 3.9.0 
    * 
    * @see wp_nav_menu() 
    * 
    * @param string|null $output Nav menu output to short-circuit with. Default null. 
    * @param object  $args An object containing wp_nav_menu() arguments. 
    */ 
    $nav_menu = apply_filters('pre_wp_nav_menu', null, $args); 

    if (null !== $nav_menu) { 
     if ($args->echo) { 
      echo $nav_menu; 
      return; 
     } 

     return $nav_menu; 
    } 

    // Get the nav menu based on the requested menu 
    $menu = wp_get_nav_menu_object($args->menu); 

    // Get the nav menu based on the theme_location 
    if (! $menu && $args->theme_location && ($locations = get_nav_menu_locations()) && isset($locations[ $args->theme_location ])) 
     $menu = wp_get_nav_menu_object($locations[ $args->theme_location ]); 

    // get the first menu that has items if we still can't find a menu 
    if (! $menu && !$args->theme_location) { 
     $menus = wp_get_nav_menus(); 
     foreach ($menus as $menu_maybe) { 
      if ($menu_items = wp_get_nav_menu_items($menu_maybe->term_id, array('update_post_term_cache' => false))) { 
       $menu = $menu_maybe; 
       break; 
      } 
     } 
    } 

    if (empty($args->menu)) { 
     $args->menu = $menu; 
    } 

    // If the menu exists, get its items. 
    if ($menu && ! is_wp_error($menu) && !isset($menu_items)) 
     $menu_items = wp_get_nav_menu_items($menu->term_id, array('update_post_term_cache' => false)); 

    /* 
    * If no menu was found: 
    * - Fall back (if one was specified), or bail. 
    * 
    * If no menu items were found: 
    * - Fall back, but only if no theme location was specified. 
    * - Otherwise, bail. 
    */ 
    if ((!$menu || is_wp_error($menu) || (isset($menu_items) && empty($menu_items) && !$args->theme_location)) 
     && isset($args->fallback_cb) && $args->fallback_cb && is_callable($args->fallback_cb)) 
      return call_user_func($args->fallback_cb, (array) $args); 

    if (! $menu || is_wp_error($menu)) 
     return false; 

    $nav_menu = $items = ''; 

    $show_container = false; 
    if ($args->container) { 
     /** 
     * Filters the list of HTML tags that are valid for use as menu containers. 
     * 
     * @since 3.0.0 
     * 
     * @param array $tags The acceptable HTML tags for use as menu containers. 
     *     Default is array containing 'div' and 'nav'. 
     */ 
     $allowed_tags = apply_filters('wp_nav_menu_container_allowedtags', array('div', 'nav')); 
     if (is_string($args->container) && in_array($args->container, $allowed_tags)) { 
      $show_container = true; 
      $class = $args->container_class ? ' class="' . esc_attr($args->container_class) . '"' : ' class="menu-'. $menu->slug .'-container"'; 
      $id = $args->container_id ? ' id="' . esc_attr($args->container_id) . '"' : ''; 
      $nav_menu .= '<'. $args->container . $id . $class . '>'; 
     } 
    } 

    // Set up the $menu_item variables 
    _wp_menu_item_classes_by_context($menu_items); 

    $sorted_menu_items = $menu_items_with_children = array(); 
    foreach ((array) $menu_items as $menu_item) { 
     $sorted_menu_items[ $menu_item->menu_order ] = $menu_item; 
     if ($menu_item->menu_item_parent) 
      $menu_items_with_children[ $menu_item->menu_item_parent ] = true; 
    } 

    // Add the menu-item-has-children class where applicable 
    if ($menu_items_with_children) { 
     foreach ($sorted_menu_items as &$menu_item) { 
      if (isset($menu_items_with_children[ $menu_item->ID ])) 
       $menu_item->classes[] = 'menu-item-has-children'; 
     } 
    } 

    unset($menu_items, $menu_item); 

    /** 
    * Filters the sorted list of menu item objects before generating the menu's HTML. 
    * 
    * @since 3.1.0 
    * 
    * @param array $sorted_menu_items The menu items, sorted by each menu item's menu order. 
    * @param object $args    An object containing wp_nav_menu() arguments. 
    */ 
    $sorted_menu_items = apply_filters('wp_nav_menu_objects', $sorted_menu_items, $args); 

    $items .= walk_nav_menu_tree($sorted_menu_items, $args->depth, $args); 
    unset($sorted_menu_items); 

    // Attributes 
    if (! empty($args->menu_id)) { 
     $wrap_id = $args->menu_id; 
    } else { 
     $wrap_id = 'menu-' . $menu->slug; 
     while (in_array($wrap_id, $menu_id_slugs)) { 
      if (preg_match('#-(\d+)$#', $wrap_id, $matches)) 
       $wrap_id = preg_replace('#-(\d+)$#', '-' . ++$matches[1], $wrap_id); 
      else 
       $wrap_id = $wrap_id . '-1'; 
     } 
    } 
    $menu_id_slugs[] = $wrap_id; 

    $wrap_class = $args->menu_class ? $args->menu_class : ''; 

    /** 
    * Filters the HTML list content for navigation menus. 
    * 
    * @since 3.0.0 
    * 
    * @see wp_nav_menu() 
    * 
    * @param string $items The HTML list content for the menu items. 
    * @param object $args An object containing wp_nav_menu() arguments. 
    */ 
    $items = apply_filters('wp_nav_menu_items', $items, $args); 
    /** 
    * Filters the HTML list content for a specific navigation menu. 
    * 
    * @since 3.0.0 
    * 
    * @see wp_nav_menu() 
    * 
    * @param string $items The HTML list content for the menu items. 
    * @param object $args An object containing wp_nav_menu() arguments. 
    */ 
    $items = apply_filters("wp_nav_menu_{$menu->slug}_items", $items, $args); 

    // Don't print any markup if there are no items at this point. 
    if (empty($items)) 
     return false; 

    $nav_menu .= sprintf($args->items_wrap, esc_attr($wrap_id), esc_attr($wrap_class), $items); 
    unset($items); 

    if ($show_container) 
     $nav_menu .= '</' . $args->container . '>'; 

    /** 
    * Filters the HTML content for navigation menus. 
    * 
    * @since 3.0.0 
    * 
    * @see wp_nav_menu() 
    * 
    * @param string $nav_menu The HTML content for the navigation menu. 
    * @param object $args  An object containing wp_nav_menu() arguments. 
    */ 
    $nav_menu = apply_filters('wp_nav_menu', $nav_menu, $args); 

    if ($args->echo) 
     echo $nav_menu; 
    else 
     return $nav_menu; 
} 

/** 
* Add the class property classes for the current context, if applicable. 
* 
* @access private 
* @since 3.0.0 
* 
* @global WP_Query $wp_query 
* @global WP_Rewrite $wp_rewrite 
* 
* @param array $menu_items The current menu item objects to which to add the class property information. 
*/ 
function _wp_menu_item_classes_by_context(&$menu_items) { 
    global $wp_query, $wp_rewrite; 

    $queried_object = $wp_query->get_queried_object(); 
    $queried_object_id = (int) $wp_query->queried_object_id; 

    $active_object = ''; 
    $active_ancestor_item_ids = array(); 
    $active_parent_item_ids = array(); 
    $active_parent_object_ids = array(); 
    $possible_taxonomy_ancestors = array(); 
    $possible_object_parents = array(); 
    $home_page_id = (int) get_option('page_for_posts'); 

    if ($wp_query->is_singular && ! empty($queried_object->post_type) && ! is_post_type_hierarchical($queried_object->post_type)) { 
     foreach ((array) get_object_taxonomies($queried_object->post_type) as $taxonomy) { 
      if (is_taxonomy_hierarchical($taxonomy)) { 
       $term_hierarchy = _get_term_hierarchy($taxonomy); 
       $terms = wp_get_object_terms($queried_object_id, $taxonomy, array('fields' => 'ids')); 
       if (is_array($terms)) { 
        $possible_object_parents = array_merge($possible_object_parents, $terms); 
        $term_to_ancestor = array(); 
        foreach ((array) $term_hierarchy as $anc => $descs) { 
         foreach ((array) $descs as $desc) 
          $term_to_ancestor[ $desc ] = $anc; 
        } 

        foreach ($terms as $desc) { 
         do { 
          $possible_taxonomy_ancestors[ $taxonomy ][] = $desc; 
          if (isset($term_to_ancestor[ $desc ])) { 
           $_desc = $term_to_ancestor[ $desc ]; 
           unset($term_to_ancestor[ $desc ]); 
           $desc = $_desc; 
          } else { 
           $desc = 0; 
          } 
         } while (! empty($desc)); 
        } 
       } 
      } 
     } 
    } elseif (! empty($queried_object->taxonomy) && is_taxonomy_hierarchical($queried_object->taxonomy)) { 
     $term_hierarchy = _get_term_hierarchy($queried_object->taxonomy); 
     $term_to_ancestor = array(); 
     foreach ((array) $term_hierarchy as $anc => $descs) { 
      foreach ((array) $descs as $desc) 
       $term_to_ancestor[ $desc ] = $anc; 
     } 
     $desc = $queried_object->term_id; 
     do { 
      $possible_taxonomy_ancestors[ $queried_object->taxonomy ][] = $desc; 
      if (isset($term_to_ancestor[ $desc ])) { 
       $_desc = $term_to_ancestor[ $desc ]; 
       unset($term_to_ancestor[ $desc ]); 
       $desc = $_desc; 
      } else { 
       $desc = 0; 
      } 
     } while (! empty($desc)); 
    } 

    $possible_object_parents = array_filter($possible_object_parents); 

    $front_page_url = home_url(); 

    foreach ((array) $menu_items as $key => $menu_item) { 

     $menu_items[$key]->current = false; 

     $classes = (array) $menu_item->classes; 
     $classes[] = 'menu-item'; 
     $classes[] = 'menu-item-type-' . $menu_item->type; 
     $classes[] = 'menu-item-object-' . $menu_item->object; 

     // if the menu item corresponds to a taxonomy term for the currently-queried non-hierarchical post object 
     if ($wp_query->is_singular && 'taxonomy' == $menu_item->type && in_array($menu_item->object_id, $possible_object_parents)) { 
      $active_parent_object_ids[] = (int) $menu_item->object_id; 
      $active_parent_item_ids[] = (int) $menu_item->db_id; 
      $active_object = $queried_object->post_type; 

     // if the menu item corresponds to the currently-queried post or taxonomy object 
     } elseif (
      $menu_item->object_id == $queried_object_id && 
      (
       (! empty($home_page_id) && 'post_type' == $menu_item->type && $wp_query->is_home && $home_page_id == $menu_item->object_id) || 
       ('post_type' == $menu_item->type && $wp_query->is_singular) || 
       ('taxonomy' == $menu_item->type && ($wp_query->is_category || $wp_query->is_tag || $wp_query->is_tax) && $queried_object->taxonomy == $menu_item->object) 
      ) 
     ) { 
      $classes[] = 'current-menu-item'; 
      $menu_items[$key]->current = true; 
      $_anc_id = (int) $menu_item->db_id; 

      while(
       ($_anc_id = get_post_meta($_anc_id, '_menu_item_menu_item_parent', true)) && 
       ! in_array($_anc_id, $active_ancestor_item_ids) 
      ) { 
       $active_ancestor_item_ids[] = $_anc_id; 
      } 

      if ('post_type' == $menu_item->type && 'page' == $menu_item->object) { 
       // Back compat classes for pages to match wp_page_menu() 
       $classes[] = 'page_item'; 
       $classes[] = 'page-item-' . $menu_item->object_id; 
       $classes[] = 'current_page_item'; 
      } 
      $active_parent_item_ids[] = (int) $menu_item->menu_item_parent; 
      $active_parent_object_ids[] = (int) $menu_item->post_parent; 
      $active_object = $menu_item->object; 

     // if the menu item corresponds to the currently-queried post type archive 
     } elseif (
      'post_type_archive' == $menu_item->type && 
      is_post_type_archive(array($menu_item->object)) 
     ) { 
      $classes[] = 'current-menu-item'; 
      $menu_items[$key]->current = true; 
     // if the menu item corresponds to the currently-requested URL 
     } elseif ('custom' == $menu_item->object && isset($_SERVER['HTTP_HOST'])) { 
      $_root_relative_current = untrailingslashit($_SERVER['REQUEST_URI']); 
      $current_url = set_url_scheme('http://' . $_SERVER['HTTP_HOST'] . $_root_relative_current); 
      $raw_item_url = strpos($menu_item->url, '#') ? substr($menu_item->url, 0, strpos($menu_item->url, '#')) : $menu_item->url; 
      $item_url = set_url_scheme(untrailingslashit($raw_item_url)); 
      $_indexless_current = untrailingslashit(preg_replace('/' . preg_quote($wp_rewrite->index, '/') . '$/', '', $current_url)); 

      if ($raw_item_url && in_array($item_url, array($current_url, $_indexless_current, $_root_relative_current))) { 
       $classes[] = 'current-menu-item'; 
       $menu_items[$key]->current = true; 
       $_anc_id = (int) $menu_item->db_id; 

       while(
        ($_anc_id = get_post_meta($_anc_id, '_menu_item_menu_item_parent', true)) && 
        ! in_array($_anc_id, $active_ancestor_item_ids) 
       ) { 
        $active_ancestor_item_ids[] = $_anc_id; 
       } 

       if (in_array(home_url(), array(untrailingslashit($current_url), untrailingslashit($_indexless_current)))) { 
        // Back compat for home link to match wp_page_menu() 
        $classes[] = 'current_page_item'; 
       } 
       $active_parent_item_ids[] = (int) $menu_item->menu_item_parent; 
       $active_parent_object_ids[] = (int) $menu_item->post_parent; 
       $active_object = $menu_item->object; 

      // give front page item current-menu-item class when extra query arguments involved 
      } elseif ($item_url == $front_page_url && is_front_page()) { 
       $classes[] = 'current-menu-item'; 
      } 

      if (untrailingslashit($item_url) == home_url()) 
       $classes[] = 'menu-item-home'; 
     } 

     // back-compat with wp_page_menu: add "current_page_parent" to static home page link for any non-page query 
     if (! empty($home_page_id) && 'post_type' == $menu_item->type && empty($wp_query->is_page) && $home_page_id == $menu_item->object_id) 
      $classes[] = 'current_page_parent'; 

     $menu_items[$key]->classes = array_unique($classes); 
    } 
    $active_ancestor_item_ids = array_filter(array_unique($active_ancestor_item_ids)); 
    $active_parent_item_ids = array_filter(array_unique($active_parent_item_ids)); 
    $active_parent_object_ids = array_filter(array_unique($active_parent_object_ids)); 

    // set parent's class 
    foreach ((array) $menu_items as $key => $parent_item) { 
     $classes = (array) $parent_item->classes; 
     $menu_items[$key]->current_item_ancestor = false; 
     $menu_items[$key]->current_item_parent = false; 

     if (
      isset($parent_item->type) && 
      (
       // ancestral post object 
       (
        'post_type' == $parent_item->type && 
        ! empty($queried_object->post_type) && 
        is_post_type_hierarchical($queried_object->post_type) && 
        in_array($parent_item->object_id, $queried_object->ancestors) && 
        $parent_item->object != $queried_object->ID 
       ) || 

       // ancestral term 
       (
        'taxonomy' == $parent_item->type && 
        isset($possible_taxonomy_ancestors[ $parent_item->object ]) && 
        in_array($parent_item->object_id, $possible_taxonomy_ancestors[ $parent_item->object ]) && 
        (
         ! isset($queried_object->term_id) || 
         $parent_item->object_id != $queried_object->term_id 
        ) 
       ) 
      ) 
     ) { 
      $classes[] = empty($queried_object->taxonomy) ? 'current-' . $queried_object->post_type . '-ancestor' : 'current-' . $queried_object->taxonomy . '-ancestor'; 
     } 

     if (in_array( intval($parent_item->db_id), $active_ancestor_item_ids)) { 
      $classes[] = 'current-menu-ancestor'; 
      $menu_items[$key]->current_item_ancestor = true; 
     } 
     if (in_array($parent_item->db_id, $active_parent_item_ids)) { 
      $classes[] = 'current-menu-parent'; 
      $menu_items[$key]->current_item_parent = true; 
     } 
     if (in_array($parent_item->object_id, $active_parent_object_ids)) 
      $classes[] = 'current-' . $active_object . '-parent'; 

     if ('post_type' == $parent_item->type && 'page' == $parent_item->object) { 
      // Back compat classes for pages to match wp_page_menu() 
      if (in_array('current-menu-parent', $classes)) 
       $classes[] = 'current_page_parent'; 
      if (in_array('current-menu-ancestor', $classes)) 
       $classes[] = 'current_page_ancestor'; 
     } 

     $menu_items[$key]->classes = array_unique($classes); 
    } 
} 

/** 
* Retrieve the HTML list content for nav menu items. 
* 
* @uses Walker_Nav_Menu to create HTML list content. 
* @since 3.0.0 
* 
* @param array $items 
* @param int $depth 
* @param object $r 
* @return string 
*/ 

function walk_nav_menu_tree($items, $depth, $r) { 

    $walker = (empty($r->walker)) ? new Walker_Nav_Menu : $r->walker; 
    $args = array($items, $depth, $r); 

    return call_user_func_array(array($walker, 'walk'), $args); 
} 

/** 
* Prevents a menu item ID from being used more than once. 
* 
* @since 3.0.1 
* @access private 
* 
* @staticvar array $used_ids 
* @param string $id 
* @param object $item 
* @return string 
*/ 
function _nav_menu_item_id_use_once($id, $item) { 
    static $_used_ids = array(); 
    if (in_array($item->ID, $_used_ids)) { 
     return ''; 
    } 
    $_used_ids[] = $item->ID; 
    return $id; 
} 
0

проблема была только в CSS:

.main-навигация уль ли: парить уль, .main-навигационный ул уль Ли: парить ул, .main-навигационный ул уль уль ли: hover ul, .main-navigation ul ul ul ul ul: hover ul, .main-navigation ul ul ul ul ul li: hover ul, .main-navigation ul ul ul ul ul ul ul li: hover ul, . основная навигация ul ul ul ul ul ul ul ul li: hover ul, .main-navigation ul ul ul ul ul ul ul ul ul li: hover ul

Я добавил столько же глубоких ul, сколько мне было нужно, и это сработало. Спасибо в любом случае :)