url parámetros

Como convertir parámetros por GET en URLs amigables

Es muy habitual pasar parámetros por $_GET a una página para procesar algo, o simplemente para mostrar un contenido u otro en función del mismo.

Pongo un ejemplo. Tienes una web donde hay una página proyectos donde muestras un listado de tus proyectos. Los proyectos pueden ser en venta o finalizados, y los tienes distribuidos en dos pestañas. Por defecto la pestaña activa es En Venta, pero puedes tener enlaces en el resto de tu sitio que enlacen directamente a Finalizados, algo tipo:

https://miweb.com/proyectos/?project-type=finalizados

De este modo, el visitante entrará a la misma página pero la pestaña activa será Finalizados en lugar de En Venta.

Es entonces cuando viene el SEO y te dice que eso de los parámetros en la URL no se lleva y que puede perjudicar al posicionamiento de tu web. Consultando un poco en Google puedes encontrar que usar parámetros en la URL es una práctica no recomendada:  https://moz.com/learn/seo/url

Avoid the use of parameters, if possible. If parameters need to be used, they should be limited to two or less. Evita el uso de parámetros, si es posible. Si los parámetros deben ser utilizados, deben ser limitados a dos o menos.

Resumiendo: Evítalo, pero si no puedes evitarlo trata que sean 2 o menos.

No te preocupes si el SEO se pone estricto en este aspecto, por suerte WordPress dispone de herramientas para evitarlo.

Basándonos en el ejemplo mencionado anteriormente, vamos a ver cómo podemos hacerlo a través de la función de WordPress add_rewrite_rule():

<?php

function rewrite_projects_permalinks() {
    global $wp;

    $wp->add_query_var('project-type');

    add_rewrite_rule( '(.?.+?)/project-type/([^/]*)/?$', 'index.php?pagename=$matches[1]&project-type=$matches[2]', 'top' );
    add_rewrite_rule( '(.?.+?)/project-type/([^/]*)/page/([0-9]{1,})/?$', 'index.php?pagename=$matches[1]&project-type=$matches[2]&paged=$matches[3]', 'top' );

    flush_rewrite_rules();
}
add_action( 'init', 'rewrite_projects_permalinks' );

Lo que hemos hecho es añadir dos nuevas reglas para convertir nuestro parámetro project-type a un formato de URL amigable, ¿Porqué dos reglas? Porque debemos tener en cuenta que la página proyectos puede tener paginación.

La regla es ‘(.?.+?)/project-type/([^/]*)/?$’. Resumiendo, la primera parte (.?.+?) es la expresión regular de la parte de la URL amigable que va a montar WordPress por defecto. Es decir, para el ejemplo que he utilizado tendríamos una página llamada «Proyectos», pues el primer parámetro sería el slug de la página Proyectos que va a montar WordPress.

El segundo parámetro será una cadena fija project-type que hemos definido nosotros. Este es el nombre amigable del parámetro que utilizaremos en código para mostrar los proyectos En Venta o Finalizados.

El último parámetro ([^/]*) es la expresión regular para indicar el valor de nuestro parámetro project-type.

Lo siguiente es indicar cómo quedaría la URL: ‘index.php?pagename=$matches[1]&project-type=$matches[2]’. Como puede observarse hemos añadido un parámetro llamado project-type que tendrá el valor de la segunda expresión regular.

Ahora en nuestra página proyectos podremos obtener ese parámetro y trabajar con él:

<?php

$project_type = get_query_var('project-type');

if ( $project_type == 1 ) {
    // haz una cosa
}else {
    // haz otra cosa
}

¿Te ha resultado útil esta información? 🍺

Si este post te ha resuelto un problema, invítame a un café o a una cerveza. Con este pequeño gesto me animas a seguir escribiendo.

Comentarios

1 comentario en Como convertir parámetros por GET en URLs amigables

  1. Hola, si quisiera tener un htaccess para que en mi index del sitio me lleguen peticiones del tipo http://www.mipagina.com/juan-perez reciba el valor por get en mi index?

    Es decir, si me llegan peticiones a:
    http://www.mipagina.com/index.php/juan-perez
    http://www.mipagina.com/juan-perez

    En index.php pueda recibir el GET con el valor ‘juan-perez’? Es que cuando es sin colocar explícitamente «index.php» en la petición no he podido lograrlo 🙁

Deja un comentario

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

  • El fin del tratamiento es únicamente la moderación de comentarios para evitar spam
  • La legitimación es tu consentimiento al comentar
  • No se comunicará ningún dato a terceros salvo por obligación legal
  • Tienes derecho al acceso, rectificación y eliminación de los comentarios