Cum generează WordPress slug-urile pentru URL-uri?

30 nov. 2012, 04:24:15
Vizualizări: 36K
Voturi: 25

Există undeva o pagină care să detalieze exact cum generează WordPress slug-urile pentru URL-uri? Scriu un script care trebuie să genereze slug-uri pentru URL-uri identice cu cele generate de WordPress.

2
Comentarii

Răspunsurile la această întrebare sunt acum depășite - folosește https://codex.wordpress.org/Function_Reference/wp_unique_post_slug în loc.

SinisterBeard SinisterBeard
5 mai 2016 12:33:11

@SinisterBeard Am dat peste asta întâmplător astăzi. Ai fi fost binevenit să adaugi un răspuns nou sau să editezi cel acceptat. Îl voi actualiza acum. Mai bine târziu decât niciodată. Mulțumesc pentru observația validă.

Johannes Pille Johannes Pille
30 aug. 2020 15:39:37
Toate răspunsurile la întrebare 5
3
25

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.

30 nov. 2012 04:42:30
Comentarii

@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.

Johannes Pille Johannes Pille
30 nov. 2012 20:24:49

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.

kaiser kaiser
30 nov. 2012 20:52:33

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

Tom Auger Tom Auger
9 dec. 2014 18:17:47
2

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.

8 iun. 2016 10:35:05
Comentarii

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?

Johannes Pille Johannes Pille
30 aug. 2020 15:35:57

@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 :)

Gwyneth Llewelyn Gwyneth Llewelyn
10 apr. 2023 13:20:20
0

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".

Captură de ecran a tab-ului de ajutor 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ă.

30 nov. 2012 04:38:24
0

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! :)

5 iun. 2018 13:23:56
0

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(
26 sept. 2016 12:38:05