SEO

Canonical errado no Yoast: corrigindo pelo filtro wpseo_canonical

Search Console avisando “Página alternativa com tag canônica adequada” em URL que você quer indexada costuma ter um culpado só: alguém mandou a /page/2/ apontar a canônica para a página 1. O Yoast expõe essa URL num filtro e dá para consertar no functions.php do tema filho.

Confira o que está saindo no HTML

Antes de escrever código, olhe a tag que o servidor entrega. Nada de inspecionar no navegador, que plugin de cache pode mentir:

curl -s https://sualoja.com.br/loja/page/2/ | grep -i canonical

O filtro wpseo_canonical

O filtro recebe a URL que o Yoast montou (no Yoast 27 vem a presentation como segundo argumento) e imprime o que você devolver. Retornando false, a tag não sai.

add_filter( 'wpseo_canonical', function ( $canonical ) {
    // URL de filtro de loja: consolida na vitrine, sem os parâmetros
    if ( function_exists( 'is_shop' ) && is_shop() && ! empty( $_GET['filter_cor'] ) ) {
        return get_post_type_archive_link( 'product' );
    }

    // paginação: cada página aponta para ela mesma
    if ( is_paged() ) {
        return get_pagenum_link( (int) get_query_var( 'paged' ) );
    }

    return $canonical;
}, 20 );

A ordem das duas condições não é gosto pessoal. O get_pagenum_link() remonta a URL a partir da requisição atual e devolve a query string junto, então em /loja/page/2/?filter_cor=azul ele entregaria uma canônica com o parâmetro dentro. Por isso o teste do filtro vem primeiro.

A origem do problema costuma ser tema ou plugin de filtro reescrevendo a canônica para evitar conteúdo duplicado, e consolidando toda a paginação na página 1. O Google lê como “a página 2 é a mesma coisa que a 1” e para de indexar o que só aparece no fim da lista.

A armadilha do cache

Depois de salvar o arquivo, limpe o cache de página e rode o curl de novo. Já perdi tempo achando que o filtro não tinha pegado quando o problema era HTML velho no disco. E cuide de dois detalhes: o filtro roda em toda requisição de front, então deixe as condicionais apertadas, e devolva sempre URL absoluta, porque o Yoast imprime a string que você retornar.

Se travou nisso e precisa de ajuda, me chama aqui.

Post Recentes

Bloquear .env e .git no nginx: as regras que ainda deixam o arquivo vazar

Negar /.env no nginx parece resolvido até alguém pedir /wp-content/uploads/.env ou backup.sql. As regras que testei e os furos que…

11 horas atrás

Layout XML do Magento 2: remover bloco de módulo de terceiro

Um módulo de terceiro plantou um banner no topo da loja e você não quer desinstalar nada: tire o bloco…

23 horas atrás

Restaurar dump do Magento 2 em outro servidor: trocar a base_url no SQL

Importou o banco de produção e o site pula para o domínio antigo? Rode o UPDATE em core_config_data, limpe o…

2 dias atrás

Criar exceção customizada em PHP: quando estender Exception compensa

Seu catch trata pedido inexistente e banco fora do ar do mesmo jeito. Veja como criar exceção customizada em PHP…

3 dias atrás

DataProvider Magento 2: form do admin abre com campos vazios ao editar

O form do admin salva mas abre em branco na edição: veja o getData() indexado pelo id da entidade e…

4 dias atrás

register_post_meta com show_in_rest: campo personalizado no /wp-json

O meta está no banco mas some do /wp-json/wp/v2/posts. Veja o register_post_meta certo, com single, type, schema de array e…

4 dias atrás