start_lvl игнорируется в пользовательском walker_nav_menu

8

Это мой первый проект с участием WordPress, и я застрял, пытаясь создать пользовательский инструмент для меню нижнего колонтитула.

Я в основном хочу изменить меню со <ul> <li></li> </ul>структуры на <p> <span></span> </p>структуру.

Меню и прочее отображает файл , и я был в состоянии настроить start_elи end_elфункции без проблем , так что я теперь получить это:

<ul> <span>*link*</span> <span>*link*</span> </ul>

Что, очевидно , на полпути, я не написал start_lvl()и end_lvl()теги , как показано ниже , но они игнорируются WordPress - ничего я помещал в них (даже die()) выполняется (что немного подозрительно) , но я знаю , что класс вызывается из start_el()функция.

function start_lvl(&$output, $depth = 0, $args = array()) {
    $output = "\n<p class=\"sub-menu\">\n";
}

function end_lvl(&$output, $depth = 0, $args = array()) {
    $output .= "\n</p>\n";
}

Кто-нибудь знает, почему это происходит - я пропустил что-то действительно очевидное !?

Я использую последнюю версию WordPress на Apache с PHP, 5.3.6если это поможет.

Заранее спасибо,

Феликс :)

fenfe1
источник
1
Исходя из того, что вы показали, все очевидные вещи выглядят правильно.
Тотелс
Перекрестная ссылка wordpress.org/support/topic/...
Ian Dunn

Ответы:

8

Ваш класс my_extended_walker в порядке, но при вызове функции wp_nav_menu используйте параметр items_wrap .

wp_nav_menu( array( 'items_wrap' => '<p>%3$s</p>', 'walker'=>new my_extended_walker() ) );

Start_lvl используется для дочерних элементов.

stillatmylinux
источник
2
Start_lvl используется для дочерних элементов. ты просто спас много вещей в моей жизни
ашутош
3

Хорошо, не уверен, что я прочитал неправильно, когда опубликовал это, но весь ваш класс должен выглядеть примерно так:

class my_extended_walker extends Walker_Nav_Menu {
    function start_lvl(&$output, $depth = 0, $args = array()) {
        $output .= "\n<p class=\"sub-menu\">\n";
    }

    function end_lvl(&$output, $depth = 0, $args = array()) {
        $output .= "\n</p>\n";
    }
}

А затем передать «ходок» в качестве параметра при вызове wp_nav_menu

wp_nav_menu( array( 'walker'=>new my_extended_walker() ) );

Если у вас есть это, вы должны быть в порядке. Я смотрю на рабочий код, который делает именно это. Я не знаю, как разместить там <p>теги. Вы можете получить неверную разметку.

s_ha_dum
источник
Привет, да, я сделал это ниже полный класс,
fenfe1
класс BB_Nav_Footer_Walker extends Walker_Nav_Menu {функция start_lvl (& $ output, $ deep = 0, $ args = array ()) {$ output = "\ n <p class = \" подменю \ "> \ n"; } function end_lvl (& $ output, $ deep = 0, $ args = array ()) {$ output. = "\ n </ p> \ n"; }}
fenfe1
Я попытался использовать <div>вместо того, <p>чтобы просто посмотреть, смогу ли я заставить эти функции делать что-нибудь, но пока что нет радости :(
fenfe1
<div>И <p>не должны нарушать Уолкера , но может привести к недопустимой разметкой. У вас есть $output =и не $output .=по вашему start_lvl. Это может вызвать проблемы. Это полный Уокер, который вы опубликовали?
s_ha_dum
Привет да я констатировала .=битое это теперь полный класс (я удалил start_lvl()и end_lvl()функцию , чтобы увидеть , если они сделали разницу) - pastebin.com/zfcBxHd8
fenfe1
2

Задумывались ли вы о получении всех пунктов меню навигации с помощью встроенной функции: wp_get_nav_menu_items();и выводе содержимого вручную?

Пример :: Создание простого списка меню

    // Get the nav menu based on $menu_name (same as 'theme_location' or 'menu' arg to wp_nav_menu)
    // This code based on wp_nav_menu's code to get Menu ID from menu slug

    $menu_name = 'custom_menu_slug';

    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);

    $menu_list = '<ul id="menu-' . $menu_name . '">';

    foreach ( (array) $menu_items as $key => $menu_item ) {
        $title = $menu_item->title;
        $url = $menu_item->url;
        $menu_list .= '<li><a href="' . $url . '">' . $title . '</a></li>';
    }
    $menu_list .= '</ul>';
    } else {
    $menu_list = '<ul><li>Menu "' . $menu_name . '" not defined.</li></ul>';
    }
    // $menu_list now ready to output
Майкл Эклунд
источник