Вам потрібно зробити три важливі речі:
- Створіть спеціальне правило перезапису, щоб перетворити частини URI у значення, передані
index.php
.
- Додати
myroute
і myargument
в змінних запиту WordPress в білий список, так що WordPress не просто ігнорувати їх , коли вони з'являються в рядку запиту.
- Скиньте правила перезапису.
По-перше, я порекомендую замість цього http://www.example.org/myroute/myargument
встановити якийсь спеціальний префікс або суфікс, щоб позначити, коли URI слід вважати одним із цих спеціальних "маршрутів". Заради цього прикладу я вибрав префікс api
, щоб він був http://www.example.org/api/myroute/myargument
. Я вибрав це api
тому, що коли я робив щось ВИПУСКЕ, як те, над чим ти працюєш, це було для 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 перестане переглядати список правил перезапису та використовуватиме захоплені значення regex замість посилань ( $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.