¿Es suficiente sanitize_title para generar slugs de posts?
Quiero generar slugs para algunas cadenas de texto sin pasar por el flujo de generación de slugs de WordPress. Por lo tanto, quiero saber qué funciones llama para obtener un slug limpio. Probé sanitize_title() pero deja %c2 %a0 en el resultado.

Ya casi lo tienes. La función que necesitas es sanitize_title_with_dashes( $title )

Aunque esto definitivamente parece correcto, estoy un poco confundido sobre qué hace diferente sanitize_title_with_dashes en comparación con sanitize_title. sanitize_title también añade guiones donde hay espacios en blanco...

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

Ten en cuenta que tanto sanitize_title_with_dashes
como sanitize_title
dejan algunos caracteres especiales que pueden romper algunos sistemas. Si quieres un enfoque más universal para reducir cadenas, revisa sanitize_html_class

Esta respuesta es incorrecta, como se explica en los comentarios, y el autor debería actualizarla, quizás mejor apuntando a una respuesta más correcta como https://wordpress.stackexchange.com/a/294587/27896

sanitize_title()
parece ser la única función que necesitas.
En el archivo wp-includes/default-filters.php, línea 211 encontrarás:
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
, llamando así a sanitize_title_with_dashes()
Como mencionó @JHoffmann, simplemente llamar a sanitize_title_with_dashes()
no eliminará los caracteres especiales.

Bueno, ya existe una respuesta, pero quería ampliarla un poco, así que aquí están mis hallazgos:
Si miramos en wp_insert_post()
vemos que $post_name
se sanitiza usando wp_sanitize_title()
(ver wp-includes/post.php
).
En la función sanitize_title()
tenemos un filtro llamado sanitize_title
. Esto es interesante, porque en los filtros por defecto se engancha la función sanitize_title_with_dashes()
a este filtro (ver wp-includes/default-filters.php
).
<?php
echo sanitize_title( 'Â+ÄÖßáèäç' ) // aaeoessaeaec
?>
Probé sanitize_title() pero deja %c2 %a0 en el resultado.
Esto suena extraño. Sería bueno conocer el valor de entrada, pero siguiendo el flujo de wp_insert_post()
, sanitize_title()
parece ser suficiente.

Además de la excelente respuesta de websupporter, encontré lo siguiente:
Dependiendo de tu uso, dependerá lo que necesites.
sanitize_title()
como dice:
los acentos son eliminados (los caracteres acentuados son reemplazados por equivalentes sin acento)
...y sanitize_title_with_dashes
dice:
Nota que no reemplaza caracteres acentuados especiales
Entonces, con esta cadena de ejemplo: Â+Ä Ö %%% ßá %20 oo %pp + -_^^#@!**()=[]|\/\'"<>?``~ èäç
Resultado de sanitize_title()
:
aa-o-sa-%20-oo-pp-_-eac
Como puedes ver, ha reemplazado los caracteres acentuados con sus equivalentes sin acento y ha eliminado todos los demás caracteres no alfanuméricos excepto el %
que está seguido de un número, pero verás que fue eliminado cuando estaba seguido de una letra; tal vez esto es porque lo percibe como ya codificado. Esto se refuerza cuando intentas insertar %c3
en tu cadena, no lo elimina ya que %c3
es una secuencia de codificación válida.
Resultado de sanitize_title_with_dashes
:
%c3%a2%c3%a4-%c3%b6-%c3%9f%c3%a1-%20-oo-pp-_-%c3%a8%c3%a4%c3%a7
Así que, como puedes 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 ambas...
Cadena de ejemplo: %%% building %20 oo %pp + -_^^#@!**()=[]|\/\'"<>?``~'
Resultado de sanitize_title()
:
building-%20-oo-pp-_
Resultado de sanitize_title_with_dashes
:
building-%20-oo-pp-_
Como puedes ver, son exactamente iguales. Así que parece que la única diferencia entre ellas es que una codifica los caracteres acentuados mientras que la otra los reemplaza.
