Zur Navigation

.htaccess & Wordpress

1 AndiN

Ich möchte - wenn ich den Link "www.domain.de/galerie/jahr_akt/YYYY" aufrufe, intern auf "www.domain.de/galerie?jahr_akt=YYYY" umgeleitet wird, damit das ganze etwas SEO-freundlicher wird. Über die Variable $jahr_akt wird dann auf der Zielseite ein Script aufgerufen, welches ich über das WP-Plugin "XYZ PHP Code" eingebunden habe. Die Variante mit "?jahr_akt=YYYY" funktioniert auch absolut fehlerfrei.

Dafür habe ich folgende RewriteRule erstellt:
RewriteRule ^\/galerie\/jahr_akt\/([0-9]+)\/?$ /galerie/?jahr_akt=$1 [L]

Meine .htacess sieht somit wie folgt aus:

# BEGIN WordPress
# Die Anweisungen (Zeilen) zwischen „BEGIN WordPress“ und „END WordPress“ sind
# dynamisch generiert und sollten nur über WordPress-Filter geändert werden.
# Alle Änderungen an den Anweisungen zwischen diesen Markierungen werden überschrieben.
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^\/galerie\/jahr\/([0-9]+)\/?$ /galerie/?jahr_akt=$1 [L]
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress

Leider scheint die RewriteRule ignoriert zu werden.
Ich habe sie testhalber durch "RewriteRule ^\/galerie\/jahr\/([0-9]+)\/?$ www.google.de [L]" ersetzt. Ebenfalls keine Reaktion. Es wird immer auf die 404-Seite weitergeleitet.

Ebenfalls habe ich auch schon versucht die Zeile an den Anfang der .htaccess zu setzen (und natürlich "RewriteEngine On" davor). Leider das selbe Ergebnis. Es wird immer auf die 404-Seite weitergeleitet.

Cache habe ich auch bei jeder Änderung gelöscht.
Welchen Denkfehler habe ich?

28.04.2023 13:06

2 Jörg Kruse

Die Slashes werden in mod_rewrite nicht mit einem Backslash maskiert. Zudem beginnt der Request URI in der .htaccess Datei nicht mit einem Slash:

RewriteRule ^galerie/jahr_akt/([0-9]{4})/?$ galerie?jahr_akt=$1 [L]

Da YYYY wohl immer vierstellig ist, würde ich [0-9]{4} statt [0-9]+ verwenden.

28.04.2023 14:29

3 AndiN

Okay, jetzt hat sich etwas verändert.
Die RewriteRule führt nun nicht mehr auf die 404-Seite von Wordpress, sondern auf die 404-Seite vom Webserver.

28.04.2023 15:35

4 Jörg Kruse

Über die Variable $jahr_akt wird dann auf der Zielseite ein Script aufgerufen, welches ich über das WP-Plugin "XYZ PHP Code" eingebunden habe.

D.h. bei https://example.com/galerie?jahr_akt=YYYY handelt es sich um eine von WordPress verwaltete URL? dann wird eine interne Umleitung über die .htaccess Datei nicht funktionieren, da einerseits der Server die Datei /galerie nicht kennt und anderseits WordPress den originalen Request URI auswertet und nach eigenen Regeln in PHP rewritet. /galerie/jahr_akt/2023 kann WordPress damit nicht rewriten, deswegen der Fehler 404. Man kann diese Regeln aber im Theme oder einem Plugin mit der Funktion add_rewrite_rule() durch eigene Regeln ergänzen:

https://jkip.de/howtos/url-rewrite-in-wordpress

28.04.2023 16:09 | geändert: 28.04.2023 16:16

5 AndiN

Wenn ich das richtig verstanden habe, müsste in die functions.php dann doch eigentlich das hier rein, oder?

add_action('init', function(){
    add_rewrite_rule('^galerie/jahr/([0-9]{4})/', 'galerie?jahr_akt=$matches[1]','top');
});

Irgendwas scheint da aber noch nicht ganz korrekt zu sein.

28.04.2023 17:19 | geändert: 28.04.2023 17:21

6 Jörg Kruse

Die URL https://example.com/galerie rewritet WordPress intern auf index.php?pagename=galerie. Du fügst eine Regel hinzu, die zusätzlich den Parameter jahr_akt berücksichtigt:

add_action('init', function() {
    add_rewrite_rule(
        '^galerie/jahr/([0-9]{4})/?',
        'index.php?pagename=galerie&jahr_akt=$matches[1]',
        'top'
    );
});

... und anschließend im Dashboard die Perma-Links neu abspeichern

Edit:

Der neue Parameter jahr_akt muss zudem registriert werden:

add_filter('query_vars', function($query_vars) {
    $query_vars[] = 'jahr_akt';
    return $query_vars;
});

28.04.2023 18:25 | geändert: 28.04.2023 18:27

7 AndiN

Okay, jetzt sind wir schonmal einen Schritt weiter.
Ich habe den Parameter "jahr_akt" in der functions.php registiert, darunter die neue Regel eingefügt, die Permalinks aktualisiert und den Cache gelöscht.

Nun wird die Seite korrekt geladen, jedoch ohne die Einträge für das entsprechende Jahr. Ich habe per echo festgestellt, dass die Variable $jahr_akt leer ist.

30.04.2023 14:00

8 Jörg Kruse

Über die Variable $jahr_akt wird dann auf der Zielseite ein Script aufgerufen, welches ich über das WP-Plugin "XYZ PHP Code" eingebunden habe.

$jahr_akt müsste aus $_GET['jahr_akt'] übernommen worden sein?

Stattdessen müsstest du jetzt so darauf zugreifen können:

global $wp_query;
$jahr_akt = $wp_query->query_vars['jahr_akt'] ?? '';

30.04.2023 15:57 | geändert: 30.04.2023 15:59

9 AndiN

Das war die abschließende Lösung! Danke!

30.04.2023 17:36

Beitrag schreiben (als Gast)

Die Antwort wird nach der Überprüfung durch einen Moderator freigeschaltet.





[BBCode-Hilfe]