Enrutamiento PHP con Codeigniter (Títulos en URL para SEO)

Tengo algunas preguntas sobre el enrutamiento con Codeigniter. Lo que estoy haciendo ahora es lo siguiente:

$route['articles/(:num)'] = 'articles/view/$1'; // $1 will contain an ID

Esto significa que example.com/articles/123 funcionará perfectamente y cargará un artículo con una ID de 123. Pero también quiero tener la posibilidad de agregar el título del artículo a la URL (para SEO). Ejemplo: example.com/articles/123/article-title

Lo que quiero es más o menos lo mismo que Stack Overflow: stackoverflow.com/questions/123/the-title

¿Cómo puedo hacer eso?

También me pregunto cómo funciona Stack Overflow. Si voy a stackoverflow/questions/111, el título se agregará automáticamente a la URL. ¿Eso se hace con php redirect ()?

preguntado el 12 de junio de 12 a las 18:06

has probado: $route['articles/(:num)/(:any)'] ? y al pasar este tercer parámetro, hay que reemplazar los espacios en blanco con - y no creo que sea necesario lo que propuso Christian Giupponi -

@Daniel Sí, pero quiero que el título sea opcional, como aquí en Stack Overflow. -

Pero creo que funcionará, ¿has probado? Creo que dado que el tercer parámetro es (:any) -

@Daniel Sí, (: cualquiera) es correcto, pero aparece "Página no encontrada" cuando no agrego el título. -

Lo hice, sé lo que quieres hacer. ¿Has probado a crear el mismo router con diferentes parámetros? uno con (:any) y el otro sin? -

3 Respuestas

He hecho algo similar en el pasado; No puedo encontrarlo, pero IIRC (fue hace meses) Puede usar una ruta como lo hizo, y también agregar una más específica, como

$route['articles/(:num)/(:any)'] = 'articles/view/$1/$2';
$route['articles/(:num)'] = 'articles/view/$1';

Como puede ver, ambos se asignan al mismo método, que está algo "sobrecargado"; puede compensar un parámetro faltante utilizando un valor predeterminado:

function articles($id,$slug = FALSE) 
{ }

y simplemente ignore el segundo parámetro en la recuperación de su artículo.

En cuanto a agregar el título, puede:

  1. tener un campo "slug" en su base de datos, creado cuando se guarda el artículo. Puedes usar el cómodo url_title($title,'dash',TRUE) función (en el asistente de URL), que toma el $title, usa el dash como separador, y ponlo todo en minúsculas;
  2. use la función anterior y convierta el título del artículo (después de recuperarlo de la base de datos) "sobre la marcha"; simplemente verifique el método del artículo () si el segundo parámetro no es falso y sabrá si necesita crear el slug o no;

En cuanto a cómo mostrar el slug incluso cuando usa una URL sin él, puede hacer, como supuso, una redirección, pero como ambas rutas apuntan al mismo método, no cambiará nada para usted.

Oh, uhm, tenga cuidado con los bucles al llamar a la redirección, verifique con cuidado;)

Respondido el 12 de junio de 12 a las 18:06

¡Gracias! ¿Alguna idea de cómo hace Stack Overflow para agregar automáticamente el título si falta? Redirección de PHP () tal vez? - usuario1043994

Le sugiero que cree un campo de slug en su tabla y lo complete con la URL que desea usar como identificación. Dejame explicar.

tienes esta mesa

id
title
slug

cuando guarda un artículo en su base de datos, puede crear dinámicamente un slug, por ejemplo:

id: 1
title: My first post
slug: 1-my-first-post

entonces puede usar la identificación del anuncio slug (en este caso, 1-my-first-post) para la página, puede llamarlo:

www.example.com/articles/1-my-first-post

obviamente necesitas manejarlo en tu db slect

Respondido el 12 de junio de 12 a las 18:06

¡Gracias por la sugerencia! Sin embargo, no responde a ninguna de mis preguntas. - usuario1043994

Como comentamos en los comentarios.

Puede crear una ruta varias veces y con diferentes parámetros cada una, como:

$route['articles/(:num)/(:any)']
$route['articles/(:num)']

Crearía una función con una redirección, agregando o no el título.

Espero eso ayude.

Respondido el 12 de junio de 12 a las 18:06

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.