Memahami add_rewrite_rule

11

Saya mencoba add_rewrite_rulebekerja untuk mengekstrak param dari url dan meneruskannya ke permintaan. Melihat sejumlah posting tentang ini, tetapi tampaknya tidak dapat membuatnya berfungsi.

Jika url dimulai dengan string tertentu, saya ingin menghapusnya dari url dan meneruskannya sebagai params kueri.

Contoh permintaan url:

http://domain.com/foo/my_page

Ini akan ditransformasikan menjadi

http://domain.com/my_page?param=foo

Jika 'foo' tidak ada, itu harus melalui permintaan normal. Logika ini harus berlaku untuk url halaman atau url jenis posting khusus di situs saya (pada dasarnya foo / *). Berpikir itu akan bertindak sebagai lulus melalui, jika url memiliki 'foo' menghapusnya dan kemudian hanya meneruskan ke Wordpress untuk hal yang normal.

Saya sudah memiliki 'param' sebagai query_vars yang diizinkan.

Secara total, perlu bekerja untuk yang berikut:

  • / foo / my_page (Halaman)
  • / foo / my_folder / my_page (Sub-Halaman)
  • / foo / example_type (Arsip Posting Kustom)
  • / foo / example_type / example_post (Custom Post Single)
Louis W
sumber
URL, posting makna, kategori, tag, dll., bukan hanya pagetipe posting, atau sembarang halaman? bagaimana dengan halaman induk / anak dalam hierarki?
Milo
@ Moilo Saya sudah mengklarifikasi ini untuk Anda. Saya hanya menggunakan halaman dan tipe posting khusus (arsip dan satu halaman).
Louis W

Jawaban:

8

Aturan dasar yang akan berfungsi untuk contoh Anda:

function wpd_foo_rewrite_rule() {
    add_rewrite_rule(
        '^foo/([^/]*)/?',
        'index.php?pagename=$matches[1]&param=foo',
        'top'
    );
}
add_action( 'init', 'wpd_foo_rewrite_rule' );

Ini mengambil apa pun yang muncul setelahnya foo/dan menetapkannya sebagai pagenameuntuk kueri, dan kemudian parammendapatkan nilai statis foo. Jika Anda membutuhkan pola URL yang berbeda, Anda akan memerlukan aturan tambahan untuk setiap pola unik. Merujuk ke WP_Querydokumen untuk berbagai var permintaan yang dapat diatur dalam aturan penulisan ulang. Jangan lupa untuk menyiram aturan penulisan ulang setelah menambahkan yang baru. Ini dapat dilakukan dengan mengunjungi halaman Pengaturan Permalinks.

Sekarang kunjungi URL contoh Anda:

http://domain.com/foo/my_page

akan memuat halaman yang benar, tetapi itu tidak akan berperilaku persis seperti mengunjungi:

http://domain.com/my_page?param=foo

karena ketika menggunakan penulisan ulang internal, paramdiatur dalam $wp_queryobjek permintaan, bukan $_GETsuperglobal. Jika Anda perlu bekerja dengan kode yang mencari nilai $_GET, Anda perlu langkah ekstra untuk menetapkan nilai itu:

function wpd_foo_get_param() {
    if( false !== get_query_var( 'param' ) ){
        $_GET['param'] = get_query_var( 'param' );
    }
}
add_action( 'parse_query', 'wpd_foo_get_param' );

Metode lain yang perlu dipertimbangkan adalah menggunakan titik akhir, jadi /foo/pada akhir URL bukan sebagai awalan. Keuntungannya adalah API add_rewrite_endpointmenyederhanakan menambahkan semua aturan yang Anda butuhkan, termasuk mengaktifkan pagination.

