Quiero generar slug para algunas cadenas sin pasar por el flujo de generación de slug de WordPress. Por lo tanto, quiero saber a qué funciones llama para obtener un slug limpio. Intenté sanitize_title () pero deja% c2% a0 en el resultado.
Quiero generar slug para algunas cadenas sin pasar por el flujo de generación de slug de WordPress. Por lo tanto, quiero saber a qué funciones llama para obtener un slug limpio. Intenté sanitize_title () pero deja% c2% a0 en el resultado.
Ya casi has llegado. La función que necesita es sanitize_title_with_dashes ($ title)
sanitize_title()
parece ser el único que necesitas.
En la línea 211 de wp-includes / default-filters.php encontrará:
add_filter( 'sanitize_title', 'sanitize_title_with_dashes', 10, 3);
Esto significa que al llamar a sanitize_title()
primero se eliminarán todos los caracteres especiales, luego se aplicará el filtro sanitize_title
y, por lo tanto, se llamará a sanitize_title_with_dashes()
Como señaló @JHoffmann, simplemente llamar a sanitize_title_with_dashes()
no eliminará los caracteres especiales.
Bueno, ya hay una respuesta, pero quería ampliarla un poco, así que aquí están mis conclusiones:
Si observamos en wp_insert_post()
que vemos, $post_name
se desinfecta usando wp_sanitize_title()
(vea 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á enganchado a este filtro (vea wp-includes/default-filters.php
).
<?php
echo sanitize_title( 'Â+ÄÖßáèäç' ) // aaeoessaeaec
?>
Intenté sanitize_title () pero deja% c2% a0 en el resultado.
Esto suena extraño. Sería genial conocer el valor de entrada, pero parece suficiente con wp_insert_post()
sanitize_title()
.
Además de la excelente respuesta encontré la siguiente información:
Dependiendo de su uso, dependerá de lo que necesite.
sanitize_title()
como dice:
se eliminan los acentos (los caracteres acentuados se reemplazan con equivalentes no acentuados)
... y sanitize_title_with_dashes
dice:
Tenga en cuenta que no reemplaza los caracteres especiales acentuados
Entonces, con este ejemplo 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 es 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 intentas insertar %c3
en tu cadena, no se elimina porque %c3
es 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 con no caracteres acentuados para ver cómo se comportan ...
Cadena de ejemplo: %%% building %20 oo %pp + -_^^#@!**()=[]|\/\'"<>?''~'
sanitize_title()
resultado:
edificio-% 20-oo-pp-_
sanitize_title_with_dashes
resultado:
edificio-% 20-oo-pp-_
Entonces, como puedes ver, son exactamente iguales. Así que parece que la única diferencia entre ellos es que una codifica las cartas con acento, mientras que la otra las reemplaza .
Lea otras preguntas en las etiquetas slug sanitization seo