¿Cómo genera WordPress slugs de URL?

17

¿Hay alguna página en algún lugar que detalle exactamente cómo WordPress genera babosas para URL? Estoy escribiendo un script que necesita generar slugs de URL idénticos a los que genera WordPress.

George Edison
fuente
Las respuestas a esta pregunta ahora están desactualizadas: use codex.wordpress.org/Function_Reference/wp_unique_post_slug en su lugar.
SinisterBeard

Respuestas:

16

De buenas a primeras, no puedo darle una página / tutorial / documentación sobre cómo se generan las babosas de WP, pero eche un vistazo a la sanitize_title()función.

No tener una impresión equivocada por el nombre de la función, es no significaba para desinfectar un título para el uso más como una página / título de la entrada . Toma una cadena de título y la devuelve para usarla en una URL:

  • tiras HTML y PHP
  • tiras de caracteres especiales
  • convierte todos los caracteres en minúsculas
  • reemplaza espacios en blanco, guiones bajos y puntos por guiones / guiones
  • reduce múltiples guiones consecutivos a uno

No puede haber casos en los bordes, donde el núcleo hace algo adicional (que tendría que mirar a la fuente para verificar que sanitize_title()se siempre suficiente en la generación de exactamente la misma que espera), pero esto se debe cubrir al menos el 99%, si no todos, los casos .

Johannes Pille
fuente
1
@kaiser: pensé que simplemente estabas enamorado de T5 Rewrite :) (que está en mi agenda para ver) | y en general: si un título es realmente largo, WP también recorta las babosas hasta una cierta longitud máxima. Ese es uno de esos casos en los que no estoy completamente seguro de si eso también lo hace el sanitize_titlefiltro aplicado en la función, o si eso es manejado por otra cosa después de que la función se haya ejecutado.
Johannes Pille
Supongo que es el sanitize_titlefiltro que hay que revisar. Pero también hay otras funciones relacionadas . Realmente no tengo idea de esto. A veces parece que SimplePiees más fácil de entender que la WP_Rewritecosa. Por cierto: Toscho trabaja en la integración de la funcionalidad "Monkeyman Rewrite Analyzer" en su complemento. Ahí es donde las cosas comienzan a ponerse realmente interesantes.
kaiser
1
Considere también sanitize_title_with_dashes () si desea ser un poco más explícito sobre la generación de una babosa compatible con URL.
Tom Auger
5

Puedes usar esta función:

static public function slugify($text)
{
  // replace non letter or digits by -
  $text = preg_replace('~[^\pL\d]+~u', '-', $text);

  // transliterate
  $text = iconv('utf-8', 'us-ascii//TRANSLIT', $text);

  // remove unwanted characters
  $text = preg_replace('~[^-\w]+~', '', $text);

  // trim
  $text = trim($text, '-');

  // remove duplicate -
  $text = preg_replace('~-+~', '-', $text);

  // lowercase
  $text = strtolower($text);

  if (empty($text)) {
    return 'n-a';
  }

  return $text;
}

Es exactamente cómo funciona la función wp url sanitize.

Vivek Sancheti
fuente
4

Core a su servicio

No hay un modo de desarrollador integrado en WordPress aparte WP_DEBUG, lo que no te ayuda demasiado en este caso. Básicamente, WP utiliza la "API de reescritura" , que es un contenedor de bajo nivel basado en funciones para la WP_Rewriteclase, sobre el que puede leer en el Codex . El global $wp_rewriteobjeto está a su servicio para inspeccionarlo o interactuar con la clase.

Complementos que ayudan a investigarlo.

Toschos "T5 Rewrite" -Plugin y Jan Fabrys "Monkeyman Rewrite Analyzer" -Plugin lo guiarán en su camino. He escrito una pequeña extensión para "T5 Rewrite" para integrarlo sin problemas con el "Monkeyman Rewrite Analyzer", que puedes encontrar en la wikie de repositorios "T5 Rewrite" aquí en GitHub .

El complemento "Monkeyman" agrega una nueva página, archivada en el menú de la interfaz de usuario del administrador en Herramientas . El complemento "Reescribir T5" agrega una nueva pestaña de ayuda a la página Configuración > Enlaces permanentes . Mi extensión también agrega las pestañas de ayuda a la página de herramientas mencionada .

Aquí hay una captura de pantalla de cómo se ve el contenido de la pestaña de ayuda "T5 Rewrite".

ingrese la descripción de la imagen aquí

Vorlage = Patrón | Beschreibung = Explicación | Beispiele = Ejemplos

Notas

El complemento "T5 Rewrite" hace un trabajo maravilloso al ayudarlo a inspeccionar el objeto de reescritura. Y lo hace aún más: agrega nuevas posibilidades. Por lo tanto, es (al menos en mis instalaciones) parte de mi paquete básico de complementos.

emperador
fuente
2

En realidad, si observa la función principal wp_insert_post (post.php), verá que hace lo siguiente:

$data['post_name'] = wp_unique_post_slug( sanitize_title( $data['post_title'], $post_ID ), $post_ID, $data['post_status'], $post_type, $post_parent );

$wpdb->update( $wpdb->posts, array( 'post_name' => $data['post_name'] ), $where );

La clave a tener en cuenta es que usa wp_unique_post_slug y sanitize_title:

wp_unique_post_slug( sanitize_title( 
Jahmic
fuente
0

Perdone por reanudar una vieja pregunta, pero tuve la misma necesidad que descubrí que este método funciona perfectamente para mí:

$some_string = "DON'T STOP ME NOW!";
$slug = sanitize_title(sanitize_title($some_string, '', 'save'), '', 'query');
echo $slug; // dont-stop-me-now

Este método utiliza una doble desinfección.

El primero usa el save modo, donde se eliminan las etiquetas HTML y PHP, y se eliminan los acentos (los caracteres acentuados se reemplazan por equivalentes no acentuados).

El segundo querymodo garantiza que todos los espacios se reemplacen con guiones.- y se eliminen otros signos de puntuación.

¡Espero que esto ayude a alguien! :)

GigiSan
fuente