web-dev-qa-db-fra.com

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

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

15
a_fan

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

26
Brady

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 de sanitize_title() supprimera d'abord tous les caractères spéciaux, puis appliquera le filtre sanitize_title, appelant ainsi sanitize_title_with_dashes().

Comme @JHoffmann l'a souligné, le simple fait d'appeler sanitize_title_with_dashes() ne supprimera pas les caractères spéciaux.

2
Jules

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

Si nous regardons dans wp_insert_post() nous voyons, le $post_name est désinfecté avec 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 connecté à ce filtre (voir wp-includes/default-filters.php ).

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

J'ai essayé sanitize_title () mais il reste% c2% a0 dans le résultat.

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

1
websupporter

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

En fonction de votre utilisation, cela dépendra de vos besoins.

sanitize_title() comme il est écrit:

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

... et sanitize_title_with_dashes dit:

Notez que ne remplace pas les caractères spéciaux accentués

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

sanitize_title() result:

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

Comme vous pouvez le voir, il a remplacé caractères accentués avec leurs équivalents non accentués et, il a supprimé tous les autres caractères non alphanumériques à l'exception du % suivi d'un nombre, mais vous verrez il a été enlevé quand il a été suivi d'une lettre; c'est peut-être parce qu'il le perçoit comme déjà encodé . Ceci est appliqué lorsque vous essayez d'insérer %c3 dans votre chaîne, cela ne la supprime pas car %c3 est une 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 constater, les caractères accentués n’ont pas été supprimés, mais codés.

Maintenant, regardons une chaîne avec non caractères accentués pour voir comment ils se comportent tous les deux ...

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

sanitize_title() result:

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

sanitize_title_with_dashes résultat:

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

Donc, comme vous pouvez le constater, ils sont exactement identiques. Il semble donc que la seule différence entre eux est qu’un encode chartes accentuées, tandis que l’autre remplace eux.

0
Brett