web-dev-qa-db-ger.com

Was ist falsch an meiner Umschreiberegel für eine Seiten-URL mit Abfrageparametern und Funktionscodes?

Ich bin neu in der WP Programmierung und habe Probleme mit einem einfachen Problem in anderen Umgebungen.

Ich habe eine Seite (cdl-manual) mit der normalen WP Admin-Benutzeroberfläche erstellt. Dann habe ich einige Funktionen zur Datei theme functions.php hinzugefügt, damit ich Shortcodes für den Seiteninhalt verwenden kann. Die Funktionen suchen nach einem Abfrageparameter (jp_stn) in der URL und verwenden diese Informationen, um den Inhalt aus einer Datenbanktabelle auszuwählen. In diesem Fall ist der Parameterwert der Name eines US-Bundesstaates. Der bereitgestellte Inhalt ist eine Seite, die auf diesen Status ausgerichtet ist.

All das funktioniert jetzt auf meiner Entwickler-Website.

http://blog.jobspetroleum.net/cdl-training/ listet für jeden Staat einen Link zum CDL-Handbuch auf. Diese Links haben die folgende Form, wie oben beschrieben.

http://blog.jobspetroleum.net/cdl-manual/?jp_stn=arizona

Jetzt möchte ich diese zustandsspezifische Abfrageparameter-URL in eine benutzerfreundliche URL konvertieren. Das ist das neue Muster.

http://blog.jobspetroleum.net/cdl-manual/arizona/

Die naheliegende Lösung bestand für mich darin, eine Umschreiberegel hinzuzufügen. Nach langem Fummeln habe ich ein Plugin gefunden, mit dem ich eine benutzerdefinierte Umschreiberegel direkt zur .htaccess-Datei hinzufügen kann. Das Plugin heißt "WP htaccess Control" und funktioniert ganz gut. Meine Umschreiberegeln funktionieren jedoch nicht so, wie sie sollten. Hier ist die resultierende .htaccess-Datei, nachdem meine Umschreiberegel hinzugefügt wurde.

# BEGIN WordPress

# WPhtc: Begin Custom htaccess
RewriteRule ^cdl-manual/([-a-z]+)/$ /cdl-manual/?jp_stn=$1 [L]
# WPhtc: End Custom htaccess

<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

Die neue Regel befindet sich im Abschnitt Benutzerdefinierter Zugriff. Dieser erzeugt einen 404-Fehler, wenn ich ihn mit/cdl-manual/arizona/teste. Zum Debuggen habe ich versucht, die Flags von [L] auf [R, L] zu ändern.

Dies führte zu einer Weiterleitung zu http://blog.jobspetroleum.net/cdl-manual/?jp_stn=arizona . Die Seite hat den Inhalt korrekt geladen, aber die URL wurde nicht neu geschrieben. Ich komme zu dem Schluss, dass die Regel korrekt übereinstimmt. Aber ohne das R-Flag funktioniert das Umschreiben vermutlich nicht richtig. Die Regel ist laut http://htaccess.madewithlove.be/ korrekt und die umgeschriebene URL ist genau das, was ich will.

Weiß jemand was hier falsch ist? Ist mein Ansatz völlig falsch? Was ist ein besserer Weg, um dies zu beheben? Vielen Dank.

Edit 10/1/2014 - Wenn es jemandem hilft, enthält die Seite "CDL Manual" nur den Inhalt "[bigleaf_jobspet_cdlmanualbystate]". Diese Funktion und andere Abhängigkeiten befinden sich in der Datei functions.php in meinem untergeordneten Design. Diese spezielle Funktion sucht in GET nach dem Abfrageparameter jp_stn, liest den Statusnamen und ruft dann detaillierten Inhalt aus Tabellen ab, die ich der Datenbank hinzugefügt habe. Anschließend wird der HTML-Code für den benannten Status zurückgegeben.

Edit 10/2/2014 - In den WP Codex eintauchen Ich habe einen Verweis auf die Seitennamen-Abfragevariable für index.php gefunden. Also habe ich ein paar Variationen ausprobiert und diese Regel gefunden, die fast funktioniert.

RewriteRule ^cdl-manual/([-a-z]+)/$ ?pagename=cdl-manual&jp_stn=$1 [L]

Diese Regel lädt die CDL-Handbuchseite, ignoriert jedoch den Wert des Statusparameters. Seltsamerweise wird, wenn ich das beabsichtigte Umschreibmuster in einen Browser tippe, genau die gewünschte Seite für den angegebenen Status geladen.

http://blog.jobspetroleum.net/?pagename=cdl-manual&jp_stn=arizona

1
Ray N. Franklin

Der Grund, warum Sie eine 404 erhalten, ist, dass die Umschreiberegel die Anforderungs-URL nicht als gemeldete sin $_SERVER[REQUEST_URI]-Variable von PHP ändert, und WordPress diese Variable analysiert, wenn entschieden wird, welcher Inhalt angefordert wird, und da es keine solche Seite/cdl-manual/arizona gibt/es zeigt eine 404 an.

Was Sie brauchen, ist eine WordPress-Umschreiberegel, um die URL so zu analysieren, wie Sie es möchten. Ich schlage jedoch vor, dass Sie einfach 50 Unterseiten für jeden Status erstellen. Es kann ein wenig nervig sein, aber wahrscheinlich so schnell wie das Schreiben und Debuggen von Code, um das zu tun, was Sie wollen, und noch viel mehr, wenn es um die weitere Anpassung pro Status geht.

0
Mark Kaplun

Anstatt .htaccess eine Regel hinzuzufügen, können Sie dies mit einem WordPress-Umschreibevorgang tun:

function cdl_rewrite_rule(){
    add_rewrite_rule(
        'cdl-manual/([-a-z]+)/?$',
        'index.php?pagename=cdl-manual&jp_stn=$matches[1]',
        'top'
    );
}
add_action( 'init', 'cdl_rewrite_rule' );

Dies setzt voraus, dass Sie jp_stn bereits zur Liste der gültigen Abfragevariablen hinzugefügt haben:

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

Flush-Überschreibungen, damit die Regel wirksam wird. Besuchen Sie hierzu die Seite mit den Einstellungen für Permalinks.

2
Milo