start_lvl ignorado no costume walker_nav_menu

8

Este é o meu primeiro projeto envolvendo o WordPress e estou tentando criar um andador personalizado para um menu de rodapé.

Eu basicamente quero mudar o menu da <ul> <li></li> </ul>estrutura para uma <p> <span></span> </p>estrutura.

O menu e outras coisas estão exibindo o arquivo e eu pude ajustar as funções start_ele end_elsem problemas, então agora entendi o seguinte:

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

Obviamente, a meio caminho, escrevi as tags start_lvl()e end_lvl()como mostrado abaixo, mas elas são ignoradas pelo WordPress - nada que eu coloque nelas (mesmo die()) é executado (o que é um pouco suspeito), mas eu sei que a classe está sendo chamada por causa de a start_el()função

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";
}

Alguém sabe por que isso está acontecendo - eu perdi algo realmente óbvio !?

Estou executando a versão mais recente do WordPress no Apache com PHP, 5.3.6se isso ajudar.

Desde já, obrigado,

Felix :)

fenfe1
fonte
1
Com base no que você mostrou, todas as coisas óbvias parecem corretas.
totels 15/11/12
Referência cruzada wordpress.org/support/topic/…
Ian Dunn

Respostas:

8

Sua classe my_extended_walker está OK, mas quando você chamar a função wp_nav_menu , use o parâmetro items_wrap .

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

O start_lvl é usado para elementos filhos.

stillatmylinux
fonte
2
O start_lvl é usado para elementos filhos. você acabou de salvar um monte de coisas na minha vida
ashutosh
3

Ok, não sei o que li errado quando postei isso, mas toda a sua classe deve ser algo como isto:

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";
    }
}

E depois passe o 'walker' como parâmetro quando você chamar wp_nav_menu

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

Se você tem isso, deve ficar bem. Eu estou olhando para o código de trabalho que faz exatamente isso. Não sei como colocar <p>tags lá. Você pode receber uma marcação inválida.

s_ha_dum
fonte
Oi, sim eu fiz isso abaixo é a classe integral,
fenfe1
classe BB_Nav_Footer_Walker estende Walker_Nav_Menu {function start_lvl (& $ output, $ depth = 0, $ args = array ()) {$ output = "\ n <p class = \" submenu \ "> \ n"; } função end_lvl (& $ output, $ depth = 0, $ args = array ()) {$ output. = "\ n </p> \ n"; }}
Fenfe1
Eu tentei usar <div>, em vez de <p>apenas para ver se eu posso obter essas funções para fazer qualquer coisa, mas até agora nenhuma alegria :(
fenfe1
O <div>e <p>não deve interromper o Walker, mas pode resultar em marcação inválida. Você tem $output =e não está $output .=no seu start_lvl. Isso pode estar causando problemas. Esse é o Walker completo que você postou?
2010
Oi sim, eu fixo o .=pouco isto agora é a classe completo (eu removi o start_lvl()e end_lvl()funções para ver se eles fizeram uma diferença) - pastebin.com/zfcBxHd8
fenfe1
2

Você já pensou em buscar todos os itens do menu de navegação usando a função wp_get_nav_menu_items();interna : e em gerar manualmente o conteúdo?

Exemplo :: Criando lista de menus simples

    // 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
Michael Ecklund
fonte