Milo
sumber
Terima kasih atas penjelasannya. Tampaknya dekat, berfungsi untuk halaman tetapi memberi saya kesalahan 404 untuk arsip posting khusus dan url tunggal.
Louis W
baik ya, seperti yang saya katakan, Anda perlu menambahkan aturan tambahan yang cocok dengan masing-masing pola itu. Saya tidak tahu seperti apa URL-URL itu pada pengaturan Anda.
Milo
Saya memiliki jenis halaman khusus bernama 'proyek' yang memiliki arsip dan satu halaman. Bisakah Anda memberi contoh untuk itu, dan saya bisa membuat yang lain.
Louis W
Selain itu, tampaknya tidak berfungsi untuk sub-halaman.
Louis W
1
Edit pertanyaan Anda untuk menambahkan contoh setiap pola URL yang membutuhkan aturan. Saya tidak terlalu peduli dengan jawaban saya yang diterima, kadang-kadang saya bisa menipu orang untuk menjawab pertanyaan mereka sendiri dengan memberi mereka sesuatu untuk memulai.
Milo
6

Oke, saya sudah mendapatkan contoh yang berfungsi untuk semua 3 jenis permintaan. Butuh satu ton percobaan dan main-main untuk membuat mereka bekerja. Saya kira Milo pandai mendorong orang untuk menjawab pertanyaan mereka sendiri.

Setelah perubahan yang tak terhitung jumlahnya dan menyegarkan permalinks saya menyadari itu jauh lebih mudah untuk mengetahui url di luar add_rewrite_url dan sekali mereka bekerja kemudian tentukan penulisan ulang. Contoh sedang index.php?param=foo&post_type=example_type.

Hal lain yang jelas, tetapi menambahkannya di sini sehingga dapat membantu orang lain. Anda harus menetapkan aturan add_rewrite_rule jenis pos kustom SEBELUM Anda menentukan halaman / sub-halaman aturan wildcard Anda. Saya menghabiskan sedikit waktu dengan yang itu dan berpikir itu adalah hal utama yang membuat saya tidak mengerti mengapa aturan tidak bekerja.

Berikut adalah 3 aturan yang sesuai dengan semua kebutuhan saya. Aturan Halaman / Sub-Halaman digabungkan menjadi satu.

// Custom Post Archive
add_rewrite_rule(
    '^foo/example_type/?$',
    'index.php?param=foo&post_type=example_type',
    'top'
    );

// Custom Post Individual
add_rewrite_rule(
    '^foo/example_type/([^/]*)/?$',
    'index.php?param=foo&example_type=$matches[1]',
    'top'
    );

// Pages, Top-Level and Sub-Pages
// This MUST be placed in the code AFTER custom post add_rewrite_rule
add_rewrite_rule(
    '^foo/(.+)/?$',    
    'index.php?param=foo&pagename=$matches[1]',
    'top'
    );

Selain itu, apa yang saya lakukan adalah mengatur lingkaran untuk menambahkan beberapa aturan jenis pos kustom. Ingat, Anda harus mendefinisikan aturan add_rewrite_rule jenis pos kustom SEBELUM Anda menentukan halaman / sub-halaman aturan wildcard Anda.

$custom_types = array('example_type', 'projects', 'people');

foreach($custom_types as $type) {

    // Custom Post Archive
    add_rewrite_rule(
        '^foo/'.$type.'/?$',
        'index.php?param=foo&post_type='.$type,
        'top'
        );

    // Custom Post Individual
    add_rewrite_rule(
        '^foo/'.$type.'/([^/]*)/?$',
        'index.php?param=foo&'.$type.'=$matches[1]',
        'top'
        );

}

The Analyzer Rewrite yang Milo diteruskan cukup membantu ketika mencoba untuk lebih memahami bagaimana Wordpress query untuk halaman / posting.

Louis W
sumber
Terlambat ke pertunjukan, tetapi bisakah saya ping Anda untuk contoh lain? Pikiran Anda, saya benar-benar tidak mengerti parameter $ tag dari add_rewrite_rule. Tidak tahu apa artinya. Saya juga tidak mengerti contoh menggunakan pagename = $ cocok [1] '. HAH??? Saya memiliki URL seperti domain.com/detail?id=2&it=3. Saya ingin halaman menjadi domain.com/detail/2-3/. Apakah kamu mau?
Debbie Kurth