Website-Icon The Magical Digital Nomad

Die Kategorie im Permalink deines WordPress-Beitrags anzeigen

WordPress mit eigenen Funktionen erweitern

WordPress mit eigenen Funktionen erweitern

Das ist doch eine einfache Geschichte! WordPress bietet die passenden Mechanismen an, um die Kategorie der Beiträge in der URL zu zeigen. Dazu muss man nur die Permalinks anpassen. Aber ich will ein wenig mehr und die Kategorie nicht bei jedem Post sehen, sondern nur bei einigen speziellen. Also doch wieder eine Lösung mit ein wenig Quellcode und PHP und Programmieren. Aber keine Angst, wie so oft, erkläre ich es Schritt für Schritt, damit nichts passiert in deinem Blog.

Alle Permalinks anpassen

Einfach rein in das Dashboard und links auf Einstellung > Permalinks geklickt, schon kannst du die Anpassungen vornehmen.  Aber nur mit einem einfachen Klick ist es nicht getan, denn genau das Gesuchte ist nicht in der Standardliste enthalten. Also auf den letzten Punkt – Benutzerdefiniert – geklickt und dann im Eingabefeld /%category%/%postname%/ eingegeben (oder unterhalb auf die passenden Knöpfe geklickt). Noch auf Änderungen speichern geklickt. Schon sehen wir die Post-Kategorie in der URL.

Ja aber das ist genau, was nicht wollte!

Denn eigentlich will ich die Post-Kategorie nur bei einer einzigen Kategorie in der URL sehen, sonst soll nur der Post-Titel als Permalink verwendet werden. Nehmen wir ein einfaches Beispiel:

Ich schreibe alle meine Posts brav in WordPress, aber ich habe eine Kategorie WordPress und eine Kategorie News. Und genau bei der News-Kategorie will ich das /news/ in den Permalink eingefügt wird.

Also so zum Beispiel:
Grundlagen von WordPress in der Kategorie WordPress wird zu https://the-magical-digital-nomad.com/grundlagen-wordpress/
Neue Version von  Textwrangler verfügbar in der Post-Kategorie News wird zu https://the-magical-digital-nomad.com/news/neue-textwrangler-version/

Das geht aber nicht mit Hausmitteln von WordPress, dazu müssen wir ein klein wenig programmieren.

Die Post-Kategorie in den Permalink einfügen

Zu aller erst musst du dir ein Child-Theme anlegen. Wenn du das nicht machst und das Original-Theme änderst, gehen deine Änderungen beim nächsten Update verloren. Aber dies ist gar nicht schwierig. Wie du dir ein Child-Theme anlegst, habe ich bereits in einem anderen Beitrag Schritt für Schritt beschrieben.

Und jetzt können wir beginnen. Also die Finger aufgewärmt und die Datei functions.php in einem passenden Editor geöffnet. So nebenbei, ich verwende gerne Sublime Text zum Entwickeln. Als erstes müssen wird die Post-Kategorie in den Permalink einfügen. Dazu hängen wir am Ende der functions.php folgenden Code an.

//Den Permalink mit einer Post-Kategorie versehen
function tmdn_change_permalink($permalink, $post) {
  //zu veraendernde Kategorie
  $changeCat = 'magazin';
  //in den Permalink einzufuegender Wert
  $newSlugPart = 'news';
  //die aktuellen Kategorien eines Posts ermitteln
  $cats = wp_get_post_categories($post->ID);
  //alle Kategorien ueberpruefen
  foreach ($cats as $cat) {
    //alle Daten der Kategorie laden
    $theCategory = get_category($cat);
    //nur den slug (permalink) der Kategorie speichern
    $postCats[]  = $theCategory->slug;
  }
  //Pruefen ob die zu aendernde Kategorie im Post vergeben ist
  if (in_array('magazin',$postCats)) {
    //Nur dann den Permalink veraendern
    $permalink = trailingslashit(home_url($newSlugPart.'/'.$post->post_name));
  }
  //den neuen Permalink zurueckgeben
  return $permalink;
}
//Den Filter fuer den neuen Permalink aktivieren
add_filter 'post_link', 'tmdn_change_permalink', 10, 2);

