Вам нужно сделать три важные вещи:
- Создайте пользовательское правило перезаписи, чтобы превратить части URI в значения, передаваемые
index.php
.
- Добавьте
myroute
и myargument
в белый список переменных запроса WordPress, чтобы WordPress не просто игнорировал их, когда они появляются в строке запроса.
- Сбросьте правила перезаписи.
Во-первых, я собираюсь порекомендовать вам вместо http://www.example.org/myroute/myargument
какого-то специального префикса или суффикса указать, когда URI следует рассматривать как один из этих специальных «маршрутов». Ради этого примера я выбрал префикс api
, чтобы он был http://www.example.org/api/myroute/myargument
. Я выбрал, api
потому что когда я делал что-то RESTful, например, над чем вы работаете, это было для API.
Код
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;
}
Быстрый пробой
Это все довольно просто. Шаблон регулярного выражения добавляется в список всех правил переписывания в WordPress, а ваш пользовательский шаблон находится вверху списка. Когда шаблон сопоставлен, WordPress перестанет просматривать список правил перезаписи и будет использовать захваченные значения регулярного выражения вместо ссылок ( $matches[1]
и $matches[2]
) в строке запроса, переданной в index.php
.
Добавление переменных запроса myroute
и myargument
белого списка просто заставляет WordPress обращать на них внимание, а не отбрасывать их.
Альтернативный способ «пространства имен» вашего пользовательского маршрута
Если вы хотите избежать использования /api/
в качестве префикса, вы можете вместо этого использовать переменную / поле строки запроса. Чтобы сделать что-то подобное, вы должны изменить регулярное выражение на что-то подобное, (.*?)/(.+?)\\?api=1
а затем добавить api
в качестве дополнительного параметра array_push()
вызов, сделанный в my_insert_query_vars()
.
Это изменило бы пользовательский маршрут так, чтобы он срабатывал каждый раз api=1
, когда первым элементом строки запроса является, например, для него http://example.com/anytext/anytext?api=1
.
Не обращайте внимания на использование термина «пространство имен» - просто используйте его для краткости.
Если у вас нет «пространства имен» с префиксом или суффиксом, вы получите конфликтующие шаблоны URI. Это потому, что WordPress не сможет отличить ваш собственный шаблон от поста или страницы. Как WordPress узнает, что myroute
это не таксономия, термин или родительская страница?
Надеюсь это поможет.
my_insert_rewrite_rules
следующем порядке! Сначала начните с самого длинного правила, затем перейдите к самому простому, иначе / api / myroute переопределит / api / myroute / myargument.