it-swarm.com.de

Verwirrung darüber, wie eine URL analysiert wird

Ich habe einen Permalink, der zu benutzerdefinierten Inhalten führt, wie:

http://mysite.com/extra-deal/91103/

Damit gelangen Sie zu einer Seite, die von der Datei bearbeitet wird:

category-extra-deals.php

Auf dieser Seite greife ich nach dem letzten Teil der URL (91103 im obigen Beispiel) und verwende diesen, um eine benutzerdefinierte Datenbankanforderung für die benötigten Informationen durchzuführen.

Ich möchte mit der ID-Nummer (91103) aufhören und den Titel verwenden.

Ändern Sie dies jedoch in:

http://mysite.com/extra-deal/title-of-that-entry/

Ergibt einen 404 und die Vorlage category-extra-deals.php wird nie berührt.

Ich dachte, dass die Vorlage zumindest getroffen würde, selbst wenn dieser Titel nicht gefunden werden kann, aber dies ist nicht der Fall.

Ein weiteres Beispiel ... wenn ich besuche:

http://mysite.com/extra-deal/9/

Ich erhalte die Vorlage category-extra-deals.php, jedoch ohne Inhalt, da 9 nicht vorhanden ist.

Jedoch mit:

http://mysite.com/extra-deal/a/

Ich werde die 404-Seite bekommen.

Warum erhalte ich die gewünschte Vorlage, wenn die URL eine Nummer und eine 404 hat, wenn derselbe Teil der URL Text enthält?


Lösung

Ich musste meine eigenen Umschreiberegeln hinzufügen, um die neue URL-Struktur zu berücksichtigen.

Also die folgende URL:

http://mysite.com/extra-deal/the-title-of-the-posting

Würde nach folgender Regel gehandhabt:

function add_rewrite_rules($aRules) {
$aNewRules = array('extra-deal/([^/]+)/?$' => 'index.php?pagename=extra-deal&extradeal_title=$matches[1]');
$aRules = $aNewRules + $aRules;
return $aRules;
}

add_filter('rewrite_rules_array', 'add_rewrite_rules');

Eine andere Sache, wenn Sie bemerken, erwartet die URL einen Parameter namens "extra deal_title". Das muss auch hinzugefügt werden und es geschieht mit:

function add_query_vars($aVars) {
$aVars[] = "extradeal_title";
return $aVars;
}
1
gaoshan88

WordPress verwendet reguläre Ausdrücke zum Parsen von URLs (sogenannte Rewrite-Regeln). Es stimmt mit ihnen in einer bestimmten Reihenfolge überein und stoppt, wenn die erste übereinstimmende Regel gefunden wird.

Es ist ein bisschen schwer zu sagen, welche Regel in Ihrem Fall passt. Wir wissen nicht, wie Ihre Permalink-Einstellungen lauten und welche anderen Änderungen an den Umschreiberegeln vorgenommen werden.

Um alle diese Regeln anzuzeigen, fügen Sie einfach diese Funktion hinzu und rufen Sie sie dann auf (footer.php ist ein guter Ort, um sie aufzurufen).

function my_debug_rewrite_rules() {
    global $wp_rewrite;
    echo '<div>';
    if ( !empty( $wp_rewrite->rules ) ) {
        echo '<table><thead><tr><th>Rule</th><th>Rewrite</th></tr></thead><tbody>';
        foreach ( $wp_rewrite->rules as $name=>$value ) {
            echo '<tr><td>'. esc_html($name) .'</td><td>'. esc_html($value) .'</td></tr>';
        }
        echo '</tbody></table>';
    }
    echo '</div>';
}

Sie können auch überprüfen, welche dieser Regeln übereinstimmen:

function debug_page_request() {
    global $wp, $template;
    echo '<p>Request: '. esc_html($wp->request) .'</p>';
    echo '<p>Matched Rewrite Rules: '. esc_html($wp->matched_rule) .'</p>';
    echo '<p>Loaded Template: '. esc_html(basename($template)) .'</p>';
}

(Rufen Sie es erneut in footer.php auf).

3