Aqui você encontrará meus projetos, dicas e pesquisas saiba mais

Remover link de um menu ativo no wordpres

O problema

Já dizia Felipe Memória: “Usuários não são hamsters”.

Segundo ele, é recomendável desativarmos os links da própria página que estamos. Isso evita o erro do usuário clicar nele, acreditando que haverá alguma mudança, quando na verdade apenas irá atualizar o conteúdo da página que se está.

Se não desativarmos o link, o usuário corre o risco de ficar clicando, clicando e pensando que poderá sair para algum lugar, quando na verdade não irá a lugar algum.

A solução

Ok, e no wordpress, como isso funciona?

Bom, sou iniciante no wordpress, portanto esta dica pode não ser a melhor solução, mas foi a única que encontrei até agora. Esta dica serve para o wordpress 3.1, não testei com versões anteriores, porém não deve haver muita diferença exceto na localização da linha de código citada abaixo.

O wordpress por padrão não implementa esta funcionalidade de desativar o link da página que se está, então pesquisando um pouco no seu código fonte cheguei até o arquivo que gera os links do menu superior. O nome do arquivo é “post-template.php” e fica localizado na pasta wp-includes.

Na linha 1038 você encontrará o seguinte:

$output .= $indent . '
	<li class="' . $css_class . '"><a title="' . esc_attr( wp_strip_all_tags( apply_filters( 'the_title', $page->post_title, $page->ID ) ) ) . '" href="' . get_permalink($page->ID) . '">' . $link_before . apply_filters( 'the_title', $page->post_title, $page->ID ) . $link_after . '</a>';

substitua por:

                if ($page->ID == $current_page || ($current_page == 0) && $page->menu_order == 0 )
                    $output .= $indent . '
	<li class="' . $css_class . ' current_page_item">'. $link_before . apply_filters( 'the_title', $page->post_title, $page->ID ) . $link_after;
                else
                    $output .= $indent . '</li>
	<li class="' . $css_class . '"><a title="' . esc_attr( wp_strip_all_tags( apply_filters( 'the_title', $page->post_title, $page->ID ) ) ) . '" href="' . get_permalink($page->ID) . '">' . $link_before . apply_filters( 'the_title', $page->post_title, $page->ID ) . $link_after . '</a>';

Fica um pouco difícil de entender o código acima a primeira olhada, pois a identação aqui no wordpress não é muito boa. Porém, olhando com mais cautela veremos que apenas adicionei uma condição para criação do link. Se satisfeita ele não cria o link, do contrário, funciona normalmente como o padrão do wordpress (gera o link).

Vamos entender a condição para que o link não seja criado. Inicialmente devemos entender que $page->ID contém a ID da página que estamamos trabalhando, e $current_page contém a ID da página ativa, ou seja, se o usuário clicou no menu “Programação” que é uma página, que contém a id 10, $current_page terá o valor 10. Já $page->ID varia seus valores de acordo com cada item (página) do menu.

A primeira condição do if é satisfeita quando o ID do menu que está sendo renderizado é igual ao ID do menu ativo. Até aqui temos a solução parcial. Ou seja, se a página atual é a página ativa, então remova o link do menu correspondente.

Porém vamos supor os seguintes menus: Início, Programação e Eletrônica. Quando o usuário clicar em algum deles a condição acima citada será aceita e determinado menu será desativado. Ok Paulo, mas então o por que a segunda condição?

Imaginemos que queremos que o menu Início ative-se ao entrar no domínio www.paulotrentin.com.br e não apenas ao entrar em www.paulotrentin.com.br/inicio. Neste caso a condição acima não será satisfeita, pois $current_page terá valor 0. Aqui entra a segunda parte da condição if. Caso a página atual ($current_page) seja 0 (ou seja, o usuário está em www.paulotrentin.com.br), e o menu de renderização atual esteja na ordem 0 (o primeiro menu), então remova o link.

É de suma importância que utilizemos o opção de ordenação dos menus, sendo 0 o primeiro menu e acima disto os outros.

Conclusão

Esta solução é específica para meu caso, onde o primeiro link é o link do início e desejo que este se desative por padrão ao entrar no site pelo domínio principal. Melhorias podem ser feitas, tenho certeza de que pode existir um método melhor que este, porém não o encontrei ainda.

Deixe um comentário