Musisz zrobić trzy ważne rzeczy:
- Utwórz niestandardową regułę przepisywania, aby przekształcić części identyfikatora URI w przekazywane wartości
index.php.
- Dodaj
myroutei myargumentdo białej listy zmiennych zapytań WordPress, aby WordPress nie tylko je ignorował, gdy pojawiają się w ciągu zapytania.
- Opróżnij reguły przepisywania.
Po pierwsze, zalecam, aby zamiast tego http://www.example.org/myroute/myargumentzdecydować się na jakiś specjalny prefiks lub sufiks, aby określić, kiedy URI należy uznać za jedną z tych specjalnych „tras”. Na potrzeby tego przykładu wybrałem prefiks api, aby był http://www.example.org/api/myroute/myargument. Wybrałem, apiponieważ kiedy zrobiłem coś RESTful, na przykład nad czym wydaje się, że pracujesz, było to dla API.
Kod
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;
}
Szybki podział
Wszystko jest dość proste. Wzorzec wyrażenia regularnego jest dodawany do listy wszystkich reguł przepisywania w WordPress, a Twój wzorzec niestandardowy znajduje się na górze listy. Po dopasowaniu wzorca WordPress przestanie przeglądać listę reguł przepisywania i użyje przechwyconych wartości wyrażenia regularnego zamiast odwołań ( $matches[1]i $matches[2]) w przekazanym ciągu zapytania index.php.
Dodanie zmiennych zapytania myroutei myargumentdo białej listy sprawia, że WordPress zwraca na nie uwagę, a nie odrzuca je.
Alternatywny sposób „przestrzeni nazw” na trasie niestandardowej
Jeśli chcesz uniknąć używania /api/jako prefiksu, możesz zamiast tego użyć zmiennej ciąg / zapytanie zapytania. Aby zrobić coś takiego, należy zmienić wyrażenie regularne na coś podobnego, (.*?)/(.+?)\\?api=1a następnie dodać apijako dodatkowy parametr do array_push()wywołanego wywołania my_insert_query_vars().
To zmieniłoby niestandardową trasę, tak aby api=1wyzwalała się w dowolnym momencie, jest pierwszym elementem ciągu zapytania, np. Uruchamiałaby się http://example.com/anytext/anytext?api=1.
Zignoruj użycie terminu „przestrzeń nazw” - po prostu użyłem go dla zwięzłości.
Jeśli nie „przestrzeń nazw” będzie zawierać ani prefiks, ani sufiks, skończy się to kolidowaniem wzorców URI. Wynika to z faktu, że WordPress nie będzie w stanie odróżnić niestandardowego wzorca od wzoru przeznaczonego na post lub stronę. Skąd WordPress miałby wiedzieć, że myroutenie jest to taksonomia, termin ani strona nadrzędna?
Mam nadzieję że to pomoże.
my_insert_rewrite_ruleszgodnie z kolejnością definicji! Najpierw zacznij od najdłuższej reguły, a następnie przejdź do najprostszej, w przeciwnym razie / api / myroute zastąpi / api / myroute / myargument.