En WordPress disponemos de varias funciones para sanitizar cadenas y eliminar acentos: sanitize_text_field, sanitize_html_class, sanitize_key, remove_accents… pero es posible que en alguna ocasión se te queden cortas o no cumplan exactamente con lo que necesitas.
Por ejemplo, que limpie una cadena, pero te mantenga los espacios en blanco en lugar de sustituirlos por guiones medios, que sustituya algunos caracteres especiales por otro caracter, o que los elimine de la cadena, etc…
Es por eso que comparto esta función, que puedes añadir a tus desarrollos:
<?php
function my_sanitize_string( string $string, string $char_to_replace = '', bool $keep_spaces = false): string {
$blacklist = [
'%',
'ª',
'º',
',',
'.',
':',
';',
'[',
']',
'{',
'}',
'+',
'?',
'¿',
"'",
'*',
'"',
'^',
'&',
'#',
'(',
')',
'·',
'´',
'`',
'@',
'!',
'|',
'/',
'\\',
'®',
'<',
'>',
];
$spaces = wp_spaces_regexp();
$sanitize_string = str_replace( $blacklist, $char_to_replace, $string );
$sanitize_string = preg_replace( "/(?:{$spaces})+/", $keep_spaces ? ' ' : '-', trim( $sanitize_string ) );
$sanitize_string = remove_accents( $sanitize_string );
$sanitize_string = preg_replace( '/_+/', '-', $sanitize_string );
$sanitize_string = preg_replace( '/-+/', '-', $sanitize_string );
return mb_strtolower( $sanitize_string );
}
Esta función recibe 3 parámetros:
- $string: la cadena que vamos a «limpiar»
- $char_to_replace: El caracter por el que vamos a sustituir todos los caracteres «rarunos» que encontremos. Por defecto los eliminamos
- $keep_spaces: Si es true, mantendremos los espacios en la cadena, en caso contrario (y por defecto) los sustituiremos por guiones medios
Lo primero que tenemos es una lista negra de caracteres que vamos a querer eliminar o sustituir por el parámetro $char_to_replace. A continuación, sustituiremos los espacios por guiones medios, excepto que $keep_spaces sea true.
Después de esto, pasamos la cadena por la función remove_accents de WordPress, y por último nos aseguramos de que no haya más de dos guiones medios y/o bajos consecutivos.
Una vez hecha la limpia, retornamos la cadena en minúscula.