WordPress add_rewrite_rule funktioniert lokal, aber nicht auf dem Server
Lesezeit: 10 Minuten
Chris Ferdinandi
Ich bin in der Lage zu bekommen add_rewrite_rule um lokal mit MAMP zu arbeiten, aber nicht auf meinem DreamHost-Produktionsserver.
Ich versuche, die URLs für einzelne Haustiere unter zu verschönern http://www.pawsnewengland.com/our-dogs-list/. Die hässlichen URLs folgen dieser Struktur: our-dogs-list/?view=pet-details&id=12345 und verwenden eine benutzerdefinierte Funktion $_GET Variablen, die in den Informationen verarbeitet werden sollen.
In meinem functions.php Datei, ich habe diese eingefügt:
Ich lösche Rewrite-Regeln vor dem Testen und habe bestätigt, dass die Rewrite-Regeln zu hinzugefügt wurden .htaccess Datei. Aus irgendeinem Grund sehe ich jedoch entweder eine 404-Seite oder einen weißen Bildschirm und „Keine Eingabedatei angegeben“.
Ich kann das lokal zum Laufen bringen, also habe ich keine Ahnung, was auf einem Live-Server kaputt geht. Irgendwelche Erkenntnisse?
Aktualisierung 1
Ich habe das Rewrite in dem Sinne “funktionieren” lassen, dass es keine Fehler mehr verursacht. Leider führt dies jetzt zu einer unerwünschten Weiterleitung zur Stamm-URL.
Damit kann ich auf die zugreifen view und id Variablen verwenden get_query_var(). Allerdings statt Ehrung example.com/our-dogs-list/pet-details/12345leitet WordPress die Seite weiter example.com/our-dogs-list/.
Irgendeine Idee, was das verursachen könnte? Es macht die Rewrite-Regel effektiv nutzlos.
Sie sollten Debug auf Ihrem Produktionsserver aktivieren, um zu sehen, was vor sich geht.
– Stefan
8. Dezember 2013 um 23:41 Uhr
Hi Alex, läuft das nicht Gefahr, den vielen Leuten, die diese Seite jeden Tag besuchen, seltsame PHP-Fehlercodes anzuzeigen?
– Chris Ferdinandi
9. Dezember 2013 um 0:25 Uhr
@chris-fernandini Sie können das Theme Test Drive-Plugin verwenden: wordpress.org/plugins/theme-test-drive. Damit können Sie Ihren Benutzern erlauben, ein Thema auf Ihrer Live-Site zu verwenden, während Sie ein anderes exklusiv verwenden.
– Stefan
9. Dezember 2013 um 18:36 Uhr
in Ihrem Code (Update 1) verwenden Sie index.php/?page_id=1663&view=pet-details&id=$1 Ich denke, Sie sollten dies ohne den Schrägstrich schreiben index.php?page_id=1663&view=pet-details&id=$1
– Bass Jobsen
12. Dezember 2013 um 23:57 Uhr
@BassJobsen – Habe das gerade ausprobiert. Sehe immer noch das gleiche Verhalten. Trotzdem danke.
– Chris Ferdinandi
13. Dezember 2013 um 13:49 Uhr
soderlind
Dies war zu lang, um es als Kommentar hinzuzufügen.
Ich würde dies zu functions.php hinzufügen. Ich habe Ihren Permalink ein wenig geändert, mein Demo-Plugin erklärt, was jede Funktion macht:
add_filter('generate_rewrite_rules', 'pet_rewrite_url');
add_filter('query_vars', 'pet_query_vars'));
add_filter('admin_init', 'pet_flush_rewrite_rules');
add_action("parse_request", "pet_parse_request");
function pet_rewrite_url( $wp_rewrite ) {
$new_rules = array(
'our-dogs-list/pet-details/([0-9]+)/?$' => sprintf("index.php?pet-details=%s",$wp_rewrite->preg_index(1))
);
$wp_rewrite->rules = $new_rules + $wp_rewrite->rules;
return $wp_rewrite->rules;
}
function pet_query_vars( $query_vars ) {
$query_vars[] = 'pet-details';
return $query_vars;
}
function pet_flush_rewrite_rules() {
$rules = $GLOBALS['wp_rewrite']->wp_rewrite_rules();
if ( ! isset( $rules['our-dogs-list/pet-details/([0-9]+)/?$'] ) ) { // must be the same rule as in pet_rewrite_url($wp_rewrite)
global $wp_rewrite;
$wp_rewrite->flush_rules();
}
}
function pet_parse_request($wp_query) {
if (isset($wp_query->query_vars['pet-details'])) { // same as the first custom variable in pet_query_vars( $query_vars )
// add your code here, code below is for this demo
printf("<pre>%s</pre>",print_r($wp_query->query_vars,true));
exit(0);
}
}
Ich habe eine Anleitung geschrieben, wie man benutzerdefinierte Permalinks hinzufügt, hier ist das Beispiel-Plugin (auch auf meiner Seite erhältlich):
<?php
/*
Plugin Name: My Permalink Demo
Plugin URI: http://soderlind.no/archives/2012/11/01/wordpress-plugins-and-permalinks-how-to-use-pretty-links-in-your-plugin/
Description: Demo plugin to show how to implement your custom permalink for your plugin. To test, add the [mypermalink] or [mypermalink val="ipsum"] shortcode to a page or post.
Version: 1.0.1
Author: Per Soderlind
Author URI: http://soderlind.no/
*/
if (!class_exists('my_permalink')) {
class my_permalink {
function __construct(){
// demo shortcode
add_shortcode('mypermalink', array(&$this,'my_permalink_demo_shortcode'));
// permalink hooks:
add_filter('generate_rewrite_rules', array(&$this,'my_permalink_rewrite_rule'));
add_filter('query_vars', array(&$this,'my_permalink_query_vars'));
add_filter('admin_init', array(&$this, 'my_permalink_flush_rewrite_rules'));
add_action("parse_request", array(&$this,"my_permalink_parse_request"));
}
/**************************************************************************
* Demo shortcode
* A simple shortcode used to demonstrate the plugin.
*
* @see http://codex.wordpress.org/Shortcode_API
* @param array $atts shortcode parameters
* @return string URL to demonstrate custom permalink
**************************************************************************/
function my_permalink_demo_shortcode($atts) {
extract(shortcode_atts(array(
// default values
'val' => 'lorem'
), $atts));
return sprintf('<a href="https://stackoverflow.com/questions/20363725/%s">My permalink</a>',$this->my_permalink_url($val));
}
/**************************************************************************
* Create your URL
* If the blog has a permalink structure, a permalink is returned. Otherwise
* a standard URL with param=val.
*
* @param sting $val Parameter to custom url
* @return string URL
**************************************************************************/
function my_permalink_url($val) {
if ( get_option('permalink_structure')) { // check if the blog has a permalink structure
return sprintf("%s/my-permalink/%s",home_url(),$val);
} else {
return sprintf("%s/index.php?my_permalink_variable_01=%s",home_url(),$val);
}
}
/**************************************************************************
* Add your rewrite rule.
* The rewrite rules array is an associative array with permalink URLs as regular
* expressions (regex) keys, and the corresponding non-permalink-style URLs as values
* For the rule to take effect, For the rule to take effect, flush the rewrite cache,
* either by re-saving permalinks in Settings->Permalinks, or running the
* my_permalink_flush_rewrite_rules() method below.
*
* @see http://codex.wordpress.org/Custom_Queries#Permalinks_for_Custom_Archives
* @param object $wp_rewrite
* @return array New permalink structure
**************************************************************************/
function my_permalink_rewrite_rule( $wp_rewrite ) {
$new_rules = array(
'my-permalink/(.*)$' => sprintf("index.php?my_permalink_variable_01=%s",$wp_rewrite->preg_index(1))
/*
// a more complex permalink:
'my-permalink/([^/]+)/([^.]+).html$' => sprintf("index.php?my_permalink_variable_01=%s&my_permalink_variable_02=%s",$wp_rewrite->preg_index(1),$wp_rewrite->preg_index(2))
*/
);
$wp_rewrite->rules = $new_rules + $wp_rewrite->rules;
return $wp_rewrite->rules;
}
/**************************************************************************
* Add your custom query variables.
* To make sure that our parameter value(s) gets saved,when WordPress parse the URL,
* we have to add our variable(s) to the list of query variables WordPress
* understands (query_vars filter)
*
* @see http://codex.wordpress.org/Custom_Queries
* @param array $query_vars
* @return array $query_vars with custom query variables
**************************************************************************/
function my_permalink_query_vars( $query_vars ) {
$query_vars[] = 'my_permalink_variable_01';
/*
// need more variables?:
$query_vars[] = 'my_permalink_variable_02';
$query_vars[] = 'my_permalink_variable_03';
*/
return $query_vars;
}
/**************************************************************************
* Parses a URL into a query specification
* This is where you should add your code.
*
* @see http://codex.wordpress.org/Query_Overview
* @param array $atts shortcode parameters
* @return string URL to demonstrate custom permalink
**************************************************************************/
function my_permalink_parse_request($wp_query) {
if (isset($wp_query->query_vars['my_permalink_variable_01'])) { // same as the first custom variable in my_permalink_query_vars( $query_vars )
// add your code here, code below is for this demo
printf("<pre>%s</pre>",print_r($wp_query->query_vars,true));
exit(0);
}
}
/**************************************************************************
* Flushes the permalink structure.
* flush_rules is an extremely costly function in terms of performance, and
* should only be run when changing the rule.
*
* @see http://codex.wordpress.org/Rewrite_API/flush_rules
**************************************************************************/
function my_permalink_flush_rewrite_rules() {
$rules = $GLOBALS['wp_rewrite']->wp_rewrite_rules();
if ( ! isset( $rules['my-permalink/(.*)$'] ) ) { // must be the same rule as in my_permalink_rewrite_rule($wp_rewrite)
global $wp_rewrite;
$wp_rewrite->flush_rules();
}
}
} //End Class
} //End if class exists statement
if (class_exists('my_permalink')) {
$my_permalink_var = new my_permalink();
}
?>
Vielen Dank. Wie kann ich dies auf das spezifische Problem anwenden, das ich ansprechen möchte?
– Chris Ferdinandi
10. Dezember 2013 um 21:56 Uhr
Wenn Permalinks deaktiviert sind, funktioniert Folgendes?: index.php/our-dogs-list/?view=pet-details&id=1 vorausgesetzt id=1 ist eine gültige ID
– soderlind
10. Dezember 2013 um 23:02 Uhr
Ich habe zu wenige Punkte oben zu kommentieren. Wenn Sie sich ansehen das Beispiel im Codex Sie werden sehen, dass Sie die Variablen abfragen müssen, sonst versteht WordPerfect den neuen Permalink, den Sie hinzugefügt haben, nicht … und Sie müssen die richtigen Filter und Aktionen verwenden, nicht init
– soderlind
11. Dezember 2013 um 0:40 Uhr
Wie oben erwähnt, verwende ich get_query_varswas der richtige Weg ist, um zu bekommen $_GET Variablen. Ich habe getestet und das Teil funktioniert einwandfrei. Beide der Kodex und das Tutorial von TutsPlus geben an, dass Rewrite-Regeln bei init oder früher aufgerufen werden sollen. Dein Weg funktioniert auch, aber meiner ist nicht falsch. Ihr Code hat auch die Umleitung verursacht, die nicht passieren sollte.
– Chris Ferdinandi
11. Dezember 2013 um 13:07 Uhr
Ihre Ersetzungen sehen falsch aus, versuchen Sie Folgendes:
Hallo Dean, danke, aber ich möchte tatsächlich /our-dogs-list/ in der endgültigen URL. Während ich dies schreibe, frage ich mich jedoch, ob ich stattdessen die Seiten-ID verwenden sollte? Also zum Beispiel: index.php?p=123&view=pet-details&id=$1?
– Chris Ferdinandi
9. Dezember 2013 um 0:24 Uhr
Die Antwort wurde so bearbeitet, dass sie eine Alternative enthält
– Dekan Taylor
9. Dezember 2013 um 0:26 Uhr
Denken Sie daran, dass Sie es leichter haben werden, wenn Sie die hässlichen URLs zuerst zum Laufen bringen.
– Dekan Taylor
9. Dezember 2013 um 0:27 Uhr
Danke, ich werde das mal ausprobieren und berichten. Was mich wahnsinnig macht, ist, dass ich das lokal zum Laufen bringen kann. Schätzen Sie Ihre Hilfe hier!
– Chris Ferdinandi
9. Dezember 2013 um 1:53 Uhr
Bass Jobsen
in deiner .htaccess bearbeiten
RewriteRule ^our-dogs-list/pet-details/([0-9]+)?$ /index.php?page_id=1663&view=pet-details&id=$1 [L] füge dies hinzu RewriteRule ^index\.php$ - [L] also würden Sie .hatcces so etwas wie:
WICHTIG: Standardmäßig erkennt WordPress keine benutzerdefinierten Querystring-Variablen, die für Umschreibungen verwendet werden. Sie müssen Ihre Querystring-Variablen bei WordPress registrieren. Verwenden Sie einfach add_rewrite_tag(), um dies zu tun, oder das obige Umschreiben wird nicht funktionieren! Weitere Informationen zum Erfassen von Abfragezeichenfolgen-Variablenwerten nach einem Neuschreiben finden Sie hier.
Soweit ich verstehe, sollten Sie verwenden: add_rewrite_tag() für view und id in deinem ersten Beispiel.
13826900cookie-checkWordPress add_rewrite_rule funktioniert lokal, aber nicht auf dem Serveryes
Sie sollten Debug auf Ihrem Produktionsserver aktivieren, um zu sehen, was vor sich geht.
– Stefan
8. Dezember 2013 um 23:41 Uhr
Hi Alex, läuft das nicht Gefahr, den vielen Leuten, die diese Seite jeden Tag besuchen, seltsame PHP-Fehlercodes anzuzeigen?
– Chris Ferdinandi
9. Dezember 2013 um 0:25 Uhr
@chris-fernandini Sie können das Theme Test Drive-Plugin verwenden: wordpress.org/plugins/theme-test-drive. Damit können Sie Ihren Benutzern erlauben, ein Thema auf Ihrer Live-Site zu verwenden, während Sie ein anderes exklusiv verwenden.
– Stefan
9. Dezember 2013 um 18:36 Uhr
in Ihrem Code (Update 1) verwenden Sie
index.php/?page_id=1663&view=pet-details&id=$1
Ich denke, Sie sollten dies ohne den Schrägstrich schreibenindex.php?page_id=1663&view=pet-details&id=$1
– Bass Jobsen
12. Dezember 2013 um 23:57 Uhr
@BassJobsen – Habe das gerade ausprobiert. Sehe immer noch das gleiche Verhalten. Trotzdem danke.
– Chris Ferdinandi
13. Dezember 2013 um 13:49 Uhr