¿Sanitize_title es suficiente para generar slugs posteriores?


16

Quiero generar slug para algunas cadenas sin pasar por el flujo de generación de slug de WordPress. Por lo tanto, quiero saber qué funciones llama para obtener una buena babosa. Intenté sanitize_title () pero deja como resultado% c2% a0.

Respuestas:


27

Ya casi has llegado. La función que necesita es sanitize_title_with_dashes ($ title)


1
Si bien esto definitivamente parece correcto, no estoy claro qué sanitize_title_with_dashes parece hacer de manera diferente para sanitize_title. sanitize_title también agrega guiones donde está el espacio en blanco ...
Tim Malone

77
Si marca el Codex de WordPress para sanitize_title_with_dashes ($ title) , verá la nota 'no reemplaza caracteres especiales acentuados', lo que significa que caracteres como èäçetc. se mantendrán en su lugar con esta función.
JHoffmann

Tenga en cuenta que sanitize_title_with_dashesademás de sanitize_titledejar algunos caracteres especiales que pueden romper algunos sistemas. Quiero un enfoque más universal en la reducción de cuerdas eche un vistazosanitize_html_class
GDY

2

Bueno, ya hay una respuesta, pero quería expandirla un poco, así que aquí están mis hallazgos:

Si observamos wp_insert_post(), vemos que $post_namese desinfecta usando wp_sanitize_title()(ver wp-includes/post.php)

En la función sanitize_title()tenemos un filtro sanitize_title. Esto es interesante, ya que en los filtros predeterminados sanitize_title_with_dashes()está conectado a este filtro (ver wp-includes/default-filters.php).

<?php
echo sanitize_title( 'Â+ÄÖßáèäç' ) // aaeoessaeaec
?>

Intenté sanitize_title () pero deja como resultado% c2% a0.

Esto suena extraño Sería genial conocer el valor de entrada, pero seguir wp_insert_post() sanitize_title()parece ser suficiente.


2

sanitize_title() parece ser el único que necesitas.

En wp-includes / default-filters.php línea 211 encontrarás:

add_filter( 'sanitize_title', 'sanitize_title_with_dashes', 10, 3);

Esto significa que llamar sanitize_title()primero eliminará todos los caracteres especiales, luego aplicará el sanitize_titlefiltro, llamando asísanitize_title_with_dashes()

Como señaló @JHoffmann, simplemente llamar sanitize_title_with_dashes()no eliminará caracteres especiales.


Esta debería ser la respuesta correcta
bysanchy

0

Además de la excelente respuesta de websupporter, encontré lo siguiente:

Dependiendo de su uso, dependerá de lo que necesite.

sanitize_title() como dice:

los acentos se eliminan (los caracteres acentuados se reemplazan por equivalentes no acentuados)

... y sanitize_title_with_dashesdice:

Tenga en cuenta que no reemplaza caracteres especiales acentuados

Entonces, con este ejemplo de cadena:Â+Ä Ö %%% ßá %20 oo %pp + -_^^#@!**()=[]|\/\'"<>?``~ èäç

sanitize_title() resultado:

aa-o-sa-% 20-oo-pp -_- eac

Como puede ver, ha reemplazado los caracteres acentuados con sus equivalentes no acentuados y ha eliminado todos los demás caracteres no alfanuméricos aparte del %que va seguido de un número, pero verá que se eliminó cuando fue seguido por una letra; quizás esto se deba a que lo percibe como ya codificado . Esto se aplica cuando intenta insertar %c3en su cadena, no lo despoja, ya que %c3es una secuencia de codificación válida.

sanitize_title_with_dashes resultado:

% c3% a2% c3% a4-% c3% b6-% c3% 9f% c3% a1-% 20-oo-pp -_-% c3% a8% c3% a4% c3% a7

Como puede ver, no ha eliminado los caracteres acentuados, sino que los ha codificado.

Ahora veamos una cadena sin caracteres acentuados para ver cómo se comportan ambos ...

Cadena de ejemplo: %%% building %20 oo %pp + -_^^#@!**()=[]|\/\'"<>?``~'

sanitize_title() resultado:

edificio-% 20-oo-pp-_

sanitize_title_with_dashes resultado:

edificio-% 20-oo-pp-_

Como puede ver, son exactamente lo mismo. Parece que la única diferencia en ellos es que uno codifica cartas acentuadas mientras que el otro las reemplaza .

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.