Un slug es la parte de una URL que identifica un recurso de forma legible: minúsculas, sin espacios ni acentos, palabras separadas por guiones. Convertir «Cómo optimizar imágenes en WordPress» en `como-optimizar-imagenes-en-wordpress` no es solo una cuestión estética: los espacios se codifican como `%20`, los acentos generan secuencias UTF-8 codificadas que rompen enlaces copiados a mano, y las mayúsculas obligan a comparar URLs de forma insensible a caso en el servidor. Un generador de slugs automatiza la transliteración de tildes, eñes y símbolos, aplica las reglas de longitud y separadores de cada CMS y evita colisiones entre entradas con títulos parecidos. También conviene revisar la codificación resultante con un decodificador de URL cuando el slug viaja dentro de un enlace completo.
Qué transformaciones aplica un generador de slugs
El proceso típico son cinco pasos: pasar a minúsculas, normalizar Unicode a forma NFD para separar cada letra de su diacrítico, eliminar los diacríticos (á se convierte en a tras quitar el acento combinante), sustituir cualquier carácter que no sea [a-z0-9] por un guion, y colapsar guiones consecutivos en uno solo, recortando los guiones al principio y al final. "¡Guía definitiva de Node.js!" se convierte en guia-definitiva-de-node-js, con el signo de apertura de exclamación y el punto eliminados y el espacio junto al guion normalizado a un único separador.
El caso de la eñe: por qué no es un acento más
La eñe es una letra propia del alfabeto español, no una 'n' con tilde, y normalizarla igual que una vocal acentuada produce resultados discutibles: "año" puede transliterarse a ano (una palabra distinta y con connotación no deseada) en vez de a anio o mantenerse como ano solo si se acepta esa pérdida de significado. La mayoría de generadores de slugs, incluidas librerías como slugify, transliteran ñ → n por convención de compatibilidad con URLs antiguas, pero algunos sitios en español prefieren la variante ñ → ni o ñ → nn para evitar ambigüedades. Conviene decidir esta regla explícitamente y no dejarla al comportamiento por defecto de una librería genérica.
Símbolos, emoji y caracteres no latinos
Los símbolos de puntuación (¿, ¡, «, », %, &) se eliminan directamente porque no tienen transliteración razonable. El símbolo & es la excepción más discutida: muchos generadores lo convierten a y o and en vez de borrarlo, porque "Rock & Roll" pierde sentido como rock-roll. Los emoji y los caracteres de alfabetos no latinos (cirílico, árabe, chino) no tienen transliteración fonética estándar sin una librería específica; sin ella, la opción más segura es eliminarlos y, si el título queda vacío, generar un slug de respaldo a partir de un identificador o una fecha.
Longitud máxima y truncado sin cortar palabras
Google no penaliza slugs largos, pero las URLs muy extensas se recortan en los resultados de búsqueda y son más difíciles de compartir. Una convención habitual es limitar el slug a entre 60 y 75 caracteres, truncando por palabra completa: cortar como-optimizar-imagenes-en-wordpress-para-mejorar-el-core-web-vitals en el límite de 60 caracteres sin partir una palabra a la mitad, retrocediendo hasta el último guion anterior al límite en vez de cortar en wordpress-para-mejo.
Slugs duplicados: cómo cada CMS resuelve la colisión
Si dos artículos generan el mismo slug, cada plataforma añade un sufijo distinto. WordPress añade un número al final (mi-articulo-2), Jekyll y otros generadores estáticos suelen fallar la build si detectan una colisión de ruta, y muchas APIs REST añaden un identificador corto o un hash (mi-articulo-a3f9) para garantizar unicidad sin depender de un contador centralizado. Elegir la estrategia correcta depende de si el slug debe ser estable en el tiempo (evitar renumerarlo) o solo único en el momento de creación.
Slugs y SEO: qué palabras merece la pena mantener
Eliminar stopwords (de, la, el, en, un) del slug es una práctica común para acortarlo, pero no aporta beneficio de posicionamiento demostrable por sí sola; el factor real es que el slug describa el contenido con las palabras clave relevantes. "guia-node-js" funciona igual de bien que "guia-de-node-js" a efectos de relevancia; la diferencia está en la longitud y la legibilidad, no en un supuesto algoritmo que penalice preposiciones.
Codificación final: por qué el guion y no el guion bajo
Google trata el guion (-) como separador de palabras y el guion bajo (_) como parte de la misma palabra, una distinción documentada desde hace años en sus directrices para webmasters. mi-articulo se interpreta como las palabras «mi» y «articulo»; mi_articulo se interpreta como el token único «mi_articulo». Por eso todos los generadores de slugs usan el guion como separador por defecto, y cambiarlo a guion bajo solo tiene sentido si el sistema de rutas del framework lo exige explícitamente.
Salidas reales de ejemplo
"¿Cómo diseñar una API en Node.js?"
-> "como-disenar-una-api-en-node-js"Cada símbolo se resuelve según su categoría: acento eliminado, eñe transliterada, signos retirados.
" Guía -- rápida de YAML "
-> "guia-rapida-de-yaml"Los espacios múltiples y los guiones consecutivos se reducen a un único separador, sin guion inicial ni final.
"Backend & Frontend / Guía 2024"
-> "backend-y-frontend-guia-2024"El & se transcribe como "y" para conservar el sentido; la barra se trata como separador de palabras.
Slug completo (52): "mejora-el-rendimiento-y-los-core-web-vitals"
Truncado a 40: "mejora-el-rendimiento-y-los-core-web"El corte retrocede hasta el guion anterior al límite en vez de partir "vitals" por la mitad.
Reglas de slug según el CMS o framework
| Plataforma | Separador por defecto | Estrategia ante duplicado | Límite de longitud habitual |
|---|---|---|---|
| WordPress | Guion (-) | Sufijo numérico incremental (-2, -3) | Sin límite estricto, recomendado < 75 |
| Jekyll / Hugo (sitios estáticos) | Guion (-) | Fallo de compilación si colisiona la ruta | Definido por el usuario |
| Shopify | Guion (-) | Sufijo numérico o error de validación | 255 caracteres máximo |
| API REST genérica | Guion (-) | Hash o ID corto añadido al slug | Variable, a menudo 100-150 |
El separador y la estrategia ante duplicados cambian según la plataforma de destino.
Casos de uso comunes
- Generar la URL de una entrada de blog a partir de un titular en español con tildes y signos de interrogación.
- Normalizar nombres de producto para un catálogo de e-commerce antes de importarlos por lote.
- Crear nombres de archivo seguros para subir a un CDN a partir del nombre original con espacios y mayúsculas.
- Migrar contenido entre CMS distintos que usan convenciones de slug diferentes (guion bajo vs guion medio).
- Evitar colisiones al generar rutas dinámicas en un framework como TanStack Start o Next.js.
Buenas prácticas
- Decide de forma explícita la regla de transliteración de la eñe (`ñ → n` o `ñ → ni`) y aplícala de forma consistente en todo el sitio.
- Usa siempre guion medio como separador; el guion bajo se interpreta como un único token en la mayoría de buscadores.
- Limita la longitud truncando por palabra completa, nunca a mitad de una palabra.
- No dependas solo de eliminar stopwords para el SEO: prioriza que el slug describa el contenido con precisión.
- Genera un slug de respaldo (fecha o identificador) cuando el título no contenga ningún carácter alfanumérico transliterable.
- Verifica el slug final con un validador de URL o un decodificador antes de publicarlo, sobre todo si se generó de forma automática desde datos externos.