Sanitize_title est-il suffisant pour générer des post-slugs?

16

Je veux générer un slug pour certaines chaînes sans passer par le flux de génération de slugs WordPress. Par conséquent, je veux savoir quelles fonctions il appelle pour obtenir une limace nette. J'ai essayé sanitize_title () mais cela laisse% c2% a0 en résultat.

un fan
la source

Réponses:

27

Tu es presque là. La fonction dont vous avez besoin est sanitize_title_with_dashes ($ title)

Brady
la source
1
Bien que cela semble définitivement correct, je ne suis pas certain de ce que sanitize_title_with_dashes semble faire différemment de sanitize_title. sanitize_title ajoute également des tirets là où se trouve un espace ...
Tim Malone
7
Si vous vérifiez le code WordPress Codex pour sanitize_title_with_dashes ($ title) , vous verrez la note `` il ne remplace pas les caractères accentués spéciaux '', ce qui signifie que des caractères comme èäçetc. resteront en place avec cette fonction.
JHoffmann
Veuillez noter qu'en sanitize_title_with_dashesplus de sanitize_titlelaisser des caractères spéciaux qui peuvent casser certains systèmes. Si vous voulez une approche plus universelle pour réduire les cordes, jetez un œil àsanitize_html_class
GDY
2

Eh bien, il y a déjà une réponse, mais je voulais l'étendre un peu, voici donc mes conclusions:

Si nous regardons, wp_insert_post()nous voyons, le $post_nameest assaini en utilisant wp_sanitize_title()(voir wp-includes/post.php)

Dans la fonction, sanitize_title()nous avons un filtre sanitize_title. Ceci est intéressant, car dans les filtres par défaut sanitize_title_with_dashes()est accroché à ce filtre (voir wp-includes/default-filters.php).

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

J'ai essayé sanitize_title () mais cela laisse% c2% a0 en résultat.

Cela semble étrange. Ce serait formidable de connaître la valeur d'entrée, mais suivre wp_insert_post() sanitize_title()semble être suffisant.

Websupporter
la source
2

sanitize_title() semble être le seul dont vous avez besoin.

Dans la ligne 211 de wp-includes / default-filters.php, vous trouverez:

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

Cela signifie que l'appel sanitize_title() supprimera d'abord tous les caractères spéciaux, puis appliquera le sanitize_titlefiltre, appelant ainsisanitize_title_with_dashes()

Comme l'a souligné @JHoffmann, un simple appel sanitize_title_with_dashes()ne supprimera pas les caractères spéciaux.

Jules
la source
Cela devrait être la bonne réponse
bysanchy
0

En plus de l'excellente réponse du websupporter j'ai trouvé ce qui suit:

En fonction de votre utilisation, cela dépendra de ce dont vous avez besoin.

sanitize_title() comme il est dit:

les accents sont supprimés (les caractères accentués sont remplacés par des équivalents non accentués)

... et sanitize_title_with_dashesdit:

Notez qu'il ne remplace pas les caractères accentués spéciaux

Donc, avec cet exemple de chaîne:Â+Ä Ö %%% ßá %20 oo %pp + -_^^#@!**()=[]|\/\'"<>?``~ èäç

sanitize_title() résultat:

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

Comme vous pouvez le voir, il a remplacé les caractères accentués par leurs équivalents non accentués et il a supprimé tous les autres caractères non alphanumériques à l'exception de celui %qui est suivi d'un nombre, mais vous verrez qu'il a été supprimé lorsqu'il a été suivi d'une lettre; c'est peut-être parce qu'il le perçoit comme déjà codé . Ceci est appliqué lorsque vous essayez d'insérer %c3dans votre chaîne, il ne la supprime pas comme %c3une séquence de codage valide.

sanitize_title_with_dashes résultat:

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

Comme vous pouvez le voir, il n'a pas supprimé les caractères accentués, mais les a encodés.

Examinons maintenant une chaîne sans caractères accentués pour voir comment ils se comportent tous les deux ...

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

sanitize_title() résultat:

bâtiment-% 20-oo-pp-_

sanitize_title_with_dashes résultat:

bâtiment-% 20-oo-pp-_

Comme vous pouvez le voir, ils sont exactement les mêmes. Il semble donc que la seule différence entre elles est que l'une code les chartes accentuées tandis que l'autre les remplace .

Brett
la source