webentwicklung-frage-antwort-db.com.de

Hijacking der URL zum Filtern

Richtig, hier ist der Deal. Ich habe eine Schleife, in der Nachrichtenbeiträge angezeigt werden. Diese Beiträge können bestimmten Kategorien (nicht normalen Kategorien) zugeordnet werden, und ich möchte in der Lage sein, nach ihnen zu filtern.

Wenn ich mich nicht zu sehr für Ästhetik interessieren würde, würde ich einen Link wie diesen verwenden:

domain.com/news?filter=cat1

Aber stattdessen möchte ich Folgendes tun ("umgeschrieben):

domain.com/news/cat1 » domain.com/news/?filter=cat1

Ich habe den .htaccess geändert, um den cat1-Wert als GET-Variable zu übergeben:

RewriteEngine On
RewriteBase /
RewriteRule ^news/(.*)/$ /news/?filter=$1 [L,QSA]

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

# END WordPress

Das Problem ist, dass WordPress den /cat1/ als eine Seite behandelt, obwohl dies nun erfolgreich die filter -Variable übergibt. Es kann ihn offensichtlich nicht finden und wirft daher eine 404.

Gibt es eine Möglichkeit, das Umschreiben dieser bestimmten URL zuzulassen, ohne dass WordPress eine 404 auslöst? Es sieht so aus, als würde die URL in die Adressleiste übernommen und analysiert. Ich möchte wirklich, dass sie die umgeschriebene URL analysiert.

Vielen Dank

3
Ben Everard

WordPress hat auch einen Umschreibemechanismus. Es ist besser, diesen zu verwenden, anstatt ihn in der .htaccess-Datei zu machen.

Sie können eigene Umschreiberegeln hinzufügen. In Ihrem Fall möchten wir den cat1-Teil in einer separaten Abfragevariablen speichern, daher müssen wir auch WordPress mitteilen, dass diese Abfragevariable zugelassen werden soll (für die Sicherheit wird eine Whitelist verwendet).

Die genaue Form der Umschreiberegel hängt davon ab, was http://domain.com/news/ ist: Handelt es sich um eine Seite mit einer benutzerdefinierten Vorlage oder um etwas anderes? Sie sollten dies herausfinden (z. B. mit meinem Rewrite Analyzer-Plugin ) und dies zur Rewrite-Regel hinzufügen.

add_action( 'init', 'wpse16819_init' );
function wpse16819_init()
{
    // Base form, will probably not work because it does nothing with the `news` part
    add_rewrite_rule( 'news/([^/]+)/?$', 'index.php?wpse16819_filter=$matches[1]', 'top' );
    // Use this instead if `news` is a page
    add_rewrite_rule( 'news/([^/]+)/?$', 'index.php?wpse16819_filter=$matches[1]&pagename=news', 'top' );
}

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

Denken Sie daran, flush die Umschreiberegeln (speichern Sie sie in der Datenbank), nachdem Sie diesen Code hinzugefügt haben. Sie können dies tun, indem Sie die Seite Permalinks im Admin-Bereich besuchen.

Sie können jetzt mit get_query_var( 'wpse16819_filter' ); auf die Variable wpse16819_filter zugreifen.

2
Jan Fabry