Recentemente precisei alterar a estrutura das minhas urls no WordPress, o link estava configurado para ser na raiz do meu site e eu precisava que o novo formato tivesse a categoria. A estrutura do link permanente estava /%postname%/ e agora no novo formato seria /%category%/%postman%/. Um exemplo prático:

  • Link antigo: https://marquesfernandes.com/o-que-e-python-e-pra-que-serve/
  • Link novo: https://marquesfernandes.com/desenvolvimento/o-que-e-python-e-pra-que-serve/

Se você apenas alterar a estrutura e não redirecionar, todos os links antigos vão direcionar para uma página de Erro 404 – Página Não Encontrada. Então como fazer essa alteração sem quebrar os links já criados e indexados no Google?

O que precisamos fazer é tentar capturar a URL que causaria o erro 404 e tentar localizar o novo link permanente da postagem. Se nenhum link for encontrado, ai sim exibiremos a página de não encontrado. O método é bem simples, desde que na sua URL antiga exista algo que possamos utilizar para buscar o link novo, como, por exemplo, o /%postname%/, poderemos encontrar e redirecionar para a página correta.

Para isso adicionaremos o seguinte script no arquivo functions.php do tema ativo do WordPress:

add_action( 'template_redirect', 'maybe_redirect_404_old_permalink' );

function maybe_redirect_404_old_permalink() {
    // Apenas executa essa função se for uma página de 404
    if( ! is_404() ) {
        return;
    }
 
    // Truque para pegar a URL completa
    $url = add_query_arg( '', '' );

    // Pegamos a parte referente ao %postname%
    $parts = explode( '/', $url );
    $parts = array_filter( $parts );
    $size = count( $parts );
    $maybe_slug = $parts[ $size ];

    // Tentamos localizar o novo link no banco de dados
    $args = array(
        'name'        => $maybe_slug,
        'post_type'   => 'post',
        'post_status' => 'publish',
        'numberposts' => 1,
    );

    $posts = get_posts( $args );

    // Encontramos o post
    if( $posts && ! empty( $posts[0]->ID ) ) {
        $post_id = $posts[0]->ID;

        $post_url = get_permalink( $post_id );

        // Redirecionamos para a nova URL com o status de redirecionamento permanente 301
        if( $post_url ) {
            wp_safe_redirect( $post_url, 301 );
        }
    }

  // Se chegar até aqui é porque nenhum post realmente foi encontrado
// e a página de 404 será exibida
}

Agradecimentos ao Ben Lobaugh, criador original dessa solução!

5 1 voto
Nota do Artigo
Subscribe
Notify of

2 Comentários
newest
oldest most voted
Inline Feedbacks
View all comments
1 ano atrás

Muy buen aporte.

3 anos atrás

igmGuru Online Training is nuts

wpDiscuz
2
0
Would love your thoughts, please comment.x