Cum generează WordPress slug-urile pentru URL-uri?
După cum a menționat @SinisterBeard într-un comentariu foarte pertinent la această întrebare, acum câțiva ani, acest răspuns este depășit, iar funcția/funcțiile menționate au fost înlocuite de un API mai nou:
Vezi wp_unique_post_slug
.
Răspunsul original
Din start, nu vă pot oferi o pagină/tutorial/documentație despre cum sunt generate slug-urile în WordPress, dar aruncați o privire la funcția sanitize_title()
.
Nu vă lăsați păcăliți de numele funcției, aceasta nu este menită să santineze un titlu pentru a fi folosit ca titlu de pagină/postare. Ea preia un șir de titlu și îl returnează gata de utilizat într-un URL:
- elimină HTML & PHP
- elimină caracterele speciale
- converteste toate caracterele în litere mici
- înlocuiește spațiile, underscore-urile și punctele cu cratime/liniuțe
- reduce mai multe cratime consecutive la una singură
Pot exista cazuri particulare în care nucleul WordPress face ceva suplimentar (ar trebui să verificați codul sursă pentru a confirma că sanitize_title()
va fi întotdeauna suficientă pentru a genera exact ceea ce vă așteptați), dar aceasta ar trebui să acopere cel puțin 99%, dacă nu toate, cazurile.

@kaiser: Am înțeles că ești pur și simplu îndrăgostit de T5 Rewrite :) (care e pe lista mea de verificat) | și în general: Dacă un titlu este foarte lung, WP va trunchia și slug-urile până la o anumită lungime maximă. E unul dintre acele cazuri în care nu sunt sigur dacă asta e realizat prin filtrul sanitize_title
aplicat în funcție, sau dacă e gestionat de altceva după ce funcția a rulat.

Presupun că filtrul sanitize_title
este cel pe care trebuie să-l verifici. Dar există și alte funcții conexe. Chiar nu am idee despre asta. Uneori pare că SimplePie
e mai ușor de înțeles decât chestia asta cu WP_Rewrite
. Apropo: Toscho lucrează la integrarea funcționalității "Monkeyman Rewrite Analyzer" în plugin-ul său. Acolo lucrurile încep să devină cu adevărat interesante.

Ia în considerare și sanitize_title_with_dashes() dacă vrei să fii mai explicit în generarea unui slug prietenos pentru URL-uri.

Puteți folosi această funcție:
static public function slugify($text)
{
// înlocuiește caracterele care nu sunt litere sau cifre cu -
$text = preg_replace('~[^\pL\d]+~u', '-', $text);
// transliterează
$text = iconv('utf-8', 'us-ascii//TRANSLIT', $text);
// elimină caracterele nedorite
$text = preg_replace('~[^-\w]+~', '', $text);
// elimină spațiile de la început și sfârșit
$text = trim($text, '-');
// elimină caracterele - duplicate
$text = preg_replace('~-+~', '-', $text);
// convertește în litere mici
$text = strtolower($text);
if (empty($text)) {
return 'n-a';
}
return $text;
}
Funcționează aproape identic cu funcția de sanatizare URL din WordPress.

Am dat peste asta întâmplător astăzi. Spui, "Este cam exact cum funcționează funcția de sanitarizare a URL-urilor din wp." Atunci, având în vedere că cineva este deja în contextul execuției php conectat la unele funcționalități WordPress fie dintr-un lanț de apeluri bazat pe temă, fie pe plugin, Pentru ce motiv imaginabil nu s-ar folosi pur și simplu una dintre funcțiile relevante ale API-ului nativ sanitize*
? Deja disponibil ca funcție gratuită în namespace-ul global, pentru bine sau pentru rău. De ce să recomanzi adăugarea a încă 503 de octeți la codul sursă ~distribuit~ care duplică funcționalități existente? Doar pentru că este posibil?

@JohannesPille după înțelegerea mea, OP dorea să aibă un generator de slug
în afara WP, dar asigurându-se totuși că slug-urile generate să fie compatibile cu WP. Deși este adevărat că această funcționalitate există deja în codul WP, totuși, pentru a o folosi în afara WordPress, ar însemna practic să incluzi aproape tot codul WP — care este substanțial mai mult decât 503 de octeți de cod :)

Nucleul la dispoziția ta
Nu există un mod dezvoltator încorporat în WordPress, în afară de WP_DEBUG
, care nu te ajută prea mult în acest caz. Practic, WP folosește "Rewrite API", care este un wrapper de nivel scăzut, bazat pe funcții, pentru WP_Rewrite
class, despre care poți citi în Codex. Obiectul global $wp_rewrite
este la dispoziția ta pentru a-l inspecta sau pentru a interacționa cu clasa.
Plugin-uri care ajută la inspectare.
Plugin-ul "T5 Rewrite" de la Toschos și Plugin-ul "Monkeyman Rewrite Analyzer" de la Jan Fabry te vor ghida. Am scris o mică extensie pentru "T5 Rewrite" pentru a-l integra ușor cu "Monkeyman Rewrite Analyzer", pe care o poți găsi în wiki-ul repository-ului "T5 Rewrite" aici pe GitHub.
Plugin-ul "Monkeyman" adaugă o pagină nouă, disponibilă în meniul UI de administrare sub Unelte. Plugin-ul "T5 Rewrite" adaugă un nou tab de ajutor în pagina Setări > Legături permanente. Extensia mea adaugă tab-urile de ajutor și pe pagina menționată Unelte.
Iată o captură de ecran cu conținutul tab-ului de ajutor din plugin-ul "T5 Rewrite".
Vorlage = Model | Beschreibung = Explicație | Beispiele = Exemple
Note
Plugin-ul "T5 Rewrite" face o treabă minunată în a te ajuta să inspectezi obiectul de rescriere. Și face chiar mai mult: Adaugă posibilități noi. Prin urmare, este (cel puțin în instalările mele) parte din pachetul meu de plugin-uri de bază.

Iertare pentru reluarea unei întrebări vechi, dar am avut aceeași necesitate și am descoperit că această metodă funcționează perfect pentru mine:
$some_string = "DON'T STOP ME NOW!";
$slug = sanitize_title(sanitize_title($some_string, '', 'save'), '', 'query');
echo $slug; // dont-stop-me-now
Această metodă utilizează o dublă sanitarizare.
Prima folosește modul save
, unde tag-urile HTML și PHP sunt eliminate, iar accentele sunt înlăturate (caracterele cu accente sunt înlocuite cu echivalentele lor fără accente).
Al doilea mod query
asigură înlocuirea tuturor spațiilor cu liniuțe -
și eliminarea altor semne de punctuație.
Sper că acest lucru îi va ajuta pe cineva! :)

De fapt, dacă te uiți la funcția de bază wp_insert_post (post.php), vei vedea că face următoarele:
$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 );
Cheia de luat notă este că folosește atât wp_unique_post_slug cât și sanitize_title:
wp_unique_post_slug( sanitize_title(
