Comprendre la règle add_rewrite

10

J'essaie de faire en sorte que add_rewrite_rule travaille à l'extraction d'un paramètre à partir de l'URL et le transmette à 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

Ceci serait transformé en

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

Si "toto" n'est pas présent, il doit 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 ferait office de passe-partout, si l'URL a «foo», il la supprime et passe ensuite à Wordpress. C'est tout à fait 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 / mon dossier / ma page (sous-page)
  •   
  • / foo / example_type (Archive de messages personnalisée)
  •   
  • / foo / exemple_type / exemple_post (Post individuel personnalisé)
  •   
    
posée Louis W 31.12.2016 - 00:34

2 réponses

6

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 réalisé qu’il était beaucoup plus facile de comprendre les URL en dehors de add_rewrite_url. Une fois qu’ils fonctionnaient, définissiez 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 de caractère générique 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 que Milo a transmis est très utile pour mieux comprendre le fonctionnement des requêtes Wordpress. pour les pages / posts.

    
réponse donnée Louis W 05.01.2017 - 16:51
8

Une règle de base qui conviendrait à 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' );

Ceci prend tout 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

car, lors de l'utilisation de réécritures internes, param est défini dans l'objet de requête $wp_query , et non dans $_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. Ainsi, /foo/ serait placé à la fin des URL plutôt que comme préfixe. L'avantage de ceci est que add_rewrite_endpoint de l'API simplifie l'ajout de toutes les règles dont vous avez besoin, y compris l'activation de la pagination.

    
réponse donnée Milo 02.01.2017 - 04:15

Lire d'autres questions sur les étiquettes