Como removo o UL no wp_nav_menu?

18

Pesquisei neste site e encontrei muitas respostas para esta pergunta. A maioria deles não está funcionando no meu tema.

Aqui está uma solução que encontrei e está funcionando de acordo com minha necessidade.

function wp_nav_menu_no_ul()
{
    $options = array(
        'echo' => false,
        'container' => false,
        'theme_location' => 'primary'
    );

    $menu = wp_nav_menu($options);
    echo preg_replace(array(
        '#^<ul[^>]*>#',
        '#</ul>$#'
    ), '', $menu);

}

Este código será removido ulno início e no final de wp_nav_menu(). Então, no meu tema, eu apenas escrevo

<ul class="primary-nav">
<?php  wp_nav_menu_no_ul(); ?>
</ul>

Mas o problema está voltando novamente quando eu não adiciono ou ativo nenhum menu via admin. http://domain.com/wp-admin/nav-menus.php

Pergunta:

Como removo <div><ul>**</ul></div>se o menu está ativo ou não. Avise-se me


Finalmente eu consegui :) functions.php

function wp_nav_menu_no_ul()
{
    $options = array(
        'echo' => false,
        'container' => false,
        'theme_location' => 'primary',
        'fallback_cb'=> 'default_page_menu'
    );

    $menu = wp_nav_menu($options);
    echo preg_replace(array(
        '#^<ul[^>]*>#',
        '#</ul>$#'
    ), '', $menu);

}

function default_page_menu() {
   wp_list_pages('title_li=');
} 

header.php

<ul class="primary-nav">
<?php  wp_nav_menu_no_ul(); ?>
</ul>
haha
fonte
Por que você deseja remover o UL quando o adiciona novamente? Você pode usar os parâmetros menu_classe menu_idpara definir um atributo de classe e / ou id no UL.
Eu quero usar superfish. menu_classe menu_idsó funcionará se o menu estiver ativado. Se o menu não existir menu_classe menu_idnão for como <ul>mas <div>. é por isso que muita dúvida sobre wp_nav_menu()você pode testá-lo :)
haha

Respostas:

11

A função wp_nav_menu aceita um argumento de fallback_cb, que é o nome da função a ser executada se o menu não existir. então mude seu código para algo assim:

function wp_nav_menu_no_ul()
{
    $options = array(
        'echo' => false,
        'container' => false,
        'theme_location' => 'primary',
        'fallback_cb'=> 'fall_back_menu'
    );

    $menu = wp_nav_menu($options);
    echo preg_replace(array(
        '#^<ul[^>]*>#',
        '#</ul>$#'
    ), '', $menu);

}

function fall_back_menu(){
    return;
}

você pode até remover o contêiner do menu e fazer outras coisas com mais alguns argumentos enviados para a função wp_nav_menu

Espero que isto ajude.

Bainternet
fonte
@ בניית אתרים - Obrigado pela sua explicação. Mas estou ficando borrado aqui. De acordo com a nota em nav-menu-template.php fallback_cb - If the menu doesn't exists, a callback function will fire. Defaults to 'wp_page_menu'. Set to false for no fallbackO que devo substituir para tornar o wp_nav_menu_no_ul()trabalho se eu definir falso para fallback_cb? Porque volta em branco por enquanto.
haha
Agora entendi :) Muito obrigado בניית אתרים. BTW, como pronuncio seu apelido? Meuha ha
haha
LOL, feliz que você vá.
Bainternet
Eu perguntava a mesma coisa, é hebraico eu assumir, o que seria uma tradução exata, por curiosidade .. :)
t31os
:) Sim, hebraico e seu apelido, eu peguei um tempo que, se traduzido corretamente, significa algo como "web design".
Bainternet 28/01
57

Na verdade, o WordPress suporta isso por padrão:

wp_nav_menu(array(
    'items_wrap' => '%3$s'
));

O padrão para items_wrapé <ul id=\"%1$s\" class=\"%2$s\">%3$s</ul>.

Martti Laine
fonte
3
Essa é a resposta correta. As outras respostas de fazer um achado programático e substituir para remover <ul>depois que ele já foi adicionado são apenas para trás
mikemike
'container' => falsese você quiser se livrar da embalagem <div>também.
George Dimitriadis
É verdade configurável no WordPress por padrão. Obrigado!
Abdalla Arbab
melhor resposta, sem necessidade de hack
Eman 02/02
isso não está funcionando para mim no wp 5.2
rafaelphp
3

Se você deseja imprimir apenas <a>tags, pode seguir este caminho:

$primaryMenu = array(
    'theme_location'  => 'primary',
    'menu'            => '',
    'container'       => '',
    'container_class' => false,
    'container_id'    => '',
    'menu_class'      => 'menu',
    'menu_id'         => 'primary-menu',
    'echo'            => false,
    'fallback_cb'     => 'wp_page_menu',
    'before'          => '',
    'after'           => '',
    'link_before'     => '',
    'link_after'      => '',
    'depth'           => 0,
    'walker'          => ''
);
echo strip_tags( wp_nav_menu( $primaryMenu ), '<a>' );
Pavlo Zamoroka
fonte
este trabalho é perfeito para mim, definir apenas `` items_wrap '=>'% 3 $ s '' não tem efeito no wp 5.2
rafaelphp
2

Para mim, o que funcionou foi o seguinte:

<?php wp_nav_menu( array(
       'container' => '',
       'items_wrap' => '%3$s' 
) ); ?>

Espero que ajude.

Pixel orbital
fonte