Comment WordPress génère-t-il des slugs d'URL?

17

Y a-t-il une page quelque part qui détaille exactement comment WordPress génère des slugs pour les URL? J'écris un script qui doit générer des slugs d'URL identiques à ceux générés par WordPress.

George Edison
la source
Les réponses à cette question sont désormais obsolètes - utilisez plutôt codex.wordpress.org/Function_Reference/wp_unique_post_slug .
SinisterBeard

Réponses:

16

Au départ, je ne peux pas vous donner une page / tutoriel / documentation sur la façon dont les slugs WP sont générés, mais jetez un œil à la sanitize_title()fonction.

Ne vous méprenez pas sur le nom de la fonction, il n'est pas destiné à assainir un titre pour une utilisation ultérieure en tant que titre de page / article . Il prend une chaîne de titre et la renvoie pour être utilisée dans une URL:

  • supprime HTML et PHP
  • dépouille les caractères spéciaux
  • convertit tous les caractères en minuscules
  • remplace les espaces, les traits de soulignement et les points par des tirets / tirets
  • réduit plusieurs tirets consécutifs à un

Il peut y avoir des cas marginaux où le noyau fait quelque chose de plus (vous devez regarder la source pour vérifier que sanitize_title()cela suffira toujours pour générer exactement la même chose que vous attendez), mais cela devrait couvrir au moins 99%, sinon la totalité, des cas .

Johannes Pille
la source
1
@kaiser: Je pensais que vous êtes simplement amoureux de T5 Rewrite :) (qui est à mon agenda pour vérifier) ​​| et généralement: si un titre est vraiment long, WP coupe également les limaces à une certaine longueur maximale. C'est l'un de ces cas où je ne suis pas tout à fait sûr de savoir si cela est également fait par le sanitize_titlefiltre appliqué dans la fonction, ou s'il est géré par autre chose après l'exécution de la fonction.
Johannes Pille
Je suppose que c'est le sanitize_titlefiltre que l'on doit vérifier. Mais il existe également d'autres fonctions connexes . Je n'en ai vraiment aucune idée. Parfois, il semble SimplePieplus facile à comprendre que la WP_Rewritechose. Btw: Toscho travaille sur l'intégration de la fonctionnalité "Monkeyman Rewrite Analyzer" dans son plugin. C'est là que les choses commencent à devenir vraiment intéressantes.
kaiser
1
Pensez également à sanitize_title_with_dashes () si vous voulez être un peu plus explicite sur la génération d'un slug compatible URL.
Tom Auger
5

Vous pouvez utiliser cette fonction:

static public function slugify($text)
{
  // replace non letter or digits by -
  $text = preg_replace('~[^\pL\d]+~u', '-', $text);

  // transliterate
  $text = iconv('utf-8', 'us-ascii//TRANSLIT', $text);

  // remove unwanted characters
  $text = preg_replace('~[^-\w]+~', '', $text);

  // trim
  $text = trim($text, '-');

  // remove duplicate -
  $text = preg_replace('~-+~', '-', $text);

  // lowercase
  $text = strtolower($text);

  if (empty($text)) {
    return 'n-a';
  }

  return $text;
}

C'est exactement le fonctionnement de la fonction de nettoyage d'url wp.

Vivek Sancheti
la source
4

Un cœur à votre service

Il n'y a pas de mode développeur intégré à WordPress à part WP_DEBUG, ce qui ne vous aide pas trop dans ce cas. Fondamentalement, WP utilise l ' "API de réécriture" , qui est un wrapper de bas niveau basé sur une fonction pour la WP_Rewriteclasse, que vous pouvez lire dans Codex . L' global $wp_rewriteobjet est à votre service pour l'inspecter ou interagir avec la classe.

Plugins qui aident à le regarder.

Toschos "T5 Rewrite" -Plugin et Jan Fabrys "Monkeyman Rewrite Analyzer" -Plugin vous guideront votre chemin. J'ai écrit une petite extension pour "T5 Rewrite" pour l'intégrer facilement avec le "Monkeyman Rewrite Analyzer", que vous pouvez trouver dans le wikie de repos "T5 Rewrite" ici sur GitHub .

Le plug-in "Monkeyman" ajoute une nouvelle page, déposée dans le menu de l'interface d'administration sous Outils . Le plug-in "T5 Rewrite" ajoute un nouvel onglet d'aide à la page Paramètres > Permaliens . Mon extension ajoute également les onglets d'aide à la page Outils mentionnée .

Voici une capture d'écran de ce à quoi ressemble le contenu de l'onglet d'aide des plugins "T5 Rewrite".

entrez la description de l'image ici

Vorlage = Motif | Beschreibung = Explication | Beispiele = Exemples

Remarques

Le plug-in "T5 Rewrite" fait un excellent travail en vous aidant à inspecter l'objet de réécriture. Et il fait encore plus: il ajoute de nouvelles possibilités. Par conséquent, cela fait (au moins dans mes installations) une partie de mon package de plugins de base.

kaiser
la source
2

En fait, si vous regardez la fonction principale wp_insert_post (post.php), vous verrez qu'elle fait ce qui suit:

$data['post_name'] = wp_unique_post_slug( sanitize_title( $data['post_title'], $post_ID ), $post_ID, $data['post_status'], $post_type, $post_parent );

$wpdb->update( $wpdb->posts, array( 'post_name' => $data['post_name'] ), $where );

L'essentiel à noter est qu'il utilise à la fois wp_unique_post_slug et sanitize_title:

wp_unique_post_slug( sanitize_title( 
Jahmic
la source
0

Pardonnez d'avoir repris une vieille question, mais j'avais la même nécessité que de découvrir que cette méthode fonctionne parfaitement pour moi:

$some_string = "DON'T STOP ME NOW!";
$slug = sanitize_title(sanitize_title($some_string, '', 'save'), '', 'query');
echo $slug; // dont-stop-me-now

Cette méthode utilise une double désinfection.

Le premier utilise le savemode, où les balises HTML et PHP sont supprimées et les accents sont supprimés (les caractères accentués sont remplacés par des équivalents non accentués).

Le deuxième querymode garantit que tous les espaces sont remplacés par des tirets -et autres signes de ponctuation supprimés.

J'espère que cela aide quelqu'un! :)

GigiSan
la source