WordPress kann man zwar mit Sprachdateien bestücken, allerdings kann und wird nicht alles übersetzt.
So bleiben zum Beispiel die Permalinks meistens noch in Englisch. So auch der Slug für die Seitennavigation: example.de/page/2
.
WordPress wäre aber nicht WordPress, wenn es da nicht auch eine Möglichkeit gäbe, dies zu ändern.
Folgender Schnipsel für die functions.php
zeigt dies.
<?php
/**
* Setzt die Seitenbasis für die Permalinkgenerierung auf /seite/ (Standard: /page/).
*
* @author Dominik Schilling
* @license GPLv2
* @link https://dominikschilling.de/141/
*
* @version 0.1
*/
function ds_set_pagination_base() {
global $wp_rewrite;
$wp_rewrite->pagination_base = 'seite';
}
add_action( 'init', 'ds_set_pagination_base' );
Diese Änderung kann übrigens auch für die Basen $author_base
, $search_base
, $comments_base
und $feed_base
übernommen werden, siehe dazu auch /wp-includes/rewrite.php
.
Hinweis
Mit dieser Funktion wird erstmal nur die Basis für die Permalinkgenerierung geändert. Das heißt die Permalinks müssen jetzt noch generiert werden.
Dazu einmal die Seite /wp-admin/options-permalink.php
im Browser deiner Wahl öffnen und gegebenfalls den Änderungen übernehmen
Button klicken.
>Das heißt die Permalinks müssen jetzt noch generiert werden.
Einfach noch $wp_rewrite->flush_rules(); hinzufügen. Der Aufruf erledigt den Job.
Hi Ralf,
danke für deinen Hinweis.
$wp_rewrite->flush_rules();
bei jedem init auszuführen ist allerdings ein No-Go, da jedesmal die Permalinks neu in die Datenbank gespeichert werden müssen.Das ist richtig. Allerdings erstellst du auch keinen neuen Permalink, deswegen kannst du dir den Klick auch sparen.
wp-includes/rewrite.php Zeile 1210-1212:
$pageregex = $this->pagination_base . '/?([0-9]{1,})/?$';
Der Regexp für die Seiten wird dynamisch erzeugt und nicht aus der Datenbank gelesen. In den Rewrite-Rules die in der DB stehen wird pagination_base nicht verwendet.
Alternativ, und ich halte das für die bessere weil performantere Lösung, kannst du ein Plugin erstellen das bei der Aktivierung eine neue Rewrite-Rule anlegt und bei der Deaktivierung diese löscht. Damit würden auch alte Links nach dem Format “page/xyz” weiterhin funktionieren und der Funktionsaufruf bei jedem Init würde ebenfalls wegfallen. Obendrein würden die Links auch bei einem Theme-Wechsel weiterhin funktionieren.
Hi Ralf,
das kann ich nicht besätigen. Die neue Struktur wird in der Datenbank gespeichert, siehe
rewrite_rules
.Hier mal ein Auszug für diesen Blog:
Wenn eine Permalink-Struktur verwendet wird, wird diese gespeichert. Und wenn nicht? Ist auf den meisten meiner lokalen Test-Blogs so, deswegen wird das bei mir nicht gespeichert. Der Klick auf “Optionen speichern”, der in diesen Fall nichts anderes macht als ein flush_rules, ist also nicht in jeden Fall nötig bzw. sinnvoll.
Wenn die Permalinks in der Datenbank gespeichert sind, musst du nicht bei jedem init pagination_base verbiegen. Den einzigen Effekt den du damit erreichst ist, dass Seiten nach dem Format “/paged=xyz” nicht mehr gefunden werden.
Dafür kannst du aber abfragen ob eine bestimmte Rewrite-Rule bereits existiert und dir dann bestimmte Teile ersparen. Also in etwa:
– Abfrage ob Rewrite-Rule existiert (s.u.)
– Wenn nicht, Verbiegen und flushen.
– Wenn ja, abfragen ob Permalinkstruktur verwendet wird
– Wenn nicht, dann pagination_basis ggf. verbiegen und flushen sparen
global $wp_rewrite;
$rules = $wp_rewrite->rewrite_rules();
if( array_key_exists( $rules, 'seite/?([0-9]{1,})/?$' ) )
// check auf permalinkstruktur
else
// verbiegungsroutine
Hi Dominik
Danke für Deinen Tipp mit der Seitenbasis. Wenn ich diesen Code jedoch für die Such-URL anwenden möchte und dabei search_base verwende, scheint das nicht zu funktionieren. Habe ich was übersehen?
Woran erkennst du, dass es nicht funktioniert?
Hast du mal
domain.de/suche/testbegriff
probiert, wobeisuche
deinsearch_base
ist?Klasse Tipp und eine schöne Detailverbesserung, vielen Dank!