Comprendre add_rewrite_rule

11

J'essaie de add_rewrite_ruletravailler pour extraire un paramètre de l'URL et le transmettre à la demande. Vu un certain nombre de messages à ce sujet, mais ne semble pas le faire fonctionner.

Si une URL commence par une certaine chaîne, je voudrais la supprimer de l'URL et la passer en tant que paramètres 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 demande normale. Cette logique devrait s'appliquer à toute URL de page ou URL de type de message personnalisé sur mon site (essentiellement foo / *). Penser que cela agirait comme un passage, si l'url a `` foo '', supprimez-le, puis passez simplement à Wordpress pour qu'il soit normal.

J'ai déjà 'param' en tant que query_vars autorisé.

Au total, il faudrait travailler pour les éléments suivants:

  • / foo / ma_page (Page)
  • / foo / my_folder / my_page (sous-page)
  • / foo / example_type (Archive de publication personnalisée)
  • / foo / example_type / example_post (Single Post personnalisé)
Louis W
la source
une URL, c'est-à-dire des publications, des catégories, des balises, etc., pas seulement le pagetype de publication ou n'importe quelle page? qu'en est-il des pages parent / enfant dans la hiérarchie?
Milo
@Milo, j'ai clarifié cela pour vous. J'utilise uniquement des pages et des types de messages personnalisés (archives et pages uniques).
Louis W

Réponses:

8

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 tout ce qui vient après foo/et définit cela comme pagenamepour la requête, puis paramobtient la valeur statique foo. Si vous avez besoin de différents modèles d'URL, vous aurez besoin de règles supplémentaires pour chaque modèle unique. Reportez-vous à la WP_Querydocumentation pour les différentes variables de requête qui peuvent être définies 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 de Permaliens.

Maintenant, visitez votre exemple d'URL:

http://domain.com/foo/my_page

chargera la bonne page, mais cela ne se comportera pas exactement comme la visite:

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

car lors de l'utilisation de réécritures internes, il paramest défini dans l' $wp_queryobjet de requête, pas dans le $_GETsuperglobal. Si vous devez travailler avec du code qui recherche une valeur $_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 à considérer consiste à utiliser des points de terminaison, ce /foo/serait donc à la fin des URL plutôt que comme préfixe. L'avantage est que les API add_rewrite_endpointsimplifient l'ajout de toutes les règles dont vous avez besoin, y compris l'activation de la pagination.

Milo
la source
Merci pour l'explication complète. Semble proche, fonctionne pour les pages mais me donne une erreur 404 pour les archives de messages personnalisées et les URL uniques.
Louis W
Eh bien oui, comme je l'ai dit, vous devez ajouter des règles supplémentaires qui correspondent à chacun de ces modèles. Je ne sais pas à quoi ressemblent ces URL dans votre configuration.
Milo
J'ai un type de page personnalisé nommé «projets» qui a une archive et des pages uniques. Pouvez-vous donner un exemple pour cela, et je peux faire tous les autres.
Louis W
En outre, cela ne semble pas fonctionner pour les sous-pages.
Louis W
1
Modifiez votre question pour ajouter un exemple de chaque modèle d'URL qui nécessite une règle. Je ne suis pas vraiment préoccupé par le fait que ma réponse soit acceptée, parfois je peux inciter les gens à répondre à leurs propres questions en leur donnant quelque chose pour commencer.
Milo
6

Ok, j'ai des exemples de travail pour les 3 types de demandes. Il a fallu une tonne d'expérimentation et de déconner pour les faire travailler. Je suppose que Milo est bon pour pousser les gens à répondre à leurs propres questions.

Après d'innombrables modifications et rafraîchissement des permaliens, j'ai réalisé qu'il était beaucoup plus facile de comprendre les URL en dehors de add_rewrite_url et une fois qu'elles ont travaillé, définissez la réécriture. Exemple d'être index.php?param=foo&post_type=example_type.

Une autre chose évidente, mais l'ajouter ici pour que cela puisse aider quelqu'un d'autre. Vous devez définir les règles de type de publication personnalisées add_rewrite_rule AVANT de définir vos règles génériques de page / sous-page. J'ai perdu pas mal de temps avec celui-là et je pense que c'est la principale chose qui m'a fait ne pas comprendre pourquoi les règles ne fonctionnaient pas.

Voici les 3 règles qui fonctionnent à travers 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, j'ai créé 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ées 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'
        );

}

L' analyseur de réécriture que Milo a transmis a été très utile pour mieux comprendre comment Wordpress interroge les pages / publications.

Louis W
la source
Tard dans l'émission, mais puis-je vous cingler pour un autre exemple? Attention, je ne comprends absolument pas le paramètre $ tag de add_rewrite_rule. Je n'ai aucune idée de ce que cela signifie. Je ne comprends pas non plus l'exemple utilisant pagename = $ matches [1] '. HUH ??? J'ai une URL comme domain.com/detail?id=2&it=3. Je veux que la page soit domain.com/detail/2-3/. Êtes-vous prêt?
Debbie Kurth