Wichtig ist bei dem Code die Zeile #4, dort schreibst den Namen der Kategorie, welche betroffen sein soll hinein. Und in der 6. Zeile den Teil der in den Permalink als Post-Kategorie eingefügt werden soll.
Damit klappt es aber noch nicht ganz. Denn WordPress ermittelt aus dem Permalink (wir nennen den Teil hinter dem Domänennamen auch Slug) verschiedene Werte für die Anzeige der Seite. Jetzt sind die Parameter aber „falsch“ und wir bekommen einen 404 – Seite nicht gefunden.

Ach, das ist doch gar nicht so schwer zu beheben.

Die Rewrite-Rules für die Post-Kategorie anpassen

Diese Regeln sind normalerweise in der Datei .htaccess gespeichert. Die Regeln verändern die Darstellung der URL im Browser und noch vieles andere mehr. Nur, das ist eine andere Geschichte. Doch einfach gesagt, sind sie für die hübsche Darstellung der URLs zuständig. Wir brauchen aber jetzt den umgekehrten Weg. Wir müssen es schaffen, dass die Post-Kategorie nur angezeigt wird, aber mit den Rewrite-Regeln diese intern wieder entfernt wird.

Da es zu unangenehm (und für Laien auch zu gefährlich) ist in der .htaccess-Datei herum zu schreiben, fügen wir den folgenden Code am Ende der functions.php ein. Damit kannst du ihn schnell wieder löschen, falls etwas schief geht. Denn eine falsch .htaccess-Datei legt mal deinen ganzen WebSpace und Blog lahm.

