Wordpress 中的当前级别导航
Current level navigation in Wordpress
我有一个 3 级导航:
Home
> submenu1
>> sub3
> submenu
>> sub4
>> sub5 // current page
About
> about2
>> sub6
> about3
>> sub7
我正在尝试分别获取每个导航级别,
使用上面的示例导航,在 sub5 页面上,我需要
当前一级导航:主页
当前并行二级导航:submenu1,submenu(都在主页下)
当前平行三级导航:sub4、sub5(子菜单下的菜单)
我将需要修改菜单的元素和样式,并且需要使用 php 中的菜单项,例如:
$menu_name = 'topnav';
if ( ( $locations = get_nav_menu_locations() ) && isset( $locations[ $menu_name ] ) ) {
$menu = wp_get_nav_menu_object( $locations[ $menu_name ] );
$menu_items = wp_get_nav_menu_items($menu->term_id);
foreach ( (array) $menu_items as $key => $menu_item ) {
$title = $menu_item->title;
$url = $menu_item->url;
[...]
请帮助单独显示导航层,如上所述。
我的第 1 级和第 3 级工作正常,但无法正确显示当前并行的第 2 级导航。
谢谢。
当前代码:第二个导航工程:
<?php
$menu_name = 'topnav';
if ( ( $locations = get_nav_menu_locations() ) && isset( $locations[ $menu_name ] ) ) {
$menu = wp_get_nav_menu_object( $locations[ $menu_name ] );
$menu_items = wp_get_nav_menu_items( $menu->term_id );
// Convert Objects to Arrays, Enables us to use Array Filter
$json = json_encode($menu_items);
$menu_items = json_decode($json, true);
// Current Page
$child = get_the_id();
$current_level = array_filter( $menu_items, function($v, $k) use ($child) {
return $v['object_id'] == $child;
}, ARRAY_FILTER_USE_BOTH );
$current_level_keys = array_keys($current_level);
$parent = $current_level[$current_level_keys[0]]['menu_item_parent'];
if( !empty( $parent ) )
{
$current_level_items = array_filter( $menu_items, function($v, $k) use ($parent) {
return $v['menu_item_parent'] == $parent;
}, ARRAY_FILTER_USE_BOTH );
} else {
$current_level_items = $current_level[$current_level_keys[0]];
}
//echo '1:';
//echo '<pre>';
//print_r($current_level_items);
//echo '</pre>';
//foreach ($current_level_items as $k => $v) {
// echo '<li><a href="#">'.$v['title'].'</a></li>';
//}
$parent_level = array_filter( $menu_items, function($v, $k) use ($parent) {
return $v['ID'] == $parent;
}, ARRAY_FILTER_USE_BOTH );
$parent_level_keys = array_keys($parent_level);
$grand_parent = $parent_level[$parent_level_keys[0]]['menu_item_parent'];
if( !empty( $grand_parent ) )
{
$parent_level_items = array_filter( $menu_items, function($v, $k) use ($grand_parent) {
return $v['menu_item_parent'] == $grand_parent;
}, ARRAY_FILTER_USE_BOTH );
} else {
$parent_level_items = $parent_level[$parent_level_keys[0]];
}
//echo '2:';
//echo '<pre>';
//print_r($parent_level_items);
//echo '</pre>';
//foreach ($parent_level_items as $k => $v) {
//echo '<li><a href="#">'.$v['title'].'</a></li>';
//}
$grand_parent_level = array_filter( $menu_items, function($v, $k) use ($grand_parent) {
return $v['ID'] == $grand_parent;
}, ARRAY_FILTER_USE_BOTH );
$grand_parent_level_keys = array_keys($grand_parent_level);
$great_grand_parent = $grand_parent_level[$grand_parent_level_keys[0]];
if( !empty( $parent ) ) {
if( !empty( $great_grand_parent ) ) {
echo '<li class="custom-page-title">'.$great_grand_parent['title'].'</li>';
if (is_array($parent_level_items)) {
foreach ($parent_level_items as $k => $v) {
echo '<li><a href="'.$v['url'].'">'.$v['title'].'</a></li>';
}
}
} else {
echo '<li class="custom-page-title">'.$parent_level_items['title'].'</li>';
if (is_array($current_level_items)) {
foreach ($current_level_items as $k => $v) {
echo '<li><a href="'.$v['url'].'">'.$v['title'].'</a></li>';
}
}
}
}
//echo '3:';
//echo '<pre>';
//print_r($great_grand_parent);
//echo '</pre>';
}
?>
但是,如果菜单中有重复的(第 3 级)页面,则此脚本仅采用第一个父级...它可能是最后一个或真正的父级(可能来自 url 路径?)
菜单问题中的重复页面:
Home
> submenu1
>> sub3
> submenu
>> sub4
>> sub5 // current page
About
> about2
>> sub6
> about3
>> sub7
>> sub5 // duplicate page
当访问重复页面(sub5)时,返回的父页面是第一个(主页 > 子菜单),而应该是(关于 > about3)
请帮忙解决这个问题...
编辑:
要解决重复的情况,您必须添加一行代码。您可以根据要 select 的父链添加以下行之一。我还在实际代码中添加了这些行,以向您展示它们的去向。
// Get First Parent Chain
$current_level = array_values(array_slice($current_level, 0, 1));
// Get Last Parent Chain
$current_level = array_values(array_slice($current_level, -1, 1));
原答案:(也更新了以上几行)
此代码将为您提供所有级别的项目,它仅根据您的要求编写了三个级别,但您可以使用逻辑并根据需要将代码重复到尽可能多的级别,或者更好的是编写一些递归的东西。
$menu_name = 'topnav';
if ( ( $locations = get_nav_menu_locations() ) && isset( $locations[ $menu_name ] ) ) {
$menu = wp_get_nav_menu_object( $locations[ $menu_name ] );
$menu_items = wp_get_nav_menu_items( $menu->term_id );
// Convert Objects to Arrays, Enables us to use Array Filter
$json = json_encode($menu_items);
$menu_items = json_decode($json, true);
// Current Page
$child = get_the_id();
$current_level = array_filter( $menu_items, function($v, $k) use ($child) {
return $v['object_id'] == $child;
}, ARRAY_FILTER_USE_BOTH );
// Get First Parent Chain ( Uncomment below line if you want to use this )
//$current_level = array_values(array_slice($current_level, 0, 1));
// Get Last Parent Chain ( Uncomment below line if you want to use this )
//$current_level = array_values(array_slice($current_level, -1, 1));
$current_level_keys = array_keys($current_level);
$parent = $current_level[$current_level_keys[0]]['menu_item_parent'];
if( !empty( $parent ) )
{
$current_level_items = array_filter( $menu_items, function($v, $k) use ($parent) {
return $v['menu_item_parent'] == $parent;
}, ARRAY_FILTER_USE_BOTH );
} else {
$current_level_items = $current_level[$current_level_keys[0]];
}
echo '<pre>';
print_r($current_level_items);
echo '</pre>';
$parent_level = array_filter( $menu_items, function($v, $k) use ($parent) {
return $v['ID'] == $parent;
}, ARRAY_FILTER_USE_BOTH );
$parent_level_keys = array_keys($parent_level);
$grand_parent = $parent_level[$parent_level_keys[0]]['menu_item_parent'];
if( !empty( $grand_parent ) )
{
$parent_level_items = array_filter( $menu_items, function($v, $k) use ($grand_parent) {
return $v['menu_item_parent'] == $grand_parent;
}, ARRAY_FILTER_USE_BOTH );
} else {
$parent_level_items = $parent_level[$parent_level_keys[0]];
}
echo '<pre>';
print_r($parent_level_items);
echo '</pre>';
$grand_parent_level = array_filter( $menu_items, function($v, $k) use ($grand_parent) {
return $v['ID'] == $grand_parent;
}, ARRAY_FILTER_USE_BOTH );
$grand_parent_level_keys = array_keys($grand_parent_level);
$great_grand_parent = $grand_parent_level[$grand_parent_level_keys[0]];
echo '<pre>';
print_r($great_grand_parent);
echo '</pre>';
}
我尽量把它写得一目了然,但如果您有任何问题,我很乐意提供帮助。
我有一个 3 级导航:
Home
> submenu1
>> sub3
> submenu
>> sub4
>> sub5 // current page
About
> about2
>> sub6
> about3
>> sub7
我正在尝试分别获取每个导航级别,
使用上面的示例导航,在 sub5 页面上,我需要
当前一级导航:主页
当前并行二级导航:submenu1,submenu(都在主页下)
当前平行三级导航:sub4、sub5(子菜单下的菜单)
我将需要修改菜单的元素和样式,并且需要使用 php 中的菜单项,例如:
$menu_name = 'topnav';
if ( ( $locations = get_nav_menu_locations() ) && isset( $locations[ $menu_name ] ) ) {
$menu = wp_get_nav_menu_object( $locations[ $menu_name ] );
$menu_items = wp_get_nav_menu_items($menu->term_id);
foreach ( (array) $menu_items as $key => $menu_item ) {
$title = $menu_item->title;
$url = $menu_item->url;
[...]
请帮助单独显示导航层,如上所述。
我的第 1 级和第 3 级工作正常,但无法正确显示当前并行的第 2 级导航。
谢谢。
当前代码:第二个导航工程:
<?php
$menu_name = 'topnav';
if ( ( $locations = get_nav_menu_locations() ) && isset( $locations[ $menu_name ] ) ) {
$menu = wp_get_nav_menu_object( $locations[ $menu_name ] );
$menu_items = wp_get_nav_menu_items( $menu->term_id );
// Convert Objects to Arrays, Enables us to use Array Filter
$json = json_encode($menu_items);
$menu_items = json_decode($json, true);
// Current Page
$child = get_the_id();
$current_level = array_filter( $menu_items, function($v, $k) use ($child) {
return $v['object_id'] == $child;
}, ARRAY_FILTER_USE_BOTH );
$current_level_keys = array_keys($current_level);
$parent = $current_level[$current_level_keys[0]]['menu_item_parent'];
if( !empty( $parent ) )
{
$current_level_items = array_filter( $menu_items, function($v, $k) use ($parent) {
return $v['menu_item_parent'] == $parent;
}, ARRAY_FILTER_USE_BOTH );
} else {
$current_level_items = $current_level[$current_level_keys[0]];
}
//echo '1:';
//echo '<pre>';
//print_r($current_level_items);
//echo '</pre>';
//foreach ($current_level_items as $k => $v) {
// echo '<li><a href="#">'.$v['title'].'</a></li>';
//}
$parent_level = array_filter( $menu_items, function($v, $k) use ($parent) {
return $v['ID'] == $parent;
}, ARRAY_FILTER_USE_BOTH );
$parent_level_keys = array_keys($parent_level);
$grand_parent = $parent_level[$parent_level_keys[0]]['menu_item_parent'];
if( !empty( $grand_parent ) )
{
$parent_level_items = array_filter( $menu_items, function($v, $k) use ($grand_parent) {
return $v['menu_item_parent'] == $grand_parent;
}, ARRAY_FILTER_USE_BOTH );
} else {
$parent_level_items = $parent_level[$parent_level_keys[0]];
}
//echo '2:';
//echo '<pre>';
//print_r($parent_level_items);
//echo '</pre>';
//foreach ($parent_level_items as $k => $v) {
//echo '<li><a href="#">'.$v['title'].'</a></li>';
//}
$grand_parent_level = array_filter( $menu_items, function($v, $k) use ($grand_parent) {
return $v['ID'] == $grand_parent;
}, ARRAY_FILTER_USE_BOTH );
$grand_parent_level_keys = array_keys($grand_parent_level);
$great_grand_parent = $grand_parent_level[$grand_parent_level_keys[0]];
if( !empty( $parent ) ) {
if( !empty( $great_grand_parent ) ) {
echo '<li class="custom-page-title">'.$great_grand_parent['title'].'</li>';
if (is_array($parent_level_items)) {
foreach ($parent_level_items as $k => $v) {
echo '<li><a href="'.$v['url'].'">'.$v['title'].'</a></li>';
}
}
} else {
echo '<li class="custom-page-title">'.$parent_level_items['title'].'</li>';
if (is_array($current_level_items)) {
foreach ($current_level_items as $k => $v) {
echo '<li><a href="'.$v['url'].'">'.$v['title'].'</a></li>';
}
}
}
}
//echo '3:';
//echo '<pre>';
//print_r($great_grand_parent);
//echo '</pre>';
}
?>
但是,如果菜单中有重复的(第 3 级)页面,则此脚本仅采用第一个父级...它可能是最后一个或真正的父级(可能来自 url 路径?)
菜单问题中的重复页面:
Home
> submenu1
>> sub3
> submenu
>> sub4
>> sub5 // current page
About
> about2
>> sub6
> about3
>> sub7
>> sub5 // duplicate page
当访问重复页面(sub5)时,返回的父页面是第一个(主页 > 子菜单),而应该是(关于 > about3)
请帮忙解决这个问题...
编辑:
要解决重复的情况,您必须添加一行代码。您可以根据要 select 的父链添加以下行之一。我还在实际代码中添加了这些行,以向您展示它们的去向。
// Get First Parent Chain
$current_level = array_values(array_slice($current_level, 0, 1));
// Get Last Parent Chain
$current_level = array_values(array_slice($current_level, -1, 1));
原答案:(也更新了以上几行)
此代码将为您提供所有级别的项目,它仅根据您的要求编写了三个级别,但您可以使用逻辑并根据需要将代码重复到尽可能多的级别,或者更好的是编写一些递归的东西。
$menu_name = 'topnav';
if ( ( $locations = get_nav_menu_locations() ) && isset( $locations[ $menu_name ] ) ) {
$menu = wp_get_nav_menu_object( $locations[ $menu_name ] );
$menu_items = wp_get_nav_menu_items( $menu->term_id );
// Convert Objects to Arrays, Enables us to use Array Filter
$json = json_encode($menu_items);
$menu_items = json_decode($json, true);
// Current Page
$child = get_the_id();
$current_level = array_filter( $menu_items, function($v, $k) use ($child) {
return $v['object_id'] == $child;
}, ARRAY_FILTER_USE_BOTH );
// Get First Parent Chain ( Uncomment below line if you want to use this )
//$current_level = array_values(array_slice($current_level, 0, 1));
// Get Last Parent Chain ( Uncomment below line if you want to use this )
//$current_level = array_values(array_slice($current_level, -1, 1));
$current_level_keys = array_keys($current_level);
$parent = $current_level[$current_level_keys[0]]['menu_item_parent'];
if( !empty( $parent ) )
{
$current_level_items = array_filter( $menu_items, function($v, $k) use ($parent) {
return $v['menu_item_parent'] == $parent;
}, ARRAY_FILTER_USE_BOTH );
} else {
$current_level_items = $current_level[$current_level_keys[0]];
}
echo '<pre>';
print_r($current_level_items);
echo '</pre>';
$parent_level = array_filter( $menu_items, function($v, $k) use ($parent) {
return $v['ID'] == $parent;
}, ARRAY_FILTER_USE_BOTH );
$parent_level_keys = array_keys($parent_level);
$grand_parent = $parent_level[$parent_level_keys[0]]['menu_item_parent'];
if( !empty( $grand_parent ) )
{
$parent_level_items = array_filter( $menu_items, function($v, $k) use ($grand_parent) {
return $v['menu_item_parent'] == $grand_parent;
}, ARRAY_FILTER_USE_BOTH );
} else {
$parent_level_items = $parent_level[$parent_level_keys[0]];
}
echo '<pre>';
print_r($parent_level_items);
echo '</pre>';
$grand_parent_level = array_filter( $menu_items, function($v, $k) use ($grand_parent) {
return $v['ID'] == $grand_parent;
}, ARRAY_FILTER_USE_BOTH );
$grand_parent_level_keys = array_keys($grand_parent_level);
$great_grand_parent = $grand_parent_level[$grand_parent_level_keys[0]];
echo '<pre>';
print_r($great_grand_parent);
echo '</pre>';
}
我尽量把它写得一目了然,但如果您有任何问题,我很乐意提供帮助。