Php Wordpress中的当前级别导航
我有一个三级导航:Php Wordpress中的当前级别导航,php,wordpress,wp-nav-walker,wp-nav-menu-item,Php,Wordpress,Wp Nav Walker,Wp Nav Menu Item,我有一个三级导航: Home > submenu1 >> sub3 > submenu >> sub4 >> sub5 // current page About > about2 >> sub6 > about3 >> sub7 我试图分别获取每个导
Home
> submenu1
>> sub3
> submenu
>> sub4
>> sub5 // current page
About
> about2
>> sub6
> about3
>> sub7
我试图分别获取每个导航级别
对于上面的示例nav,在sub5页面上,我需要
当前一级导航:主页
当前平行二级导航:子菜单1,子菜单(谁都在主菜单下)
当前平行三级导航: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>';
}
?>
当访问重复页面(sub5)时,返回的父页面是第一个页面(主页>子菜单),而它应该是(关于>关于3)
请帮助修复此问题…编辑: 要解决重复的情况,您必须添加一行代码。可以根据要选择的父链添加以下行之一。我还在实际代码中添加这些行,以向您显示它们的位置 原始答案:(也用上述行更新) 此代码将为您提供所有级别的项目,它根据您的需求仅为三个级别编写,但您可以使用逻辑并根据需要将代码重复到任意多个级别,或者更好地编写一些递归的内容
$menu_name='topnav';
if($locations=get_nav_menu_locations())和&isset($locations[$menu_name])){
$menu=wp_get_nav_menu_object($locations[$menu_name]);
$menu\u items=wp\u get\u nav\u menu\u menu\u items($menu->term\u id);
//将对象转换为数组,使我们能够使用数组过滤器
$json=json_编码($menu_项);
$menu\u items=json\u decode($json,true);
//当前页
$child=获取_id();
$current\u level=array\u filter($menu\u项,函数($v,$k)use($child){
返回$v['object_id']==$child;
},数组\过滤器\使用\两者);
//获取第一个父链(如果要使用此项,请取消第行下方的注释)
//$current_level=数组_值(数组_切片($current_level,0,1));
//获取最后一个父链(如果要使用此项,请取消第行下方的注释)
//$current_level=数组_值(数组_切片($current_level,-1,1));
$current_level_keys=数组_keys($current_level);
$parent=$current_level[$current_level_keys[0]['菜单项_parent'];
如果(!空($parent))
{
$current\u level\u items=array\u filter($menu\u items,function($v,$k)use($parent){
返回$v['menu\u item\u parent']==$parent;
},数组\过滤器\使用\两者);
}否则{
$current_level_items=$current_level[$current_level_keys[0]];
}
回声';
打印(当前级项目);
回声';
$parent\u level=array\u filter($menu\u项,函数($v,$k)use($parent){
返回$v['ID']==$parent;
},数组\过滤器\使用\两者);
$parent_level_keys=数组_keys($parent_level);
$grand_parent=$parent_level[$parent_level_keys[0]['menu_item_parent'];
如果(!空($grand_parent))
{
$parent\u level\u items=array\u filter($menu\u items,function($v,$k)use($grand\u parent){
返回$v['menu\u item\u parent']==$grand\u parent;
},数组\过滤器\使用\两者);
}否则{
$parent_level_items=$parent_level[$parent_level_keys[0]];
}
回声';
打印(父级项目);
回声';
$grand\u parent\u level=数组过滤器($menu\u项,函数($v,$k)使用($grand\u parent){
返回$v['ID']=$grand\u parent;
},数组\过滤器\使用\两者);
$grand_parent_level_keys=数组_keys($grand_parent_level);
$great_grand_parent=$grand_parent_level[$grand_parent_level_keys[0]];
回声';
印刷品($great\u grand\u parent);
回声';
}
我试着写得一目了然,但如果您有任何问题,我会很乐意帮助您。您能分享一下您用于获得第一和第三等级的代码吗?您能直观地解释一下您正在谈论的案例吗?就像你在文章开头所做的那样。只是根据要求添加了一个视觉效果。它不会像这样工作。你不应该有重复项,如果你真的需要重复项,那么你必须选择第一个或最后一个父链。处理这个问题的最好方法是根本没有重复项。因为你要做的事情是不允许重复的。请考虑一下,两条链对一个项目都有效。如何选择一个路径,并且不应设置多个路径的样式。系统不知道您正在通过哪条路径,除非我们查看参考者,这将成为一个很长的故事。如果我在nav中处于第三级,则代码有效,但如果当前页面处于第二级,则代码无效。。。你能修改你的代码,使菜单项在所有级别都能工作吗?例如,如果我在“子菜单”(第二级)下,第一级导航应该是“主页”,第二级导航应该是“子菜单1,子菜单”,第三级导航应该是“sub4,sub5”,如果有两个菜单项链接到同一页面,父项不正确…@LucLaverdure该代码适用于所有级别。然而,重复的东西不是我测试过的东西。你能再解释一点吗,比如你问题中的用例?
Home
> submenu1
>> sub3
> submenu
>> sub4
>> sub5 // current page
About
> about2
>> sub6
> about3
>> sub7
>> sub5 // duplicate page
// 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>';
}