Anda perlu melakukan tiga hal penting:
- Buat aturan penulisan ulang khusus untuk mengubah bagian URI menjadi nilai yang diteruskan
index.php
.
- Tambahkan
myroute
dan myargument
ke daftar putih variabel kueri WordPress, sehingga WordPress tidak hanya mengabaikannya ketika mereka muncul dalam string kueri.
- Siram aturan penulisan ulang.
Pertama, saya akan merekomendasikan bahwa alih-alih http://www.example.org/myroute/myargument
, Anda memilih semacam awalan atau akhiran khusus untuk menyatakan kapan URI harus dianggap sebagai salah satu 'rute' khusus ini. Demi contoh ini, saya telah memilih awalan api
, sehingga akan menjadi http://www.example.org/api/myroute/myargument
. Saya memilih api
karena ketika saya melakukan sesuatu RESTful, seperti apa yang tampaknya sedang Anda kerjakan, itu untuk API.
Kode
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;
}
Kerusakan Cepat
Semuanya lurus ke depan. Pola regex ditambahkan ke daftar semua aturan penulisan ulang di WordPress, dan pola kustom Anda ada di bagian atas daftar. Ketika polanya cocok, WordPress akan berhenti mencari melalui daftar aturan penulisan ulang, dan menggunakan nilai yang diambil regex sebagai pengganti referensi ( $matches[1]
dan $matches[2]
) dalam string kueri yang diteruskan index.php
.
Menambahkan variabel permintaan myroute
dan myargument
ke daftar putih hanya membuat WordPress memperhatikan mereka daripada membuang mereka.
Cara alternatif 'namespacing' rute kustom Anda
Jika Anda ingin menghindari penggunaan /api/
sebagai awalan, Anda bisa menggunakan variabel string / bidang sebagai gantinya. Untuk melakukan sesuatu seperti itu, Anda akan mengubah regex menjadi sesuatu seperti (.*?)/(.+?)\\?api=1
dan kemudian menambahkan api
sebagai parameter tambahan untuk array_push()
panggilan yang dibuat my_insert_query_vars()
.
Itu akan mengubah rute kustom sehingga memicu kapan saja api=1
adalah elemen pertama dari string kueri, misalnya itu akan memicu http://example.com/anytext/anytext?api=1
.
Abaikan penggunaan istilah 'namespacing' - cukup gunakan untuk singkatnya.
Jika Anda tidak 'namespace' dengan awalan atau akhiran, Anda akan berakhir dengan bertabrakan pola URI. Ini karena WordPress tidak akan memiliki cara untuk membedakan pola kustom Anda dari yang dimaksudkan sebagai posting atau halaman. Bagaimana WordPress tahu itu myroute
bukan taksonomi, istilah, atau halaman induk?
Semoga ini membantu.
my_insert_rewrite_rules
urutan definisi! Mulailah dengan aturan terpanjang pertama kemudian bekerja ke yang paling sederhana, jika tidak / api / myroute akan menimpa / api / myroute / myargument.Untuk sedikit memperluas apa yang dilakukan eddiemoya di atas:
Seperti poster asli dari pertanyaan ini, saya ingin membuat penulisan ulang kustom, dan juga memberikan template khusus untuk halaman penulisan ulang itu. Kode dari edditmoya membuat saya mulai di arah yang benar, dan saya menambahkan fungsi tambahan untuk melayani template kustom saya ketika halaman diakses.
Template khusus dapat ditemukan di mana saja, dalam kasus saya, template tersebut disimpan di direktori plugin.
Saya juga hanya ingin memeriksa apakah aturan penulisan ulang perlu dihapus selama aktivasi plugin, jadi saya meletakkannya di register_activation_hook
Lihat di bawah untuk contoh lengkap dari apa yang saya lakukan:
DIPERBARUI disederhanakan berdasarkan saran dari milo
sumber
add_rewrite_endpoint
, yang akan menghasilkan aturan untuk Anda dan menambahkan kueri var dalam sekali jalan. juga jika Anda menambahkan aturan penulisan ulang Anda sendiri, saya sarankanadd_rewrite_rule
fungsi bukan penyaringanrewrite_rules_array
.