Wie generiert WordPress URL-Slugs?

17

Gibt es irgendwo eine Seite, die genau beschreibt, wie WordPress Slugs für URLs generiert? Ich schreibe ein Skript, das URL-Slugs generiert, die mit denen von WordPress identisch sind.

George Edison
quelle
Die Antworten auf diese Frage sind jetzt veraltet. Verwenden Sie stattdessen codex.wordpress.org/Function_Reference/wp_unique_post_slug .
SinisterBeard

Antworten:

16

Auf Anhieb kann ich Ihnen keine Seite / Anleitung / Dokumentation zur Erzeugung von WP-Slugs geben, aber werfen Sie einen Blick auf die sanitize_title()Funktion.

Verursachen Sie keinen falschen Eindruck durch den Funktionsnamen. Es ist nicht dazu gedacht, einen Titel für die weitere Verwendung als Seiten- / Beitragstitel zu bereinigen . Es wird eine Titelzeichenfolge verwendet und zur Verwendung in einer URL zurückgegeben:

  • Streifen HTML & PHP
  • Streifen spezielle Zeichen
  • wandelt alle Zeichen in Kleinbuchstaben um
  • Ersetzt Leerzeichen, Unterstriche und Punkte durch Bindestriche
  • Reduziert mehrere aufeinanderfolgende Striche auf einen

Es könnte Rand Fälle, in denen der Kern tut etwas zusätzliche (Sie an der Quelle aussehen müsste , um das überprüfen sanitize_title()wird immer ausreichen , bei der Erzeugung von genau den gleichen Sie erwarten), aber dies mindestens 99% abdecken sollte, wenn nicht sogar alle Fälle .

Johannes Pille
quelle
1
@kaiser: Ich dachte, du bist einfach verliebt in T5 Rewrite :) (was auf meiner Agenda steht, um es dir anzusehen ) | und allgemein: Wenn ein Titel wirklich lang ist, schneidet WP auch Butzen auf eine bestimmte maximale Länge. Dies ist einer der Fälle, in denen ich nicht ganz sicher bin, ob dies auch von dem sanitize_titlein der Funktion angewendeten Filter durchgeführt wird oder ob dies von etwas anderem erledigt wird, nachdem die Funktion ausgeführt wurde.
Johannes Pille
Ich denke, es ist der sanitize_titleFilter, den man auschecken muss. Es gibt aber auch andere verwandte Funktionen . Ich habe wirklich keine Ahnung davon. Manchmal scheint SimplePiees einfacher zu verstehen als das WP_RewriteDing. Btw: Toscho arbeitet daran, die "Monkeyman Rewrite Analyzer" -Funktionalität in sein Plugin zu integrieren. Dort werden die Dinge wirklich interessant.
Kaiser
1
Ziehen Sie auch sanitize_title_with_dashes () in Betracht, wenn Sie das Generieren eines URL-freundlichen Slugs etwas expliziter gestalten möchten.
Tom Auger
5

Sie können diese Funktion verwenden:

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;
}

Genau so funktioniert die Funktion wp url desinfizieren.

Vivek Sancheti
quelle
4

Kern zu Ihren Diensten

Abgesehen von WordPress gibt es keinen integrierten EntwicklermodusWP_DEBUG , der Ihnen in diesem Fall nicht allzu viel hilft. Grundsätzlich verwendet WP die "Rewrite API" , einen funktionsbasierten Low-Level-Wrapper für die WP_RewriteKlasse, über den Sie im Codex lesen können . Das global $wp_rewriteObjekt steht zu Ihren Diensten, um es zu inspizieren oder mit der Klasse zu interagieren.

Plugins, die bei der Suche helfen.

Toschos "T5 Rewrite" -Plugin und Jan Fabrys "Monkeyman Rewrite Analyzer" -Plugin leiten Sie Ihren Weg. Ich habe eine kleine Erweiterung für "T5 Rewrite" geschrieben, um sie nahtlos in den "Monkeyman Rewrite Analyzer" zu integrieren, den Sie im "T5 Rewrite" -Repos-Wiki hier auf GitHub finden .

Das "Monkeyman" -Plugin fügt eine neue Seite hinzu, die im Admin-UI-Menü unter Tools abgelegt ist . Das "T5 Rewrite" -Plugin fügt der Seite Einstellungen > Permalinks eine neue Hilferegisterkarte hinzu . Meine Erweiterung fügt die Hilferegisterkarten zu den genannten hinzu Tools-Seite hinzu.

Hier ist ein Screenshot, wie der Inhalt der Registerkarte "T5 Rewrite" -Plugins-Hilfe aussieht.

Bildbeschreibung hier eingeben

Vorlage = Pattern | Beschreibung = Erklärung | Beispiele

Anmerkungen

Das "T5 Rewrite" -Plugin leistet hervorragende Arbeit bei der Überprüfung des Rewrite-Objekts. Und es macht noch mehr: Es fügt neue Möglichkeiten hinzu. Daher ist es (zumindest in meinen Installationen) Teil meines Basis-Plugins-Pakets.

Kaiser
quelle
2

Wenn Sie sich die Kernfunktion wp_insert_post (post.php) ansehen, werden Sie feststellen, dass sie Folgendes bewirkt:

$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 );

Das Wichtigste ist, dass sowohl wp_unique_post_slug als auch sanitize_title verwendet werden:

wp_unique_post_slug( sanitize_title( 
Jahmic
quelle
0

Verzeihen Sie die Wiederaufnahme einer alten Frage, aber ich hatte die gleiche Notwendigkeit herausgefunden, dass diese Methode für mich perfekt funktioniert:

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

Diese Methode verwendet eine doppelte Desinfektion.

Der erste benutzt den save Modus Modus, in dem HTML- und PHP-Tags entfernt und Akzente entfernt werden (Zeichen mit Akzent werden durch nicht akzentuierte Entsprechungen ersetzt).

Der zweite queryModus stellt sicher, dass alle Leerzeichen durch Bindestriche ersetzt werden- und andere Satzzeichen ersetzt werden.

Hoffe das hilft jemandem! :)

GigiSan
quelle