Bạn cần làm ba điều quan trọng:
- Tạo quy tắc viết lại tùy chỉnh để biến các phần của URI thành các giá trị được truyền vào
index.php
.
- Thêm
myroute
và myargument
vào danh sách các biến truy vấn của WordPress, để WordPress không bỏ qua chúng khi chúng xuất hiện trong chuỗi truy vấn.
- Xóa các quy tắc viết lại.
Trước tiên, tôi sẽ khuyên bạn thay vì http://www.example.org/myroute/myargument
, bạn giải quyết một số loại tiền tố hoặc hậu tố đặc biệt để biểu thị khi URI nên được coi là một trong những 'tuyến đường' đặc biệt này. Vì lợi ích của ví dụ này, tôi đã chọn tiền tố api
, vì vậy nó sẽ như vậy http://www.example.org/api/myroute/myargument
. Tôi chọnapi
bởi vì khi tôi làm một cái gì đó RESTful, giống như những gì bạn dường như đang làm việc, nó là cho một API.
Mật mã
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;
}
Sự cố nhanh
Tất cả đều khá thẳng về phía trước. Mẫu regex được thêm vào danh sách tất cả các quy tắc viết lại trong WordPress và mẫu tùy chỉnh của bạn nằm ở đầu danh sách. Khi mẫu được khớp, WordPress sẽ ngừng xem qua danh sách các quy tắc viết lại và sử dụng các giá trị đã bắt của regex thay cho các tham chiếu ( $matches[1]
và $matches[2]
) trong chuỗi truy vấn được truyền tới index.php
.
Việc thêm các biến truy vấn myroute
và myargument
vào danh sách trắng chỉ khiến WordPress chú ý đến chúng hơn là loại bỏ chúng.
Cách khác của 'không gian tên' tuyến đường tùy chỉnh của bạn
Nếu bạn muốn tránh sử dụng /api/
làm tiền tố, bạn có thể sử dụng biến / trường chuỗi truy vấn thay thế. Để làm một cái gì đó như thế, bạn sẽ thay đổi regex thành một cái gì đó giống như (.*?)/(.+?)\\?api=1
và sau đó thêm api
như một tham số bổ sung cho array_push()
cuộc gọi được thực hiện my_insert_query_vars()
.
Điều đó sẽ thay đổi tuyến tùy chỉnh để nó kích hoạt bất cứ lúc nào api=1
là thành phần đầu tiên của chuỗi truy vấn, ví dụ: nó sẽ kích hoạt http://example.com/anytext/anytext?api=1
.
Bỏ qua việc sử dụng thuật ngữ 'không gian tên' - chỉ sử dụng nó cho ngắn gọn.
Nếu bạn không 'không gian tên' với tiền tố hoặc hậu tố, bạn sẽ kết thúc với các mẫu URI va chạm. Điều này là do WordPress sẽ không có cách nào để phân biệt mẫu tùy chỉnh của bạn với một mẫu dự định là một bài đăng hoặc trang. Làm thế nào để WordPress biết rằng đó myroute
không phải là phân loại, thuật ngữ hoặc trang mẹ?
Hi vọng điêu nay co ich.
my_insert_rewrite_rules
theo thứ tự định nghĩa! Bắt đầu với quy tắc dài nhất trước sau đó làm việc đơn giản nhất, nếu không / api / myroute sẽ ghi đè / api / myroute / myargument.