Redirigir a la URL canónica en WordPress

Cualquier tipo de contenido en WordPress, ya sea una entrada o una página, o un producto o una categoría de producto en WooCommerce, tiene una URL propia. Esa URL se define en base a lo que eliges en Ajustes, Enlaces permanentes; aunque puedes modificarlo con hooks como post_link por ejemplo. Cuando modificamos ese tipo de URL con ese tipo de filtros, también debemos ajustas las expresiones regulares que hacen que la consulta que se hace a través de la URL vaya a un tipo de contenido u otro.

¿Por qué os cuento esto? Porque en ocasiones, al hacer operaciones como quitar el slug de “producto” de la URL de de producto de WooCommerce, para mejorar el posicionamiento (esto se puede hacer con plugins como Premmerce Permalink Manager for WooCommerce), puedes empezar a sufrir el problema de que URL que no son la canónica, muestren el contenido, generándote URLs duplicadas para un mismo contenido, lo que se conoce como contenido duplicado.

Un ejemplo, estas dos URL podrían devolver el mismo contenido:

  • https://mitienda.com/ropa/abrigos
  • https://mitienda.com/ropa/abrigos-chaquetas/abrigos

Siendo la primera la correcta. Hay que tener cuidado cuando se toca la forma en que se genera la URL de los diferentes tipos de contenido, porque puedes generar este tipo de problemas.

Redirigir a las URL canónicas

Una forma de evitar esto es generar un pequeño trozo de código que cuando detecte este tipo de comportamientos lo resuelva. Para evitar que interactúe en cualquier petición, podemos aislarlo para que solo ejecute cuando veamos que existe el problema y está afectando a nuestro posicionamiento (por ejemplo cuando se trate de productos o categoría de productos). Luego averiguar cuál es la URL que se está usando, compararla con la URL canónica, la que debería ser y redireccionara en ese momento.

Dado que queremos que la consulta esté completamente ejecutada pero que todavía no se haya empezado a enviar el cuerpo HTML del cuerpo para poder hacer una redirección a través de la cabecera usando un wp_redirect(), debemos usar un hook como template_redirect que es el idóneo en estos casos.

Veamos el código:

add_action( 'template_redirect', function(){
	if( !is_product() && !is_product_category() )
		return;

	global $wp, $wp_query;
	$url_actual = home_url( $wp->request );

	if( substr( $url_actual, -1 ) !== '/') {
		$url_actual = $url_actual . '/';
	}
	
	if( is_product() ){
		if( $url_actual != wp_get_canonical_url() ){
			wp_redirect( wp_get_canonical_url() );
			die();
		}
	}
	
	if( is_product_category() && !$wp_query->is_paged() ){
		$canonical = get_term_link( get_queried_object() );

		if( $url_actual != $canonical ){
			wp_redirect( $canonical );
			die();
		}
	}
}, PHP_INT_MAX );

Algunos detalles importantes:

  • Para evitar ejecuciones innecesarias hacemos primeramente un chequeo para que solo ejecute en productos y categorías de producto que es donde tenemos localizado el problema
  • La URL que se está usando en ese momento por el usuario se obtiene a añadiendo al home_url() el request que se está haciendo que lo obtenemos del objeto global $wp
  • Si el último carácter no es una /, se lo añadimos para eso hacemos uso de substr para ver cuál es el último carácter
  • El cálculo de la URL canónica puede variar, en las categorías de producto por ejemplo la función wp_get_canonical_url() no sirve, así que tenemos que obtenerla usando la función get_term_link() y pasándole el term que se está viendo actualmente
  • En el caso de las categorías de producto tenemos que asegurarnos de que no sea una consulta paginada para evitar una redirección cuando se esté navegando por las páginas

Así que bueno, espero haberos ayudado con estos problemas que pueden surgir en algunos procesos de optimización SEO.

1 estrella2 estrellas3 estrellas4 estrellas5 estrellas (Ninguna valoración todavía)
Cargando…

Almacenamos las IPs desde la que se envían las valoraciones para evitar fraudes

0

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Carrito