UTW ist ein tolles Plugin für WordPress, um Postings mit Tags zu versehen und Tagclouds als Navigationsmittel zu erzeugen. Dabei ist sogar eine Option vorgesehen, mit der sich schöne URL in Form von BASEURL/tag/tag erzeugen lassen. Bislang blieb diese Funktionalität meiner WordPress Installation jedoch versagt. Zwar konnte ich die Option aktivieren, die Tag Links verweisen auch auf URLs wie BASEURL/tag/linux, aber WordPress vermochte sie nicht auf den eigentliche URL BASEURL/index.php?tag=linux umzuschreiben.
Des Rätsels Lösung fand ich während ich mich in das Rewriting von WordPress einarbeitete.
Wenn Permalinks (so der von WordPress gewählte Name für scheinbar statische, saubere URLs) aktiviert werden, schreibt WordPress eine .htaccess mit folgendem Inhalt (gekürzt):
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
Sofern es sich bei der angeforderten Ressource nicht um ein tatsächlich auf dem Webspace vorhandenes Verzeichnis oder File handelt, wird die Anfrage auf die index.php umgeschrieben.
Hier übernimmt dann die Klasse WP_Rewrite, die mit eigenen Regelwerk die sonst an mod_rewrite delegierte Aufgabe übernimmt statische URLs in dynamische umzusetzen. Geparster PHP-Code ist zwar nicht ansatzweise so effizient wie das in C implementiere und bewährte mod_rewrite, bringt aber den entscheidenden Vorteil einer durch Plugins nutzbaren API mit sich. Von der macht der Entwickler des Ultimate Tag Warrior auch Gebrauch, indem er in der Funktion ultimate_rewrite_rules (zu finden in der Datei ultimate-tag-warrior-actions.php) ein neues Rewrite-Tag registriert und zwei neue Rewrite-Regeln hinzufügt.
$wp_rewrite->add_rewrite_tag('%tag%', '([^/]+)', 'tag=');
// without trailing slash
$rules += $wp_rewrite->generate_rewrite_rules($baseurl . "%tag%");
// with trailing slash
$rules += $wp_rewrite->generate_rewrite_rules($baseurl . "%tag%/");
Soweit so gut, funktioniert nur leider nicht. Ich vermutete, dass die von UTW registrierte Rewrite-Regel mit anderen, zuvor hinterlegten, kollidierte. Darum passte ich versuchsweise den Code dahingehend an, dass die UTW-Rewrite-Regeln vor allen anderen abgearbeitete würden.
$wp_rewrite->add_rewrite_tag('%tag%', '([^/]+)', 'tag=');
// without trailing slash
$rules = $wp_rewrite->generate_rewrite_rules($baseurl . "%tag%") + $rules;
// with trailing slash
$rules = $wp_rewrite->generate_rewrite_rules($baseurl . "%tag%/") + $rules;
Und tatsächlich: Nun sind auch saubere URLs mit dem Ultimate Tag Warrior möglich. Alles andere scheint auch zu funktionieren. Jedoch ist das weder eine saubere noch befriedigende Lösung. Ich wüsste gerne, warum und mit welchen Regeln die von UTW registrierten zusammenstoßen. Mir fehlt es momentan allerdings an Zeit und Lust den Code zu debuggen – zumal ich mir nicht sicher bin, ob UTW kaputt ist, WP_Rewrite oder mir nur ein anderes Plugin in die Quere kommt.