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.
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.
Réponses:
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:
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 .
sanitize_title
filtre appliqué dans la fonction, ou s'il est géré par autre chose après l'exécution de la fonction.
sanitize_title
filtre 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 SimplePie
plus facile à comprendre que la WP_Rewrite
chose. 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.
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.
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_Rewrite
classe, que vous pouvez lire dans Codex . L' global $wp_rewrite
objet est à votre service pour l'inspecter ou interagir avec la classe.
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".
Vorlage = Motif | Beschreibung = Explication | Beispiele = Exemples
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.
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(
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 save
mode, 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 query
mode 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! :)