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

YouTube sem cookie: adiar o embed do vídeo e do Maps até o aceite

Seu banner de consentimento está certo, mas o vídeo incorporado grava cookie de terceiro no primeiro carregamento. Troque o domínio…

8 horas atrás

Custom post type dando 404: flush_rewrite_rules na ativação do plugin

A listagem do custom post type abre e o single dá 404 no WordPress 6.9. Entenda o cache das rewrite…

2 dias atrás

systemd timer no lugar do cron: agendar script com log e sem execução dupla

Um par .service e .timer substitui a linha do crontab com log no journal, execução perdida recuperada no boot e…

2 dias atrás

Descrição em massa no WooCommerce: wp eval-file lendo a lista de SKUs

400 produtos importados do fornecedor com a aba Descrição vazia. Um wp eval-file percorre os SKUs sem texto, grava pelo…

2 dias atrás

Frete grátis no WooCommerce: esconder as outras opções de entrega

Some com PAC e SEDEX da lista quando o frete grátis está disponível, usando woocommerce_package_rates, e limpe o cache de…

3 dias atrás

Erro HTTP no WordPress ao enviar imagem para a biblioteca de mídia

A barra de upload chega no fim e o WordPress devolve só "Erro HTTP". Separe as três causas: Imagick barrado…

3 dias atrás