Saya mengalami sedikit masalah aneh dengan aturan penulisan ulang tidak memerah dengan baik.
Saya sudah mencoba menggunakan flush_rewrite_rules();
dan flush_rewrite_rules(true);
.
Saya juga mencoba mengglobal $wp_rewrite
menggunakan $wp_rewrite->flush_rules();
dan$wp_rewrite->flush_rules(true);
Tak satu pun yang tampaknya menyiram aturan penulisan ulang dengan benar. Panggilan-panggilan itu memang membilas aturan penulisan ulang ketika dipanggil. Bagaimana saya tahu ini? Menggunakan solusi untuk debugging pembilasan aturan penulisan ulang .
Saat ini, saya memiliki aturan penulisan ulang pada aktivasi plugin dan penonaktifan plugin. Tidak ada masalah di sana.
Saya memiliki halaman pengaturan administrasi plugin untuk pengguna untuk mengkonfigurasi plugin. Beberapa pengaturan menyesuaikan struktur permalink, sehingga aturan penulisan ulang diharuskan untuk dibilas pada halaman pengaturan administrasi plugin "Simpan Pengaturan". (Menggunakan standar update_option();
) untuk menyimpan pengaturan.
Saya ingin mencatat bahwa tergantung pada pengaturan yang ditentukan, jenis posting khusus dibuat untuk mencocokkan pengaturan yang ditentukan pengguna. Jadi aturan penulisan ulang harus segera dihapus setelah pengaturan disimpan. Di sinilah hal-hal tidak berfungsi dengan tepat.
Solusi tautan di atas untuk men-debug aturan penulisan ulang yang disediakan oleh @toscho
menampilkan bahwa itu membilas banyak aturan penulisan ulang. Namun, ketika mengunjungi item tunggal jenis pos kustom, atau bahkan arsip jenis pos kustom dalam hal ini, masing-masing kembali sebagai 404 kesalahan.
Jenis pos kustom terdaftar dengan benar dan tepat. Saya tahu pasti bukan itu masalahnya.
Segera ikuti pengaturan halaman administrasi plugin simpan. Jenis posting khusus dibuat, struktur permalink disesuaikan, dan semua aturan penulisan ulang dicoba untuk dibilas.
Jenis pos kustom kemudian dimuat selalu, dan dimuat init
seperti biasa.
Untuk beberapa alasan, aturan penulisan ulang tidak mengalir dengan benar, karena seperti yang saya katakan sebelumnya, mengunjungi bagian tunggal atau arsip dari jenis pos kustom menghasilkan 404 kesalahan.
Sekarang bagian yang aneh, jika semua yang saya lakukan adalah hanya mengunjungi halaman pengaturan permalink administrasi, dan kemudian kembali ke ujung depan untuk melihat bagian tunggal atau arsip dari jenis posting kustom, mereka ajaib bekerja seperti yang diharapkan.
Apa yang dilakukan halaman pengaturan permalink administrasi yang tidak saya lakukan yang memungkinkan aturan penulisan ulang menyiram dengan tepat dan milik saya tidak?
Maksud saya, sebagai solusi sementara, saya mengarahkan pengguna ke halaman pengaturan permalink administrasi setelah menyimpan halaman pengaturan administrasi plugin, tetapi ini bukan solusi yang ideal. Saya lebih suka aturan penulisan ulang hanya menyiram dengan benar dalam kode plugin saya.
Apakah ada titik tertentu di WordPress di mana pembilasan aturan penulisan ulang hanya tidak menyiram SEMUA aturan lagi?
admin_menu
- Halaman pengaturan plugin ditambahkan ke administrasi WordPress.
add_options_page()
- Halaman pengaturan plugin ditambahkan di bawah menu Pengaturan.
Halaman pengaturan diberikan dalam panggilan balik untuk add_options_page()
. Di sinilah juga $_POST
diproses untuk memperbarui pengaturan plugin dan menyiram aturan penulisan ulang.
Karena ini sudah merupakan pertanyaan yang panjang, saya akan bersedia memberikan blok kode (jika itu membantu) dalam tautan di luar kantor yang membantu menghasilkan jawaban yang valid.
sumber
flush_rewrite_rules
, yang hanya menghapusrewrite_rules
opsi dan membuatnya kembali, Anda dapat membuka filewp-admin/options-permalinks.php
dan melihat di mana ini terjadi. karena operasi ini hanya menghapus seluruh opsi, tidak mungkin untuk aturan flush sebagian.init
register tipe tulisan mana. Saya pikir, pengaturan halaman sedang disimpan, dan halaman itu akan dimuat ulang ... lalu jalankaninit
hook lagi untuk mendaftarkan jenis posting yang diperlukan. Jadi saya pikir tipe posting sudah akan dimuat, dan semua yang perlu saya lakukan adalah memperbarui opsi, kemudian menghapus aturan penulisan ulang dari halaman pengaturan plugin saya. Saya akan mengirim jawaban tentang bagaimana saya menemukan solusi.Jawaban:
Tempat terbaik untuk menghapus aturan penulisan ulang adalah pada aktivasi / penonaktifan plugin.
Lihat artikel kodeks
Mohon maaf sebelumnya, saya tidak menyelesaikan semua pertanyaan Anda, jadi ini adalah sedikit tanggapan pemotong kue.
sumber
Sulit mengatakan apa yang salah, tanpa melihat kode Anda. Tetapi setelah menyimpan beberapa pengaturan, praktis untuk menghubungkan
admin_init
seperti yang ditunjukkan di bawah ini untuk menyiram aturan penulisan ulang Anda.Kode:
Anda harus mengatur opsi di mana saja di halaman pengaturan Anda atau tepatnya di suatu tempat dalam proses menyimpan pengaturan. Melakukannya tanpa opsi itu buruk, karena Anda tidak ingin menyiram peraturan setiap waktu.
Catatan: belum diuji
sumber
*_option()
karena halaman pengaturan. @helgathevikingSaya memiliki file kelas jenis posting yang bertanggung jawab untuk membaca pengaturan opsi plugin, dan membuat jenis posting kustom yang diperlukan berdasarkan pengaturan yang ditentukan pengguna.
File kelas jenis posting ini dimuat pada hook
init
.Saya pikir semua yang perlu saya lakukan adalah memperbarui pengaturan plugin, kemudian menghapus aturan penulisan ulang. Karena kelas jenis posting sudah dimuat berdasarkan pengaturan plugin. Tetapi dengan halaman administrasi, mereka dimuat SETELAH
init
hook.Jenis posting tidak pernah benar-benar terdaftar, karena pengaturan belum benar-benar ditetapkan. Kelas pendaftaran jenis posting berakhir sebelum waktunya tanpa jenis posting terdaftar.
Solusinya adalah:
(Sebelumnya ... step2 hilang - Seperti disebutkan di atas ...)
Mulai sekarang, tipe posting akan dimuat pada
init
hook, dan pengaturannya sudah ditentukan, memungkinkan tipe posting dibuat dan dipasangkan dengan aturan penulisan ulang yang sesuai.Untuk alasan apa pun, saya harus menambahkan panggilan JavaScript untuk mengalihkan ke halaman saat ini, setelah melakukan tiga langkah di atas.
Saya juga harus menambahkan panggilan ke
flush_rewrite_rules();
pada halaman pengaturan administrasi plugin.Jadi demi memastikan semuanya memerah ...
Langkah 1) Navigasikan ke halaman pengaturan administrasi plugin. - Siram awal.
Langkah 2) Perbarui pengaturan plugin. - Siram kedua.
Langkah 3) Halaman mengalihkan ke halaman pengaturan plugin. Menyebabkan ... Siram ketiga dan terakhir (sama seperti siram awal - Dilakukan secara otomatis saat halaman pengaturan plugin dikunjungi)
Saya tidak mengatakan ini adalah solusi praktis, tetapi ini berhasil untuk saya. Masalah yang sangat aneh dan kemungkinan besar berkaitan dengan infrastruktur pengkodean saya.
sumber
@ tazo-todua ini bekerja untuk saya juga saat menggunakan multisite.
sumber
SOLUSI YANG SAYA temukan:
sumber
Saya mengalami masalah yang persis sama. Di plugin saya, saya memiliki tipe posting yang dibuat secara dinamis. Karena itu mereka tidak dapat didaftarkan melalui
register_post_type()
metode statis selamaactivation_hook
dan karena itu belum aktif ketikaflush_rewrite_rules()
dijalankan selama pengait ini (yang biasanya merupakan cara yang disarankan untuk membersihkan aturan penulisan ulang).Solusi paling bersih yang bisa saya dapatkan pada akhirnya adalah menyiram aturan penulisan ulang setelah registrasi jenis posting, tetapi tentu saja hanya jika pembilasan seperti itu benar-benar diperlukan (karena operasinya lambat). Dalam kasus saya, saya benar-benar memiliki beberapa jenis posting kustom yang mewarisi dari kelas basis tunggal dan sangat diinginkan untuk mengimplementasikan kode yang melakukan flushing di sana.
Apakah pembilasan diperlukan dapat diputuskan dengan melihat output dari
get_option( 'rewrite_rules' )
:Kekurangan:
register_post_type()
.Keuntungan:
Hanya gunakan ini jika Anda tidak dapat mendaftarkan jenis posting Anda dalam fungsi statis yang dapat memanggil selama keduanya
init
danactivation_hook
!Ketergantungan pada bagaimana aturan penulisan ulang yang dihasilkan selama
register_post_type()
terlihat seperti dapat dikurangi dengan mengganti tesif(strpos($key, $args['rewrite']['slug'] ) === 0)
dengan sesuatu yang lebih rumit, yaitu, ekspresi reguler.sumber