Seitenbasis /page/ für Permalinks anpassen

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 / RAW / github:gist
<?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.

8 thoughts on “Seitenbasis /page/ für Permalinks anpassen”

  1. >Das heißt die Permalinks müssen jetzt noch generiert werden.
    Einfach noch $wp_rewrite->flush_rules(); hinzufügen. Der Aufruf erledigt den Job.

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

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

    1. 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:

      array(120) {
        ["schnipsel/seite/([0-9]{1,})/?$"] =>
        string(47) "index.php?post_type=schnipsel&paged=$matches[1]"
        ["thema/(.+?)/seite/?([0-9]{1,})/?$"] =>
        string(53) "index.php?category_name=$matches[1]&paged=$matches[2]"
        ["tag/([^/]+)/seite/?([0-9]{1,})/?$"] =>
        string(43) "index.php?tag=$matches[1]&paged=$matches[2]"
        ["type/([^/]+)/seite/?([0-9]{1,})/?$"] =>
        string(51) "index.php?post_format=$matches[1]&paged=$matches[2]"
        ["schnipsel/sprache/([^/]+)/seite/?([0-9]{1,})/?$"] =>
        string(47) "index.php?sprache=$matches[1]&paged=$matches[2]"
        ["schnipsel/wp-version/([^/]+)/seite/?([0-9]{1,})/?$"] =>
        string(50) "index.php?wp-version=$matches[1]&paged=$matches[2]"
        ["schnipsel/schwierigkeitsgrad/([^/]+)/seite/?([0-9]{1,})/?$"] =>
        string(58) "index.php?schwierigkeitsgrad=$matches[1]&paged=$matches[2]"
        ["schnipsel/([^/]+)/seite/?([0-9]{1,})/?$"] =>
        string(49) "index.php?schnipsel=$matches[1]&paged=$matches[2]"
        ["seite/?([0-9]{1,})/?$"] =>
        string(28) "index.php?&paged=$matches[1]"
        ["comments/seite/?([0-9]{1,})/?$"] =>
        string(28) "index.php?&paged=$matches[1]"
        ["search/(.+)/seite/?([0-9]{1,})/?$"] =>
        string(41) "index.php?s=$matches[1]&paged=$matches[2]"
        ["author/([^/]+)/seite/?([0-9]{1,})/?$"] =>
        string(51) "index.php?author_name=$matches[1]&paged=$matches[2]"
        ["date/([0-9]{4})/([0-9]{1,2})/([0-9]{1,2})/seite/?([0-9]{1,})/?$"] =>
        string(81) "index.php?year=$matches[1]&monthnum=$matches[2]&day=$matches[3]&paged=$matches[4]"
        ["date/([0-9]{4})/([0-9]{1,2})/seite/?([0-9]{1,})/?$"] =>
        string(65) "index.php?year=$matches[1]&monthnum=$matches[2]&paged=$matches[3]"
        ["date/([0-9]{4})/seite/?([0-9]{1,})/?$"] =>
        string(44) "index.php?year=$matches[1]&paged=$matches[2]"
        ["([0-9]+)/([^/]+)/seite/?([0-9]{1,})/?$"] =>
        string(58) "index.php?p=$matches[1]&name=$matches[2]&paged=$matches[3]"
        ["([0-9]+)/seite/?([0-9]{1,})/?$"] =>
        string(41) "index.php?p=$matches[1]&paged=$matches[2]"
        ["(.+?)/seite/?([0-9]{1,})/?$"] =>
        string(48) "index.php?pagename=$matches[1]&paged=$matches[2]"
      }
      
  3. 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

  4. 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?

Leave a Reply