web-dev-qa-db-fra.com

Confusion sur la façon dont une URL est analysée

J'ai un lien permanent qui mène à un contenu personnalisé tel que:

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

Cela vous mènera à une page gérée par le fichier:

category-extra-deals.php

Sur cette page, je récupère la dernière partie de l'URL (91103 dans l'exemple ci-dessus) et l'utilise pour faire une demande de base de données personnalisée pour les informations dont j'ai besoin.

Je veux quitter en utilisant le numéro d'identification (91103) et commencer à utiliser le titre.

Cependant changer cela pour:

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

Résultats dans un 404 et le modèle category-extra-deals.php n'est jamais touché.

J'ai pensé que le modèle serait touché, au moins, même si ce titre est introuvable, mais ce n'est pas le cas.

Un autre exemple ... si je visite:

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

Je vais obtenir le modèle category-extra-deals.php mais sans contenu car le 9 n'existe pas.

Cependant en utilisant:

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

Je vais avoir la page 404.

Pourquoi est-ce que je reçois le modèle souhaité lorsque l'URL a un numéro et un 404 lorsque cette même partie de l'URL contient du texte?


Solution

J'avais besoin d'ajouter mes propres règles de réécriture pour s'adapter à la nouvelle structure d'URL.

Donc l'URL suivante:

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

Serait traité par la règle suivante:

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');

Une autre chose, si vous remarquez, l’URL attend un paramètre nommé "extra deal_title". Cela doit être ajouté aussi et cela se fait avec:

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

WordPress utilise un ensemble d'expressions régulières pour analyser les URL (appelées règles de réécriture). Elle leur correspond dans un ordre quelconque et s'arrête lorsque la première règle correspondante est trouvée.

Il est un peu difficile de dire quelle règle correspond à votre cas. Nous ne savons pas quels sont vos paramètres de permalien et quelles autres modifications sont apportées aux règles de réécriture.

Pour voir toutes ces règles, ajoutez simplement cette fonction puis appelez-la (footer.php est un bon endroit pour mettre son appel)

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>';
}

Une autre chose que vous pouvez vérifier est laquelle de ces règles a été mise en correspondance:

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>';
}

(Encore une fois, appelez-le dans footer.php).

3
Krzysiek Dróżdż