text wp_nav_menu中的菜单start_level参数
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了text wp_nav_menu中的菜单start_level参数相关的知识,希望对你有一定的参考价值。
function add_menu_start_depth_option($items, $args) {
$parent_class = array('current-menu-parent');
$current_class = array('current-menu-item');
//calculate item children, parents and depth
$depth = 1;
$parent_ids = array();
$parent_keys = array();
foreach ($items as $key => $item) {
if ($item->menu_item_parent && ($item->menu_item_parent == $items[$key-1]->ID)) {
$depth++;
array_push($parent_ids,$items[$key-1]->ID);
array_push($parent_keys,$key-1);
} elseif (count($parent_ids) && ($item->menu_item_parent != $parent_ids[count($parent_ids)-1])) {
while ($parent_ids && ($item->menu_item_parent != $parent_ids[count($parent_ids)-1])) {
$depth--;
array_pop($parent_ids);
array_pop($parent_keys);
}
}
if ($parent_ids) {
if (!isset($items[$key]->parent_ids)) {
$items[$key]->parent_ids = array();
}
if (!isset($items[$key]->parent_keys)) {
$items[$key]->parent_keys = array();
}
$items[$key]->parent_ids = $parent_ids;
$items[$key]->parent_keys = $parent_keys;
}
$items[$key]->depth = $depth;
foreach($parent_keys as $k) {
if (!isset($items[$k]->child_ids)) {
$items[$k]->child_ids = array();
}
if (!isset($items[$k]->child_keys)) {
$items[$k]->child_keys = array();
}
$items[$k]->child_ids[] = $item->ID;
$items[$k]->child_keys[] = $key;
}
}
//if start_level >= 2 then remove unnecessary items
if (!isset($args->start_level) || intval($args->start_level) < 2) {
return $items;
} else {
$filtered_items = $items;
//find current item
$current_item = count($filtered_items);
while ($current_item) {
if (!is_array($filtered_items[$current_item]->classes)) {
$filtered_items[$current_item]->classes = array();
}
if (count(array_intersect($filtered_items[$current_item]->classes, $current_class))) {
break;
}
$current_item--;
}
//find parent item if current item not found
if (!$current_item) {
$current_item = count($filtered_items);
while ($current_item) {
if (count(array_intersect($filtered_items[$current_item]->classes, $parent_class))) {
break;
}
$current_item--;
}
}
//if active item found and active item depth not too small to calculate it's submenu on this level
if ($current_item && $filtered_items[$current_item]->depth >= ($args->start_level -1)) {
//find active parent with level = start_level -1;
$parent_item = $current_item;
if ($filtered_items[$parent_item]->depth >= $args->start_level) {
$parent_item = $filtered_items[$parent_item]->parent_keys[$args->start_level-2];
}
//save
$child_ids = $filtered_items[$parent_item]->child_ids;
$child_ids = $child_ids ? $child_ids : array();
//remove unnecessary items
foreach ($filtered_items as $key => $item) {
if (($item->depth < $args->start_level) || (!in_array($item->ID, $child_ids) && ($key != $current_item))) {
unset($filtered_items[$key]);
}
}
//reorder item keys
if (count($filtered_items)) {
$reordered_items = array();
$key = 0;
foreach ($filtered_items as $item) {
$key++;
$reordered_items[$key] = $item;
}
return $reordered_items;
}
}
$args->items_wrap = '';
return array();
}
}
add_filter('wp_nav_menu_objects', 'add_menu_start_depth_option', 10, 2);
Если для определения “родителя” или “текущего элемента” требуется использовать какие-то другие классы, которые WP вешает по-умолчанию на пункты меню, следует отредактировать эти две строчки:
$parent_class = array('current-menu-parent');
$current_class = array('current-menu-item');
Функция ищет текущий элемент начиная с конца меню, а если не находит – точно так же ищет родительский.
Получив эту информацию определяет, возможно ли вывести подменю нужного уровня для этого родителя. И если воззможно – удаляет все “лишние пункты из меню перед его выводом”. Если вывести подменю нельзя – ничего не выводится – т.е. удаляются все пункты меню и параметр “items_wrap” делается пустым, чтобы убрать пустую <ul></ul>.
以上是关于text wp_nav_menu中的菜单start_level参数的主要内容,如果未能解决你的问题,请参考以下文章
如何在 WordPress 的“wp_nav_menu”子菜单中的 <a>-tag 中添加类和元素?