No utilices /%postname%/ como estructura de enlaces permanentes

Es interesante ver como no siempre la estructuras de enlaces permanentes que nos gustan para hacer bonitas nuestras URLs con WordPress son las mejores opciones. Siempre me ha gustado usar /%postname%/ como estructura de enlaces para mis blogs. Pero cuando tienes muchas páginas el sitio puede sufrir y estar caído posiblemente por esta estructura. Por eso estoy tomando la decisión de cambiar mi estructura de enlaces y que empiece o acabe con un número.

Por resumir este artículo podemos decir que no es lo mismo que nuestro WordPress busque en la base de datos nuestras entradas sabiendo la URL que sabiendo el ID de la entrada además del la URL bonita. Normalmente cuanto tenemos muchas entradas el proceso de búsqueda de URL con /%postname%/ se hace realmente pesado para nuestro servidor lo que sin duda consume más memoria y puede hacer muy lenta la carga de nuestro servidor, includo hacer que no esté disponible por falta de memoria y saturación.

El ejemplo que nos muestras en DigWP nos muestra como el número de llamadas necesarias para resolver una dirección web con /%postname%/ es muchísimo mayor que si optamos por una solución de URLs como la que nos recomienda WordPress por defecto /%year%/%monthnum%/%postname%/.

Aquí podéis ver una captura de la información que nos reporta W3 Total Cache usando /%postname%/:

Y aquí lo mismo pero usando la estructura /%year%/%monthnum%/%postname%/:

Es evidente que el número de llamadas a la base de datos se reduce mucho con una estructura de enlaces en WordPress que facilite la búsqueda de información, si esta incluye más información como año y mes, pero además si jugamos con el ID de las entradas será mucho más eficiente para nuestro sitio y para reducir la carga y llamadas a la base de datos.

Estamos ante un posible problema de rendimiento para sitios grandes. ¿Quizás WordPress necesite una base de datos con los enlaces permanentes? Andrew Nacin, desarrollador del core de WordPress, es quien genero las capturas de llamadas a base de datos de arriba y que sin duda nos clarifican mucho el tema.

En la documentación de WordPress, The Codex, comentan información como:

Por razones de rendimiento, no es una una buena idea que tus estructura de enlaces permanentes contengan categoría, tag, autor u otros campos de la entrada. La razón es usar esas variables en tus estructura de enlaces permanentes hace que WordPress tarde mucho más tiempo en distinguir que es una página y que una entrada, a la vez que tiene que consultar más información en tu MySQL. Por eso recomendamos utilizar estructuras de enlaces del tipo /%year%/%postname%/ o /posts/%postname%/.

¿Por qué se incrementa tanto el número de llamadas a las bases de datos? Ni idea. ¿Por qué WordPress utiliza la base de datos para resolver la URLs cuando usas /%postname%/? Sí. Por eso si utilizamos sus recomendaciones reducimos las llamadas a la base de datos. WordPress debe mejorar más este punto de enlaces permanentes o URLs bonitas.

¿Cómo afecta esto al SEO?

Pues no tiene porque afectar. Para cambiar las URLs por nuevas tenemos muchas opciones y plugins para crear redirecciones 301 con las antiguas direcciones hacía las nuevas.

¿Qué estructuras de enlaces permanentes son las mejores?

Aunque al llegar al final de este artículo igual ya tienes claro que estructura de enlaces permanentes (permalinks) deberías usar para que tu WordPress no consuma toda la memoria de tu servidor y haga muchas más llamadas a bases de datos de las necesarias.

Las recomendaciones de WordPress son:

  • /%year%/%postname%/
  • /entradas/%postname%/
Y mis recomendaciones para una estructura de enlaces son:
  • /%postname%/%post_id%/
  • /%post_id%_%postname%/
  • /%postname%_%post_id%/
