Walker在子菜单上具有不同的输出

时间:2019-02-27 13:32:25

标签: php wordpress wp-nav-walker

我的主菜单中有两个不同的子菜单。我不想在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为何无法正常工作吗?

1 个答案:

答案 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。

我希望有帮助。