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
myroute
i myargument
do 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/myargument
zdecydować 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, api
ponieważ 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 myroute
i myargument
do 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=1
a następnie dodać api
jako dodatkowy parametr do array_push()
wywołanego wywołania my_insert_query_vars()
.
To zmieniłoby niestandardową trasę, tak aby api=1
wyzwalał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 myroute
nie jest to taksonomia, termin ani strona nadrzędna?
Mam nadzieję że to pomoże.
my_insert_rewrite_rules
zgodnie 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.Aby rozwinąć nieco to, co eddiemoya zrobiło powyżej:
Podobnie jak oryginalny plakat tego pytania, chciałem utworzyć niestandardowe przepisywanie, a także dostarczyć niestandardowy szablon dla tej strony przepisywania. Kod z edditmoya pomógł mi zacząć w dobrym kierunku i dodałem dodatkową funkcję do obsługi mojego niestandardowego szablonu po wejściu na stronę.
Szablon niestandardowy może znajdować się w dowolnym miejscu, w moim przypadku jest przechowywany w katalogu wtyczek.
Chciałem też tylko sprawdzić, czy reguły przepisywania muszą zostać wyczyszczone podczas aktywacji wtyczki, więc umieściłem to na haku register_activation_hook
Zobacz poniżej pełny przykład tego, co zrobiłem:
AKTUALIZACJA uproszczona w oparciu o porady od milo
źródło
add_rewrite_endpoint
, który wygeneruje regułę i doda zapytanie var za jednym razem. także jeśli dodajesz własne reguły przepisywania, sugerujęadd_rewrite_rule
funkcję zamiast filtrowaniarewrite_rules_array
.