WordPress: Sonderzeichen im Slug

Ich arbeite gerade einem Plugin, welches auch automatisch Artikel mit der WordPress-Funktion wp_insert_post() anlegt. Leider hat WordPress ein Problem damit, wenn Sonderzeichen im Titel stehen. Das ist mit letztens schon unter die Nase gekommen, denn da wurden ® (Registered R, wirklich das Zeichen und nicht ®) einfach in… ja, ich muss gestehen, dass ich in 15min. Core-Gewühle nicht herausgefunden habe, warum aus ® %c2%ae wird. Aus „微速度撮影動画まとめ2“ (sowas wie „Nature Timelapse 2“) wird in der Datenbank „%e5%be%ae%e9%80%9f%e5%ba%a6%e6%92%ae%e5%bd%(…)“. Es wird wohl vermutlich eine erweiterte Zeichenkodierung für alle Zeichen sein, ob nun Sonderzeichen oder japanische Schrift. Wer nochmal genau schauen möchte, sucht sich die formatting.php und plugin.php im Ordner /wp-includes und findet die Funktionen sanitize_title() und apply_filters().

Das Problem mit dem Registered R konnte ich so lösen, dass ich mit Frank Bültges Search & Replace-Plugin in der Tabelle posts die Titel (post_title und post_name, post_name ist der zu ändernde Slug) nach %c2%ae durchsucht und durch -r ersetzt habe.

Aber was tun, wenn man nicht nur ein bestimmtes Sonderzeichen in seinem Titel hat? Alle Posts nach solchen Zeichen durchsuchen?

Und was ist denn, wenn die Artikel in einem Plugin mit wp_insert_post() erstellt werden?

Glücklicherweise kann man dem post-Array den post_name (späterer Permalink) mitgeben. Und so sieht meine Funktion dann aus, die mir einen validen post_name generiert:

function createSlug($title, $length = 40) {
  $slug = strtolower($title);
  $slug = preg_replace("/[^a-z0-9\s-]/", "", $slug);
  $slug = trim(preg_replace("/[\s-]+/", " ", $slug));
  $slug = trim(substr($slug, 0, $length));
  $slug = preg_replace("/\s/", "-", $slug);
  return $slug;
}

Nachdem alle Großbuchstaben verkleinert wurden, verschwinden alle Zeichen außer Buchstaben von a-z, Zahlen, Minus- und Leerzeichen. Leerzeichen plus Minus wird durch ein Leerzeichen ersetzt (2 Minuszeichen hintereinander ergeben keine valide URL), von Leerzeichen am Anfang und Ende befreit und auf die gewünschte Länge gestutzt. Die letzten Leerzeichen werden noch durch Minuszeichen ersetzt und fertig ist der Permanlink.

Quelle

Nachtrag vom 28.04.2011 – 15:03 Uhr
Zufällig bin ich heute auf das Plugin „Germanix“ (nicht im WordPress-Plugin-Repository erhältlich) von Thomas Scholz gestoßen, das mir zumindest das Problem mit dem ® abnimmt, ob es auch greift, wenn ich in meinem Plugin einen Artikel via wp_insert_post() anlege, kann ich erst heute Abend testen.

Nachtrag vom 28.04.2011 – 22:52 Uhr
Ja, mit aktiviertem Plugin wird auch der Slug geändert. Leider generiert Germanix bei dem Beispiel oben mit der japanischer Schrift auch zwei „–“ Minuszeichen hintereinander, womit die URL nicht mehr funktionstüchtig ist. Mal sehen, was Thomas Scholz dazu sagt, meine Erkenntnis war bisher, dass man einfach nur die Funktionsaufrufe von remove_doubles() und lower_ascii() tauschen muss, damit im letzten Schritt doppelte Minuszeichen entfernt werden.

Nachtrag vom 29.04.2011 – 11:31 Uhr
Es wurde sich darum gekümmert. Reaktion und Bug-Beseitigung innerhalb von weniger als 24 Stunden – sehr löblich. :)

Diesen Artikel weiterempfehlen:

Über Benjamin Strilziw

Benjamin Strilziw ist der internerz und schreibt über Fotografie, Webentwicklung und das Web im Jahre 2011. Folge ihm auf Twitter oder Facebook.

27. April 2011 von Benjamin Strilziw
Kategorien: Web, WordPress | 2 Kommentare

Kommentare (2)

  1. Vielen Dank!

    Kleine Korrektur:

    function createSlug($title, $length = 40) {
    $slug = strtolower($title);
    $slug = preg_replace(„/[^a-z0-9\s-]/“, „“, $slug);
    $slug = trim(preg_replace(„/[\s-]+/“, “ „, $slug));
    $slug = trim(substr($slug, 0, $length));
    $slug = preg_replace(„/\s/“, „-„, $slug);
    return $slug;
    }

Schreibe einen Kommentar