WordPress add_rewrite_rule funktioniert lokal, aber nicht auf dem Server

Lesezeit: 10 Minuten

Benutzer-Avatar
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:

function rewrite_pet_url() {
    add_rewrite_rule(
        "our-dogs-list/pet-details/([0-9]+)/?$",
        "index.php/our-dogs-list/?view=pet-details&id=$1",
        "top"
    );
}
add_action( 'init', 'rewrite_pet_url');

Ich habe dies auch versucht mit den gleichen Ergebnissen:

function rewrite_pet_url() {
    add_rewrite_rule(
        "our-dogs-list/pet-details/([0-9]+)/?$",
        "index.php/our-dogs-list/?view=pet-details&id=$matches[1]",
        "top"
    );
}
add_action( 'init', 'rewrite_pet_url');

Und um einfach zu testen, ob Umschreibungen überhaupt funktionieren würden, haben Sie Folgendes versucht:

function rewrite_pet_url() {
    add_rewrite_rule(
        "fake",
        "index.php/about",
        "top"
    );
}
add_action( 'init', 'rewrite_pet_url');

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.

function rewrite_pet_url() {
    add_rewrite_tag('%view%','([^&]+)');
    add_rewrite_tag('%id%','([^&]+)');
    add_rewrite_rule(
        'our-dogs-list/pet-details/([0-9]+)?$',
        'index.php/?page_id=1663&view=pet-details&id=$1',
        'top'
    );
}
add_action( 'init', 'rewrite_pet_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

Benutzer-Avatar
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:

function rewrite_pet_url() {
    add_rewrite_rule(
        "our-dogs-list/pet-details/([0-9]+)/?$",
        "index.php?view=pet-details&id=$1",
        "top"
    );
}
add_action( 'init', 'rewrite_pet_url');

Beachten Sie die Verwendung von index.php und nicht index.php/our-dogs-list/ als Ziel.

Oder vielleicht ist es so:

function rewrite_pet_url() {
    add_rewrite_rule(
        "our-dogs-list/pet-details/([0-9]+)/?$",
        "our-dogs-list/index.php?view=pet-details&id=$1",
        "top"
    );
}
add_action( 'init', 'rewrite_pet_url');

  • 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

Benutzer-Avatar
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:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /wordpress/
RewriteRule ^our-dogs-list/pet-details/([0-9]+)?$ /wordpress/index.php?page_id=2&view=pet-details&id=$1 [L]
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /wordpress/index.php [L]
</IfModule>

aktualisieren

aus: http://codex.wordpress.org/Rewrite_API/add_rewrite_rule

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.

1382690cookie-checkWordPress add_rewrite_rule funktioniert lokal, aber nicht auf dem Server

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy