web-dev-qa-db-fra.com

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

Existe-t-il une page quelque part qui explique 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.

14
George Edison

D'entrée de jeu, je ne peux pas vous donner de page/tutoriel/documentation sur la façon dont WP slug sont générés, mais jetez un coup d'œil à la fonction sanitize_title() .

Ne vous méprenez pas sur le nom de la fonction, c’est pas destiné à assainir un titre pour un usage ultérieur en tant que titre de page/poste. Il faut un titre et le retourne pour qu'il soit utilisé dans une URL:

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

Il se peut que il y ait des cas où le noyau effectue quelque chose de plus (vous devez vérifier le code source pour vérifier que sanitize_title() suffira toujours pour générer exactement exactement la même chose que vous attendez), mais cela devrait couvrir au moins 99%, sinon tous les cas.

12
Johannes Pille

Core à votre service

Il n'y a pas de mode développeur intégré à WordPress en dehors de WP_DEBUG, ce qui ne vous aidera pas beaucoup dans ce cas. Fondamentalement, WP utilise le "API de réécriture" , qui est un encapsuleur de bas niveau pour la classe WP_Rewrite, que vous pouvez lire dans Codex }. L'objet global $wp_rewrite se tient à votre service pour l'inspecter ou interagir avec la classe.

Des plugins qui aident à regarder dedans.

Toschos "T5 Rewrite" -Plugin et Jan Fabrys "Monkeyman Rewrite Analyzer" -Plugin vous guidera dans votre chemin. J'ai écrit une petite extension pour "T5 Rewrite" pour l'intégrer en douceur au "Monkeyman Rewrite Analyzer", que vous pouvez trouver dans le compte-rendu "T5 Rewrite" wikie ici sur GitHub .

Le plug-in "Monkeyman" ajoute une nouvelle page, classée dans le menu de l'interface utilisateur administrative 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 Tools - mentionnée.

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

enter image description here

Vorlage = Motif | Beschreibung = Explication | Beispiele = Exemples

Remarques

Le plug-in "T5 Rewrite" vous aide à inspecter l'objet de réécriture. Et cela fait encore plus: Cela ajoute de nouvelles possibilités. C'est pourquoi (du moins dans mes installations) fait partie de mon paquet de plugins de base.

4
kaiser

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 ce que fait la fonction de désinfection d'url wp.

4
Vivek Sancheti

En fait, si vous regardez la fonction principale wp_insert_post (post.php), vous verrez qu’elle effectue les opérations suivantes:

$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 d'utiliser à la fois wp_unique_post_slug et sanitize_title:

wp_unique_post_slug( sanitize_title( 
2
Jahmic

Pardonnez de reprendre une vieille question, mais j'avais la même nécessité que celle trouvée 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 mode save, 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 second mode query garantit que tous les espaces sont remplacés par des tirets - et que toute autre ponctuation est supprimée.

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

0
GigiSan