Vous devez faire trois choses importantes:
- Créez une règle de réécriture personnalisée pour transformer des parties de l'URI en valeurs transmises à
index.php
.
- Ajoutez
myroute
et myargument
à la liste blanche des variables de requête de WordPress, afin que WordPress ne les ignore pas simplement lorsqu'elles apparaissent dans une chaîne de requête.
- Rincez les règles de réécriture.
Tout d'abord, je vais recommander qu'au lieu de http://www.example.org/myroute/myargument
, vous vous contentiez d'une sorte de préfixe ou de suffixe spécial pour indiquer quand l'URI doit être considéré comme l'une de ces `` routes '' spéciales. Pour les besoins de cet exemple, j'ai choisi le préfixe api
, pour qu'il soit http://www.example.org/api/myroute/myargument
. J'ai choisi api
parce que quand j'ai fait quelque chose de RESTful, comme ce sur quoi vous semblez travailler, c'était pour une API.
Le code
add_filter( 'rewrite_rules_array', 'my_insert_rewrite_rules' );
add_filter( 'query_vars', 'my_insert_query_vars' );
add_action( 'wp_loaded', 'my_flush_rules' );
// flush_rules() if our rules are not yet included
function my_flush_rules() {
$rules = get_option( 'rewrite_rules' );
if ( ! isset( $rules['api/(.*?)/(.+?)'] ) ) {
global $wp_rewrite;
$wp_rewrite->flush_rules();
}
}
// Adding a new rule
function my_insert_rewrite_rules( $rules ) {
$newrules = array();
$newrules['api/(.*?)/(.+?)'] = 'index.php?myroute=$matches[1]&myargument=$matches[2]';
return $newrules + $rules;
}
// Adding the id var so that WP recognizes it
function my_insert_query_vars( $vars ) {
array_push( $vars, 'myroute', 'myargument' );
return $vars;
}
Répartition rapide
C'est assez simple. Le modèle d'expression régulière est ajouté à une liste de toutes les règles de réécriture dans WordPress, et votre modèle personnalisé est en haut de la liste. Lorsque le modèle correspond, WordPress cesse de parcourir la liste des règles de réécriture et utilise les valeurs capturées de l'expression régulière à la place des références ( $matches[1]
et $matches[2]
) dans la chaîne de requête transmise à index.php
.
L'ajout des variables de requête myroute
et myargument
de la liste blanche fait simplement que WordPress y prête attention plutôt que de les supprimer.
Autre moyen de «nommer» votre itinéraire personnalisé
Si vous souhaitez éviter d'utiliser /api/
comme préfixe, vous pouvez utiliser une variable / champ de chaîne de requête à la place. Pour faire quelque chose comme ça, vous devez changer l'expression régulière en quelque chose comme (.*?)/(.+?)\\?api=1
, puis l'ajouter en api
tant que paramètre supplémentaire à l' array_push()
appel effectué dans my_insert_query_vars()
.
Cela changerait l'itinéraire personnalisé de sorte qu'il se déclenche à tout moment api=1
est le premier élément de la chaîne de requête, par exemple, il déclencherait pour http://example.com/anytext/anytext?api=1
.
Ignorez l'utilisation du terme «espace de noms» - utilisez-le simplement pour plus de concision.
Si vous n'espérez pas d'espace de noms avec un préfixe ou un suffixe, vous vous retrouverez avec des modèles d'URI en collision. En effet, WordPress n'aura aucun moyen de distinguer votre modèle personnalisé de celui destiné à être une publication ou une page. Comment WordPress pourrait-il savoir qu'il myroute
ne s'agit pas d'une taxonomie, d'un terme ou d'une page parent?
J'espère que cela t'aides.
my_insert_rewrite_rules
ordre de définition suivent! Commencez par la règle la plus longue, puis réduisez-la par la plus simple, sinon / api / myroute remplacera / api / myroute / myargument.Pour développer un peu ce que eddiemoya a fait ci-dessus:
Comme l'affiche originale de cette question, je voulais créer une réécriture personnalisée et également fournir un modèle personnalisé pour cette page de réécriture. Le code d'edditmoya m'a permis de démarrer dans la bonne direction et j'ai ajouté une fonction supplémentaire pour servir mon modèle personnalisé lorsque la page est consultée.
Le modèle personnalisé peut être situé n'importe où, dans mon cas, il est stocké dans le répertoire du plugin.
Je voulais aussi seulement vérifier si les règles de réécriture devaient être vidées lors de l'activation du plugin, donc je l'ai mis sur un register_activation_hook
Voir ci-dessous pour l'exemple complet de ce que j'ai fait:
MISE À JOUR simplifiée basée sur les conseils de milo
la source
add_rewrite_endpoint
, qui générera la règle pour vous et ajoutera la requête var en une seule fois. aussi si vous ajoutez vos propres règles de réécriture, je suggère laadd_rewrite_rule
fonction au lieu du filtragerewrite_rules_array
.