Уокер с разным выходом в подменю - PullRequest
0 голосов
/ 27 февраля 2019

У меня есть два разных подменю в моем главном меню.Я не хочу получать одинаковые выходные данные в обоих подменю от моего устройства навигации, поскольку я собираюсь реализовать две разные функции для каждой кнопки подменю.

Как получить два разных выхода, чтобы я мог выводить, например, <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 голосов
/ 27 февраля 2019

Если я вас правильно понял, вы хотите вывести разные кнопки, относящиеся к глубине пункта меню.Я думаю, самым простым способом вы могли бы просто проверить переменную $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.

Надеюсь, это поможет.

...