Esta es una captura para que veáis el número de llamadas a bases de datos que genera carrero.es con su estructura de enlaces.
  • JaimeMSE

    Muy buen artículo.

    Muchas gracias, pues yo usaba en mis sitios /%postname%/, nunca se me hubiese ocurrido eso.

    Un saludo!

  • Bibliofilica

    Muy interesante, de hecho a mi me gusta les estructura de fecha + nombre del post, por que asi me gusta a mi encontrar la informacion sobre todo cuando se trata de tecnologia, no es lo mismo una nota, tutorial o meh, si es de hace dos años o reciente y no todos los sitios tiene la precaucion de ponerles fecha a las entradas o no muy visible

  • Pancho Opcionweb

    Gracias por compartirlo, lo comprobare en opcionweb.com
    Un saludo, nos leemos.

  • Para un blog la estructura de año/mes/post no está mal, pero cuando usamos wordpress como cms para una web comercial, por ejemplo, quizás es mejor la que sugieres de /post/postid

    Sabía que consumía más recursos, pero la diferencia me parece una pasada :-O

  • No es tan ingenuo lo que comentáis. Cargas lentas hacen que los internautas no tengan buenas experiencias de usuario y por lo tanto abandonen nuestras páginas. Además, Google penaliza las paginas que tardan en cargar, con lo que perderemos visibilidad en buscadores.

    Por otro lado, elegir la estructura de los enlaces permanentes dependerá también de qué tipo de página estemos construyendo. No es lo mismo tener una página cargada de información estática que otra con noticias y entradas. La idea que nos da Carrero me parece genial, añadimos un ID (que tampoco molesta tanto) al nombre del post. Así mezclamos lenguaje máquina (ID) con lenguaje humano (nombre del post).

  • David,

    Excelente análisis, ¡muchas gracias por los consejos!

    Saludos!!

  • Lo he comentado en Bitacoras.com pero también te lo comento aquí porque veo que no tienes cuenta asociada ;)

    Que WordPress haga mal su “trabajo” no es motivo para cambiar. Es un proyecto de código abierto y es algo que puede notificarse para que secsolucione, porque no es normal multiplicar por 50 el número de consultas, aún suponiendo que sea problema de WordPress y no de los miles de plugins mal programados que existen.

    Creo que si desactivas los plugins y haces las mismas pruebas, el número de consultas descenderá considerablemente (es teoría sólo, quizás me equivoque) y si no, un buen plugin para evitar eso sería de lo más útil para toda la comunidad de WordPress :)

  • Juan Manuel

    Lo he probado en mi blog Reiniciado.com y los resultados son más que notables. Gracias por la información!

  • Hola David.

    Muy interesante la entrada. Mi sitio tiene más de 900 entradas, y quizás una optimización no le venga nada mal.

    Soy relativamente novato en cuestiones de optimización y por eso me gustaría preguntarte sobre qué plugin para redirección 301 me recomiendas.

    Gracias por compartir tus conocimientos.

    Javier

  • Alberto Vilches | Desarrollo iPhone

    Gracias David, lo probaré para mi página en concreto la opción que comentas: /%postname%/%post_id%/
    Creo que puede ser la mas apropiada.
    Saludos

  • Gracias por la info. La verdad es que hay mucha información que aconseja usar las url amigables en wp con /%postname%/ y asi lo he echo en algunas de las webs. Pero una vez leido el post queda claro que el rendimiento debe mejorar usando otra composición.

    Me quedo con estas:

    /%postname%/%post_id%/
    /%post_id%_%postname%/

  • Interesante lo que dices sobre la velocidad y el consumo.

    Personalmente me desagrada otra cuestión respecto al uso de %postname% y es que has de buscar la fecha en que un artículo fue publicado (y a veces solo la encuentras en los comentarios) para saber si la información encontrada es reciente o puede haber quedado obsoleta.

    Me parece cuando menos una descortesía de cara al usuario.

    ¡Un saludo a todos los wordpresseros!

  • Interesante tema que trae David pero me gustaría matizar que del hilo original en DigWP las conclusiones que yo extraigo son que el sistema de “autobusqueda” de URL del WP es el que hace que las URLs compuestas sólo de slugs (%postname%) tengan cierto retraso, pero también el que consigue que en muchos casos, aunque hagas cambios en la estructura de URLs, WP sea capaz de hacer un 301 a la nueva URL.

    En todo caso, para mejorar esto se entiende en el hilo que la clave reside en empezar por un ID numérico que acorta el número de iteraciones de consulta que el código tiene que hacer. De ese modo, yo al meno apostaré por un /%post_id%/%postname%/

    En todo caso, muchos de estos problemas se resuelven con sencillas reglas de rewrite en el lado del servidor y/o archivo .htaccess que resultarán muchísimo más rentables que consultas a PHP+MySQL

    • Gracias por tus comentarios José Luis. Y Gracias a todos los que estáis dejando vuestros comentarios.

  • Uff, pues yo he usado esta estructura en todos los blogs. No se si es buen momento de cambiarla. :(

    • Cambiarlo no es difícil, tienes plugins para no perder la estructura antigua.

  • Gracias por el post. En mi caso tampoco tenía ni idea de la incidencia en los servidores del %postname%. A partir de ahora lo tendré en cuenta.

    Un saludo.

  • DoctorPC

    Si bien esa información es bastante antigua, la imagen comparativa da para pensar en modificar la estructura de los enlaces

  • Consultor de Marketing

    Interesante analisis. Habitualmente suelo emplear la fecha + el nombre del post.