//die Post-Kategorie aus dem Slug filtern
function tmdn_filter_slug($rules) {
  //zu entfernende Post-Kategorie
  $newSlugPart = 'news';
  //die neuen Regeln definieren
  $newRules = array($newSlugPart.'/([^/]+)/trackback/?

Auch hier gibt es eine wichtige Zeile, es ist nochmals die Nummer 4. Hier steht der Teil der aus dem Permalink entfernt werden soll. Der muss genau gleich wie im vorherigen Code-Abschnitt in der Zeile 6 lauten.

Die neuen Permalinks aktivieren

Das meiste hast du jetzt auch schon geschafft. Aber zwei Kleinigkeiten sind noch zu erledigen. Als erstes musst du die Datei functions.php auf deinen Webserver in das Child-Theme übertragen. Und damit alles gut funktioniert, musst du nochmals in Einstellung > Permalinks gehen. Dort aktivierst du den letzten Punkt – Benutzerdefiniert. Gib im Eingabefeld dahinter /%postname%/ ein. Noch auf Änderungen speichern klicken, damit die Struktur von allen Permalinks durch WordPress neu erstellt wird. Und jetzt hast du die Post-Kategorie in der URL.

=> 'index.php?name=$matches[1]&tb=1', $newSlugPart.'/([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?

Auch hier gibt es eine wichtige Zeile, es ist nochmals die Nummer 4. Hier steht der Teil der aus dem Permalink entfernt werden soll. Der muss genau gleich wie im vorherigen Code-Abschnitt in der Zeile 6 lauten.

Die neuen Permalinks aktivieren

Das meiste hast du jetzt auch schon geschafft. Aber zwei Kleinigkeiten sind noch zu erledigen. Als erstes musst du die Datei functions.php auf deinen Webserver in das Child-Theme übertragen. Und damit alles gut funktioniert, musst du nochmals in Einstellung > Permalinks gehen. Dort aktivierst du den letzten Punkt – Benutzerdefiniert. Gib im Eingabefeld dahinter /%postname%/ ein. Noch auf Änderungen speichern klicken, damit die Struktur von allen Permalinks durch WordPress neu erstellt wird. Und jetzt hast du die Post-Kategorie in der URL.

=> 'index.php?name=$matches[1]&feed=$matches[2]', $newSlugPart.'/([^/]+)/(feed|rdf|rss|rss2|atom)/?

Auch hier gibt es eine wichtige Zeile, es ist nochmals die Nummer 4. Hier steht der Teil der aus dem Permalink entfernt werden soll. Der muss genau gleich wie im vorherigen Code-Abschnitt in der Zeile 6 lauten.

Die neuen Permalinks aktivieren

Das meiste hast du jetzt auch schon geschafft. Aber zwei Kleinigkeiten sind noch zu erledigen. Als erstes musst du die Datei functions.php auf deinen Webserver in das Child-Theme übertragen. Und damit alles gut funktioniert, musst du nochmals in Einstellung > Permalinks gehen. Dort aktivierst du den letzten Punkt – Benutzerdefiniert. Gib im Eingabefeld dahinter /%postname%/ ein. Noch auf Änderungen speichern klicken, damit die Struktur von allen Permalinks durch WordPress neu erstellt wird. Und jetzt hast du die Post-Kategorie in der URL.

=> 'index.php?name=$matches[1]&feed=$matches[2]',$newSlugPart.'/([^/]+)/comment-page-([0-9]{1,})/?

Auch hier gibt es eine wichtige Zeile, es ist nochmals die Nummer 4. Hier steht der Teil der aus dem Permalink entfernt werden soll. Der muss genau gleich wie im vorherigen Code-Abschnitt in der Zeile 6 lauten.

Die neuen Permalinks aktivieren

Das meiste hast du jetzt auch schon geschafft. Aber zwei Kleinigkeiten sind noch zu erledigen. Als erstes musst du die Datei functions.php auf deinen Webserver in das Child-Theme übertragen. Und damit alles gut funktioniert, musst du nochmals in Einstellung > Permalinks gehen. Dort aktivierst du den letzten Punkt – Benutzerdefiniert. Gib im Eingabefeld dahinter /%postname%/ ein. Noch auf Änderungen speichern klicken, damit die Struktur von allen Permalinks durch WordPress neu erstellt wird. Und jetzt hast du die Post-Kategorie in der URL.

=> 'index.php?name=$matches[1]&cpage=$matches[2]', $newSlugPart.'/([^/]+)(/[0-9]+)?/?

Auch hier gibt es eine wichtige Zeile, es ist nochmals die Nummer 4. Hier steht der Teil der aus dem Permalink entfernt werden soll. Der muss genau gleich wie im vorherigen Code-Abschnitt in der Zeile 6 lauten.

Die neuen Permalinks aktivieren

Das meiste hast du jetzt auch schon geschafft. Aber zwei Kleinigkeiten sind noch zu erledigen. Als erstes musst du die Datei functions.php auf deinen Webserver in das Child-Theme übertragen. Und damit alles gut funktioniert, musst du nochmals in Einstellung > Permalinks gehen. Dort aktivierst du den letzten Punkt – Benutzerdefiniert. Gib im Eingabefeld dahinter /%postname%/ ein. Noch auf Änderungen speichern klicken, damit die Struktur von allen Permalinks durch WordPress neu erstellt wird. Und jetzt hast du die Post-Kategorie in der URL.

=> 'index.php?name=$matches[1]&page=$matches[2]'); //neue Regeln zu den bestehenden hinzufuegen
$rules = $newRules + $rules;                       //die kompletten Satz an Regeln wieder zurueckgeben
return $rules; }                                   //den Filter fuer die Rewrite-Regeln aktivieren 
add_filter('rewrite_rules_array', 'tmdn_filter_slug');

Auch hier gibt es eine wichtige Zeile, es ist nochmals die Nummer 4. Hier steht der Teil der aus dem Permalink entfernt werden soll. Der muss genau gleich wie im vorherigen Code-Abschnitt in der Zeile 6 lauten.

Die neuen Permalinks aktivieren

Das meiste hast du jetzt auch schon geschafft. Aber zwei Kleinigkeiten sind noch zu erledigen. Als erstes musst du die Datei functions.php auf deinen Webserver in das Child-Theme übertragen. Und damit alles gut funktioniert, musst du nochmals in Einstellung > Permalinks gehen. Dort aktivierst du den letzten Punkt – Benutzerdefiniert. Gib im Eingabefeld dahinter /%postname%/ ein. Noch auf Änderungen speichern klicken, damit die Struktur von allen Permalinks durch WordPress neu erstellt wird. Und jetzt hast du die Post-Kategorie in der URL.

Die mobile Version verlassen