Bagaimana cara membuat rute URL khusus?

50

Saya memiliki persyaratan yang sangat aneh, semoga, saya bisa menjelaskannya tanpa terlalu membingungkan. Saya membuat templat halaman di mana saya mencantumkan beberapa properti yang saya dapatkan dari file XML eksternal, sejauh ini tidak ada masalah, katakanlah URL-nya seperti ini:

http://www.example.com/properties/

Setiap properti memiliki tautan yang akan mengarahkan pengguna ke halaman "Properti Tunggal" yang menampilkan lebih banyak info tentangnya. Saya bertanya-tanya apakah ada cara untuk membuat tautan seperti ini:

http://www.example.com/properties/123

Di mana 123akan menjadi id properti. Jadi jika saya memiliki URL seperti properties/some_idsaya ingin dapat memuat file tampilan (seperti file single.phpatau page.php) tetapi khusus untuk kondisi URL ini.

Apakah ini mungkin?

Javier Villanueva
sumber

Jawaban:

57

Tambahkan ini ke functions.php tema Anda, atau masukkan ke dalam plugin .

add_action( 'init', 'wpse26388_rewrites_init' );
function wpse26388_rewrites_init(){
    add_rewrite_rule(
        'properties/([0-9]+)/?$',
        'index.php?pagename=properties&property_id=$matches[1]',
        'top' );
}

add_filter( 'query_vars', 'wpse26388_query_vars' );
function wpse26388_query_vars( $query_vars ){
    $query_vars[] = 'property_id';
    return $query_vars;
}

Ini menambahkan aturan penulisan ulang yang mengarahkan permintaan ke /properties/dengan kombinasi angka yang mengikuti pagename properties, dengan property_idset var kueri . Pastikan untuk mengunjungi halaman pengaturan permalinks Anda dan simpan untuk menyiram aturan penulisan ulang, sehingga aturan baru ini akan disertakan.

Di page-properties.phptemplat Anda , get_query_var('property_id')akan mengembalikan id properti jika disetel, jika tidak maka akan muncul halaman properti default.

Milo
sumber
4
Ini DEKAT untuk bekerja untuk saya, tetapi saya perlu menambahkan: add_filter ('init', 'flushRules'); function flushRules () {global $ wp_rewrite; $ wp_rewrite-> flush_rules (); }
tooshel
19
@ tooshel Anda pasti tidak ingin menyiram aturan pada setiap permintaan, ini adalah operasi yang mahal dan akan memperlambat situs Anda hingga merayap. Anda hanya perlu menghapus aturan satu kali, pada aktivasi plugin, atau hanya dengan mengunjungi halaman pengaturan permalinks.
Milo
Ya, saya mengerti. . . tetapi ketika Anda menguji itu bagus bahwa itu ada di sana!
tooshel
3
Mungkin, tulis ulang url regexp yang lebih pintar ^properties/([0-9]+)/?. Kalau tidak, itu akan cocok dengan sesuatu sepertiexample/properties/1
Ryan Taylor
@RyanTaylor Anda yakin tentang itu? itu tidak menangkap example/properties/1ketika saya mengujinya.
Milo
9

Cara lain untuk melakukannya:

add_action('init', function() {
    add_rewrite_rule( '^properties/([0-9]+)/?',
                      'index.php?pagename=properties&property_id=$matches[1]',
                      'top' );
}, 10, 0);

add_action('init', function() {
    add_rewrite_tag( '%property_id%', '([^&]+)' );
}, 10, 0);

API Penulisan Ulang Codex / tambahkan aturan penulisan ulang

API Penulisan Ulang Codex / tambahkan tag penulisan ulang

Christian Lescuyer
sumber
2
Jawaban yang diterima berfungsi dengan 4.7 (dan 4.8), tidak yakin mengapa Anda berpikir tidak. Kode Anda pada dasarnya melakukan hal yang sama, add_rewrite_tagmenambahkan kueri var ke array yang sama dengan query_varsfilter.
Milo
@Milo itu mungkin tidak berfungsi untuk saya, tapi saya tidak punya 4.7 berguna lagi jadi saya tidak bisa memeriksa. Saya akan mengedit jawaban saya.
Christian Lescuyer
@ Moilo Meskipun saya pribadi lebih suka menulis ulang tag, tetapi masih menguji jawaban yang diterima dan berfungsi. Hanya beberapa selera pribadi.
Jack Johansson
1
@JackJohansson tag penulisan ulang diperlukan ketika Anda menggunakannya dalam permastruct . Hanya sedikit data tambahan yang tidak pernah digunakan WordPress dalam kasus ini.
Milo
kedua aturan dapat ditambahkan ke metode yang sama, berakhir dengan fungsi yang lebih bersih dan lebih berguna untuk kembali dan mencari tahu jika melakukan pekerjaan pemeliharaan
eballeste