Saya menulis sebuah plugin yang instantiates jenis posting kustom (antara lain). Ini adalah plugin multisite dan tinggal di direktori mu-plugins .
Apa praktik terbaik untuk menangani flush_rewrite_rules () dalam situasi ini? Untuk plugin 'normal' Anda akan melakukan ini di kait aktivasi - yang tidak akan mungkin untuk plugin yang harus digunakan karena kait itu tidak tersedia.
Karena ini seharusnya menjadi acara "satu kali" setelah mendaftarkan jenis posting khusus, apakah masuk akal untuk melakukan sesuatu seperti ini di kelas saya yang mendaftarkan CPT:
private function check_flush_my_CPT() {
global $wp_rewrite;
if ( !get_option('my_plugin_firstrun') ) {
$wp_rewrite->init();
$wp_rewrite->flush_rules(true);
update_option('my_plugin_firstrun', 'yes');
}
}
public function register_my_CPT() {
// do all the CPT setup steps for the $args array...
register_post_type('my_CPT', $args);
$this->check_flush_my_CPT();
}
add_action( 'init', array(&$this, 'register_my_CPT' ) );
Jadi, pendaftaran CPT terjadi pada setiap tindakan 'init' - tetapi jika saya memiliki hak ini, aturan penulisan ulang siram hanya terjadi sekali. Selamanya .
Apakah saya di jalur yang benar?
(sunting): Saya baru saja mencobanya; CPT saya memberikan kesalahan 404 tidak ditemukan, sehingga aturan penulisan ulang tidak berfungsi :-(
(sunting # 2): Saya sudah mencoba solusi untuk mengakses variabel global seperti yang ditunjukkan dalam pertanyaan ini: Bagaimana cara menyiram aturan penulisan ulang multisite dengan andal? - Saya akan memperbarui contoh kode saya di atas untuk menunjukkan ini. Sayangnya saya masih mendapatkan error 404 ketika mencoba memuat CPT. Saya melihat bahwa aturan penulisan ulang sedang disimpan dalam database, sepertinya mereka tidak digunakan. Saya tersesat.
Jawaban:
The
flush_rewrite_rules
fungsi handal dalam beberapa konteks seperti tema atau plugin berdasarkan kait tapi aku tidak yakin apakah itu bekerja untuk sebuahmu-plugin
Pernyataan saya didasarkan pada kenyataan bahwa WordPress diinisialisasi dengan cara ini:
wp-settings.php
filedo_action( 'muplugins_loaded' );
hook, di sini plugin Anda diinisialisasi$GLOBALS['wp_rewrite'] = new WP_Rewrite();
sini metodeflush_rules
ini diinisialisasi dan tersedia mulai sekarangdo_action( 'setup_theme' );
dipanggil dan saya bertaruh semua uang saya bahwa pada kait iniflush_rewrite_rules
akan bekerjaLarutan?
Secara pribadi, saya menemukan andal penghapusan opsi rewrite_rules.
atau
Setiap kali WordPress kekurangan
rewrite_rules
itu akan membangunnya kembali, ini juga yang dilakukanflush_rules
metode ini.Ada poin dalam alur eksekusi WordPress di mana fungsi seperti ini tidak tersedia. bahkan di inti WordPress saya menemukan pernyataan ini
Satu-satunya masalah adalah kinerja, jangan lakukan ini pada setiap permintaan karena itu adalah proses yang sulit untuk membangunnya kembali. Seperti yang saya lihat Anda ingin menyiram mereka hanya pada panggilan pertama dan ini adalah hal yang baik.
PS: Saya bukan penggemar self-promo tapi saya juga sudah menulis artikel tentang ini sejak lama dan saya pikir itu masih berlaku untuk ini
sumber
Jika plugin Anda memiliki opsi, saya akan meletakkan flush tepat setelah memperbaruinya:
sumber