È sufficiente sanitize_title per generare gli slug dei post?
Voglio generare uno slug per alcune stringhe senza passare attraverso il flusso di generazione degli slug di WordPress. Pertanto, vorrei sapere quali funzioni vengono chiamate per ottenere uno slug pulito. Ho provato sanitize_title() ma lascia %c2 %a0 nel risultato.

Ci sei quasi. La funzione di cui hai bisogno è sanitize_title_with_dashes( $title )

Anche se questo sembra decisamente corretto, non mi è del tutto chiaro cosa faccia di diverso sanitize_title_with_dashes rispetto a sanitize_title. Anche sanitize_title aggiunge trattini dove c'è spazio bianco...

Se controlli il Codex di WordPress per sanitize_title_with_dashes( $title ), vedrai la nota 'non sostituisce i caratteri accentati speciali' il che significa che caratteri come èäç
ecc. rimarranno al loro posto con questa funzione.

Nota che sia sanitize_title_with_dashes
che sanitize_title
lasciano alcuni caratteri speciali che potrebbero causare problemi in alcuni sistemi. Se vuoi un approccio più universale per ridurre le stringhe, dai un'occhiata a sanitize_html_class

Questa risposta è errata, come spiegato nei commenti, e l'autore dovrebbe aggiornarla, magari indicando una risposta più corretta come https://wordpress.stackexchange.com/a/294587/27896

sanitize_title()
sembra essere l'unica funzione di cui hai bisogno.
In wp-includes/default-filters.php alla riga 211 troverai:
add_filter( 'sanitize_title', 'sanitize_title_with_dashes', 10, 3);
Questo significa che chiamare sanitize_title()
rimuoverà prima tutti i caratteri speciali, poi applicherà il filtro sanitize_title
, chiamando così sanitize_title_with_dashes()
Come ha sottolineato @JHoffmann, semplicemente chiamando sanitize_title_with_dashes()
non verranno rimossi i caratteri speciali.

Bene, esiste già una risposta, ma volevo ampliarla un po', quindi ecco le mie scoperte:
Se diamo un'occhiata a wp_insert_post()
vediamo che $post_name
viene sanificato utilizzando wp_sanitize_title()
(vedi wp-includes/post.php
)
Nella funzione sanitize_title()
abbiamo un filtro sanitize_title
. Questo è interessante, poiché nei filtri predefiniti sanitize_title_with_dashes()
è collegato a questo filtro (vedi wp-includes/default-filters.php
).
<?php
echo sanitize_title( 'Â+ÄÖßáèäç' ) // aaeoessaeaec
?>
Ho provato sanitize_title() ma lascia %c2 %a0 nel risultato.
Questo sembra strano. Sarebbe utile conoscere il valore di input, ma seguendo wp_insert_post()
sanitize_title()
sembra essere sufficiente.

Oltre all'ottima risposta di websupporter, ho trovato quanto segue:
A seconda del tuo utilizzo, dipenderà ciò di cui hai bisogno.
sanitize_title()
come dice:
gli accenti vengono rimossi (i caratteri accentati vengono sostituiti con equivalenti non accentati)
...e sanitize_title_with_dashes
dice:
Nota che non sostituisce i caratteri accentati speciali
Quindi, con questa stringa di esempio: Â+Ä Ö %%% ßá %20 oo %pp + -_^^#@!**()=[]|\/\'"<>?``~ èäç
Risultato di sanitize_title()
:
aa-o-sa-%20-oo-pp-_-eac
Come puoi vedere ha sostituito i caratteri accentati con i loro equivalenti non accentati e ha rimosso tutti gli altri caratteri non alfanumerici tranne il %
seguito da un numero, ma vedrai che è stato rimosso quando era seguito da una lettera; forse questo perché lo percepisce come già codificato. Questo è confermato quando provi a inserire %c3
nella tua stringa, non lo rimuove poiché %c3
è una sequenza di codifica valida.
Risultato di sanitize_title_with_dashes
:
%c3%a2%c3%a4-%c3%b6-%c3%9f%c3%a1-%20-oo-pp-_-%c3%a8%c3%a4%c3%a7
Quindi come puoi vedere non ha rimosso i caratteri accentati, ma li ha codificati.
Ora osserviamo una stringa senza caratteri accentati per vedere come si comportano entrambi...
Stringa di esempio: %%% building %20 oo %pp + -_^^#@!**()=[]|\/\'"<>?``~'
Risultato di sanitize_title()
:
building-%20-oo-pp-_
Risultato di sanitize_title_with_dashes
:
building-%20-oo-pp-_
Quindi come puoi vedere sono esattamente gli stessi. Quindi sembra che l'unica differenza tra loro sia che uno codifica i caratteri accentati mentre l'altro li sostituisce.
