Canonical links em Drupal 7

O que fazer quando estão duplicados os canonical links no Drupal 7?

Antes de colocar um projeto no ar, verifico sempre se todos os links dentro das páginas estão corretos, se não existem imagens perdidas ou ainda se algum erro de digitação pode comprometer o trabalho. Não existe nada pior que se dedicar arduamente num website e depois aparecerem links quebrados ou ainda aquelas imagens do navegador indicando que ali era para ter uma imagem.

Em meu último projeto não foi diferente. Digitei a URL no W3C Link Checker e saí para pegar uma xícara de café. Depois de cinco minutos aparecem vários links quebrados no relatório da ferramenta. Verificando no meu projeto, não encontrava os links quebrados e acreditando ser algo da ferramenta, resolvi verificar com outra, desta vez o LinkChecker. Resultado: os mesmos problemas.

Parei então para verificar o código-fonte de algumas páginas reportadas com erro e nele estavam os links canonical duplicados; um com a URL correta (como deveria ser) e outro com a URL errada, onde era acrescentado o prefixo do idioma da página duas vezes. O primeiro link eu sabia quem estava gerando: o módulo Metatag, ótimo para atender as necessidades de SEO de qualquer website em Drupal. Mas e o segundo de onde vinha? Comecei a desabilitar módulos que poderiam estar interfirindo no mesmo (como o Global Redirect) e assim mesmo não sumia o segundo link.

Numa busca na web, encontrei o segredo: o Drupal 7 coloca automaticamente o link canonical no cabeçalho das páginas mas, por algum motivo estranho (e que não quis procurar mais a fundo), ele não trabalha bem em sites multi idiomas (que gerava a URL errada) e como o módulo Metatag estava habilitado, todas as páginas ficavam com dois links canonical, o que certamente iria confundir os motores de busca. Pior que isso; o link que estava sendo gerado pelo Drupal era relativo e não absoluto (e deve ser absoluto), uma situação somente resolvida com a remoção do comentário da linha base url do arquivo settings.php. Então a solução final era desaparecer com este link gerado automaticamente e usar somente o fornecido pelo módulo Metatag. Mas como?

O pulo do gato: desativar na força os links canonical.

A parte de cabeçalho das páginas geradas pelo Drupal 7 usa o arquivo html.tpl.php (não existia no D6) que facilita bastante o trabalho de criar um tema para Drupal. Dentro deste arquivo existe a variável $head, responsável por todas as informações que vão no cabeçalho de uma página (meta tags e outras coisas). Desta forma, comentar ou eliminar esta variável não seria a solução correta (exceto se quisesse fazer no braço todas as inserções de meta tags) pois certamente outras tags importantes seriam eliminadas junto. Então para chegar no intento, uma visita na API do Drupal resolveu a questão: o hook html_head_alter. Com ele e uma pequena função no arquivo template.php estava resolvido o problema.

function mytheme_html_head_alter(&$head_elements){
    unset($head_elements['drupal_add_html_head_link:canonical:</node/1>;']);
}

O código acima resolveu em partes pois somente serve para o node 1. E para os outros? Como fazer? A resposta está aqui:

function mytheme_html_head_alter(&$head_elements){
    foreach (preg_grep('/^drupal_add_html_head_link:canonical:</', array_keys($head_elements)) as $key) {
        unset($head_elements[$key]);
    }
}

Com um laço e uma expressão regular a função torna-se funcional para todas as páginas do site que agora podem ter seus links canonical gerenciados pelo módulo Metatag. O mesmo é válido para outros elementos que são acrescentados no cabeçalho, sendo somente necessário acrescentar um outro laço para o elemento que deseja (que pode ser descoberto com o uso de um simples print_r($head_elements); na função.

Se você enfrenta o mesmo problema, cole a função acima em seu arquivo template.php alterando o “mytheme” pelo nome de seu tema e seja feliz. Mas não esqueça de instalar algum módulo que cria e/ou gerencia os links canonical pois eles são importantes para um bom SEO.

Boa sorte.