Вам нужно сделать три важные вещи:
- Создайте пользовательское правило перезаписи, чтобы превратить части 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.Чтобы немного рассказать о том, что eddiemoya сделал выше:
Как и оригинальный постер этого вопроса, я хотел создать пользовательскую перезапись, а также предоставить собственный шаблон для этой страницы перезаписи. Код от edditmoya заставил меня начать работу в правильном направлении, и я добавил дополнительную функцию для обслуживания моего пользовательского шаблона при доступе к странице.
Пользовательский шаблон может быть расположен где угодно, в моем случае он хранится в каталоге плагинов.
Я также хотел проверить, нужно ли сбрасывать правила перезаписи во время активации плагина, поэтому я добавил это в register_activation_hook
Смотрите ниже полный пример того, что я сделал:
ОБНОВЛЕНО упрощено на основе совета от milo
источник
add_rewrite_endpoint
, который сгенерирует правило для вас и добавит запрос var за один раз. также, если вы добавляете свои собственные правила перезаписи, я предлагаюadd_rewrite_rule
функцию вместо фильтрацииrewrite_rules_array
.