我的主菜单中有两个不同的子菜单。我不想在walker的两个子菜单上都有相同的输出,因为我要在每个子菜单按钮上实现两个不同的功能。
如何获得两个不同的输出,以便可以在第一个子菜单上输出<button @click="function1">First Button</button>
,在第二个子菜单上输出<button @click="function2">Second Button</button>
?
menu.php
<?php wp_nav_menu(array(
'menu' => 'Main Navigation',
'container' => false,
'items_wrap' => '<ul class="main-menu">%3$s</ul>',
'walker' => new m2o_walker_nav_menu()
));
functions.php
class m2o_walker_nav_menu extends Walker_Nav_Menu {
public function start_lvl(&$output, $depth = 0, $args = array())
{
$indent = str_repeat("\t", $depth);
$output .= "\n$indent<button>First Button</button><ul class=\"sub-menu\">\n";
}
public function end_lvl( &$output, $depth) {
$indent = str_repeat("\t", $depth);
$output .= "$indent</ul>\n";
}
}
我尝试对$depth
使用条件语句。但似乎深度相同,因此两者的输出都相同。有人知道$depth
为何无法正常工作吗?
答案 0 :(得分:0)
如果我对您的理解正确,那么您想输出与菜单项的深度有关的不同按钮。我想以最简单的方式,您可以检查$depth
变量并更改按钮的文本。
快速解决方案:
public function start_lvl(&$output, $depth = 0, $args = array()) {
$indent = str_repeat("\t", $depth);
$buttontext = 'First Button';
if ($depth == 2) {
$buttontext = 'Second Button';
}
if ($depth == 3) {
$buttontext = 'Third Button';
}
if ($depth == 4) {
$buttontext = 'Fourth Button';
}
$output .= "\n$indent <button>$buttontext</button><ul class=\"sub-menu\">\n";
}
您可以使用更多变量来扩展它(例如onClick操作)。或者更干净的方法是在m2o_walker_nav_menu内创建一个新方法,该方法根据按钮的深度返回代表按钮的变量。
更清洁的解决方案:
public function start_lvl(&$output, $depth = 0, $args = array()) {
$indent = str_repeat("\t", $depth);
$buttondata = self::getButtonData($depth);
$output .= "\n" . $indent . "<button onClick='" . $buttondata['action'] . "'>" . $buttondata['text'] . "</button><ul class=\"sub-menu\">\n";
}
public static function getButtonData($depth) {
$buttons = [
[
'text' => 'First Button',
'action' => 'myFirstFunction'
],
[
'text' => 'Second Button',
'action' => 'mySecondFunction'
],
[
'text' => 'Third Button',
'action' => 'myThirdFunction'
]
];
return $buttons[$depth];
}
请记住,这是未经测试的,因为我没有安装wordpress。
我希望有帮助。