Redirecionar Link com Categoria para Link do Post no WordPress

Se você usava um formato de links permamentes com a categoria, e por algum motivou (SEO, de repente), resolveu modificar a estrutura de links para unicamente o nome do artigo, talvez esteja se perguntando: Como irei redirecionar link com categoria para lindo post no WordPress? Fique sabendo que eu enfrentei este mesmo problema aqui no Profissionais Web. Estou fazendo uma bela modificação no Profissionais Web, inclusive quero abrir o blog aqui para Quest Posts e também para criação de Perfil, contudo, não gostei da estrutura de links que encontrei ao adquirir o site.

Por exemplo, a estrutura de links permanentes aqui do Profissionais Web estava gerando links do seguinte tipo:

http://fazer-site.net/nome-da-categoria/nome-do-post.html

ou ainda

http://fazer-site.net/nome-da-categoria/nome-da-subcategoria/nome-do-post.html

Só que eu prefiro utilizar o seguinte formato:

http://fazer-site.net/nome-do-post

Isso é facilmente alterado indo na seção Configurações >> Links Permanentes, o problema é que este site já possui várias páginas indexadas nos motores de busca como Google, Bing, Yahoo, etc… Então, ao fazer essa modificação nos links permamentes, os links antigos vão gerar o erro 404, que é o erro de arquivo não encontrado.

Redirecionar Link com Categoria para link do Post

Então como resolver isso? Como redirecionar algum que acessou o link antigo para o link novo? Bem, eu consegui contornar esse problema com o seguinte código PHP.

if(preg_match('/\/([a-zA-Z0-9-_\.]+)\.html/',$_SERVER['REQUEST_URI'],$nova_url)){

	$_SERVER['REQUEST_URI'] = "/" . $nova_url[1];
	
	header("HTTP/1.1 301 Moved Permanently");
	
	header("Location: $_SERVER[REQUEST_URI]");
	exit;
	
}

No código acima, a função preg_match verifica se a url de requisição casa com o critério “algo que seja alfanumérico ou underline ou ífen, precedido de uma barra / e que termine com .html, e caso case, salva na variável $nova_url as ocorrências e executa o código que está dentro do comando if.

Com isso, consigo pegar o link direto da página, sem as categorias. Na sequência, antes de redirecionar o usuário, atribuo um cabeçalho 301, que indica que a página foi movida permanentemente, portanto os mecanismos de busca devem indexar o novo url e não mais o antigo, sem isso, sua página poderia ser penalizada por ter conteúdo duplicado.

Ah, este código, você deve colocar no topo da página index.php, mas não o index.php do tema, e sim o index.php que fica no diretório principal do blog, para alguns será a pasta public_html ou www.

Se você não usou o .html ou uma extenção nos links permanentes antigos, o expressão fica um pouco mais complexa. Se não me engano, o WordPress gera links com até duas categorias no url, exemplo: /nome-da-categoria/nome-da-subcategoria/nome-do-post/, então uma idéia é casar três expressões, uma para categoria, outra para subcategoria e outra para o nome do post. Veja o código abaixo, comento depois:

$url_demo = "nome-da-categoria/nome-da-subcategoria/123-people/";

if(preg_match('/([a-zA-Z0-9-_\.]*)(\/*[a-zA-Z0-9-_\.]*)(\/[a-zA-Z0-9-_\.]+\/*$)/',$url_demo,$nova_url)){

	if(!empty($nova_url[1]) || !empty($nova_url[2])){
		echo "<pre>";
		print_r($nova_url);
		echo "</pre>";
	}
	
}

Aqui, o detalhe é usar o asterisco após os colchetes, o asterisco indica que é pra casar 0 ou mais vezes a o caractere ou conjunto de caracteres antecessores. Com isso, a expressão irá casar mesmo quando houver somente o url do post, atribuindo o valor vazio ao índice 1,2 do array. Feito isso, basta verificar se o valor do índice 1 ou 3 não estão vazios, caso não estejam é porque é um url contendo ou uma categoria ou uma categoria e uma subcategoria.

O problema no código acima é que ele vai casar uma url de: tag e categoria, por exemplo: /tag/nome-da-tag/ e também: /category/nome-da-categoria/

Para contornar isso, uma idéia é utilizar a seguinte expressão regular, comento depois:

/^\/(?!tag\/)(?!category\/)([a-zA-Z0-9-_\.]*)(\/*[a-zA-Z0-9-_\.]*)(\/[a-zA-Z0-9-_\.]+\/*$)/

Neste caso, o acento circunflexo indica que deve casar uma barra no início e as expressões (?!tag\/) e (?!category\/) irão casar qualquer coisa que não seja /tag/ ou /category/, porém essa expressão já não irá mais casar o url direto de um post, isso ocorre porque o (\/[a-zA-Z0-9-_\.]+\/*$) obriga a existir uma barra seguida de algo. Então, usando essa ideia, não é mais necessário verificar se o índice 1 e 2 da nova_url estão vazios.

Mas e se você quisesse excluir todas as tags do blog, como proceder? Bem, se fizer isso, você não deve simplesmente redirecionar todas as tags para a home do site pois poderá ser penalizado pelos mecanismos de busca. Se você tiver poucos posts, poderá redirecionar permanentemente até umas 3 tags. Aqui, o trabalho seria manual, ou seja, verificar qual post possui conteúdo mais relevante para determinada tag e fazer um redirecionamenot 301. Mas se você possui muitos posts e muitas tags, e quer parar definitivamente de utilizar tags (Vou escrever um post sobre esse tema em breve), uma idéia que tive foi a seguinte:

Redirecionar Link de Tags Excluídas para a Home do teu BLog

Talvez você esteja pensando que eu estou indo contra o que acabei de falar acima, porém note que a idéia aqui não é fazer um redirecionamento direto para a home do site, o que poderia sim ser penalizado pelo GOogle, mas a idéia é criar uma pasta chamada “tag” no teu servidor web remoto, e a partir daí, capturar todas as requisições a partir de urls de tags. Na página única, em vez de redirecionar o usuário para a página principal do teu site automaticamente, você pode executar um javascript informando a ela que as tags formam excluídas e informando que ela será redirecionada para a index do site assim que clicar no botão “OK”.

Ah, se você está pensando em utilizar o rel=”canonical” nessa página, é melhor tirar seu cavalo da chuva, pois essa prática também é punida pelos mecanismos de buscas, pois compreendem que é um tentativa de tornar a página principal do site uma “super página” com todos os pontos (pagerank) das páginas das tags.

Vamos ao passo a passo:

a) Crie um pasta no teu servidor web, no diretório principal, chamada tag
b) Crie uma página index.php, coloque o seguinte código nela:

<?php
require_once("../wp-blog-header.php");

$title = $_SERVER&#91;'REQUEST_URI'&#93;;
?>
<html xmlns="http://www.w3.org/1999/xhtml" dir="ltr" lang="pt-BR">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title><?php echo $title?></title>
</head>
<body>
<script type="text/javascript" charset="iso-8859-1">
	alert("Olá, Desculpe-nos o inconveniente, mas esta página foi removida.\nO objetivo é melhorar a Otimização deste site.\nClique no botão OK para acessar a Home do Site!");document.location='<?php echo get_bloginfo('siteurl')?>';
</script>

<h1><?php echo $title;?></h1>

A página que você estava procurando <?php echo $title;?> não está mais disponível, acesse a home do nosso site para encontrar o que você procura. 
<br>
<a href="<?php echo get_bloginfo('siteurl')?>" style="font-size:36px">Ir para a HOME</a>

</body>
</html>

c) Envie essa página index.php para dentro da pasta tag.

d) Crie um arquivo chamado .htaccess, e coloque o seguinte código nele:

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /tag/
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /tag/index.php [L]
</IfModule>
# END WordPress

Envie este arquivo para dentro da pasta tag no servidor remoto.

Isso é tudo, agora quando um usuário tentar acessar uma url de alguma tag, verá a seguinte mensagem:

redirecionar link tag para home do blog

Note que, caso o usuário tenha desativado o javascript no navegador dele, ele irá ver uma mensagem como esta:

redirecionar-link-com-categoria-para-link-direto-do-post

Com isso, ele poderá optar por acessar a home do teu site clicando no link “Ir para a Hom”. Note que você pode alterar a mensagem tanto do alert como do texto no corpo da página, isso fica a seu critério. Ah, um detalhe é que, diferente da página 404.php, você terá um título diferente para cada tag não mais existente.

Após fazer isso, você deve desativar a indexação das tags do blog, em breve vou criar um artigo aqui falando sobre isso. Agora, tenha em mente que utilizando este script, todas as tags (excluídas ou não), não mais serão acessíveis, pois o script irá redirecionar todos os acessos às páginas das tags para a home do site ou blog.

Se você for eliminar todas as categorias do teu blog WordPress, poderá utilizar a mesma idéia sugerida para as tags, por exemplo: criar uma pasta chamada category e colocar o mesmo script dentro dela.

Conclusão

Redirecionamentos devem ser usados com critérios, redirecionar todas as páginas de tags ou categorias para uma única url, poderá levar seu site a ser penalizado pelos motores de busca, pois eles entendem que você está querendo se aproveitar dos direcionamentos para transferir créditos de várias páginas para uma única página, tornando essa única página uma super página. O mesmo é válido para o uso de rel=”canonical”.

Até o próximo artigo aqui no Profissionais Web

Uma resposta a Redirecionar Link com Categoria para Link do Post no WordPress

  • Não entendo muito de expressões regulares, mas deu para entender bem o uso alí.

    Até mais.

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *