web-dev-qa-db-fra.com

Comprendre add_rewrite_rule

J'essaie de faire travailler add_rewrite_rule pour extraire un paramètre de l'URL et le transmettre à la demande. Vu plusieurs articles à ce sujet, mais n'arrive pas à le faire fonctionner.

Si une URL commence par une certaine chaîne, j'aimerais la supprimer de l'URL et la transmettre en tant que paramètre de requête.

Exemple d'URL de demande:

http://domain.com/foo/my_page

Cela se transformerait en

http://domain.com/my_page?param=foo

Si 'foo' n'est pas présent, il devrait simplement être traité comme une requête normale. Cette logique devrait s’appliquer à n’importe quelle URL de page ou d’URL de type publication personnalisée sur mon site (essentiellement foo/*). En pensant que cela agirait comme une passe à travers, si l'URL a "foo", il la supprime et passe ensuite à Wordpress. C'est normal.

J'ai déjà 'param' dans un query_vars autorisé.

Au total, il devrait fonctionner pour les éléments suivants:

  • / foo/my_page (Page)
  • / foo/my_folder/my_page (Sous-page)
  • / foo/example_type (Archive de messages personnalisée)
  • / foo/example_type/example_post (Post unique personnalisé)
10
Louis W

Ok, j'ai des exemples de travail pour les 3 types de demandes. Il a fallu une tonne d'expériences et de déconner pour les faire fonctionner. J'imagine que Milo sait bien inciter les gens à répondre à leurs propres questions.

Après d'innombrables modifications et rafraîchissements des liens permanents, j'ai compris qu'il était beaucoup plus facile de comprendre les URL en dehors de add_rewrite_url. Une fois qu'elles ont été utilisées, définissez la réécriture. Exemple: index.php?param=foo&post_type=example_type.

Une autre chose évidente, mais l'ajouter ici pour aider quelqu'un d'autre. Vous devez définir les règles de type de publication personnalisée add_rewrite_rule AVANT de définir vos règles de caractère générique de page/sous-page. J'ai perdu pas mal de temps avec celui-ci et je pense que c'est la principale raison pour laquelle je ne comprenais pas pourquoi les règles ne fonctionnaient pas.

Voici les 3 règles qui répondent à tous mes besoins. La règle Page/Sous-page a été combinée en une seule.

// Custom Post Archive
add_rewrite_rule(
    '^foo/example_type/?$',
    'index.php?param=foo&post_type=example_type',
    'top'
    );

// Custom Post Individual
add_rewrite_rule(
    '^foo/example_type/([^/]*)/?$',
    'index.php?param=foo&example_type=$matches[1]',
    'top'
    );

// Pages, Top-Level and Sub-Pages
// This MUST be placed in the code AFTER custom post add_rewrite_rule
add_rewrite_rule(
    '^foo/(.+)/?$',    
    'index.php?param=foo&pagename=$matches[1]',
    'top'
    );

De plus, ce que j'ai fait est de configurer une boucle pour ajouter plusieurs règles de type de publication personnalisées. N'oubliez pas que vous devez définir les règles de type de publication personnalisée add_rewrite_rule AVANT de définir vos règles génériques de page/sous-page.

$custom_types = array('example_type', 'projects', 'people');

foreach($custom_types as $type) {

    // Custom Post Archive
    add_rewrite_rule(
        '^foo/'.$type.'/?$',
        'index.php?param=foo&post_type='.$type,
        'top'
        );

    // Custom Post Individual
    add_rewrite_rule(
        '^foo/'.$type.'/([^/]*)/?$',
        'index.php?param=foo&'.$type.'=$matches[1]',
        'top'
        );

}

Le Rewrite Analyzer qui a été transmis par Milo s’est avéré très utile pour tenter de mieux comprendre comment Wordpress interroge les pages/les publications.

6
Louis W

Une règle de base qui fonctionnerait pour votre exemple:

function wpd_foo_rewrite_rule() {
    add_rewrite_rule(
        '^foo/([^/]*)/?',
        'index.php?pagename=$matches[1]&param=foo',
        'top'
    );
}
add_action( 'init', 'wpd_foo_rewrite_rule' );

Cela prend ce qui vient après foo/ et le définit comme pagename pour la requête, puis param obtient la valeur statique foo. Si vous avez besoin de modèles d'URL différents, vous aurez besoin de règles supplémentaires pour chaque modèle unique. Reportez-vous à WP_Query docs pour connaître les différents vars de requête pouvant être définis dans les règles de réécriture. N'oubliez pas de vider les règles de réécriture après en avoir ajouté de nouvelles. Cela peut être fait en visitant la page Paramètres Permalinks.

Visitez maintenant votre exemple d'URL:

http://domain.com/foo/my_page

chargera la bonne page, mais elle ne se comportera pas exactement comme si vous visitiez:

http://domain.com/my_page?param=foo

parce que lors de l'utilisation de réécritures internes, param est défini dans l'objet de requête $wp_query et non dans le $_GET superglobal. Si vous devez travailler avec du code qui recherche une valeur dans $_GET, vous aurez besoin d'une étape supplémentaire pour définir cette valeur:

function wpd_foo_get_param() {
    if( false !== get_query_var( 'param' ) ){
        $_GET['param'] = get_query_var( 'param' );
    }
}
add_action( 'parse_query', 'wpd_foo_get_param' );

Une autre méthode à envisager consiste à utiliser des points de terminaison. /foo/ serait donc placé à la fin des URL plutôt que comme préfixe. L'avantage de ceci est que l'API add_rewrite_endpoint simplifie l'ajout de toutes les règles dont vous avez besoin, y compris l'activation de la pagination.

7
Milo