Cara terbaik untuk flush_rewrite_rules untuk jenis posting khusus, dalam plugin mu-plugins?

9

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.

CC
sumber
Sebenarnya tidak ada cara yang tepat untuk melakukan ini. Ini pada dasarnya yang terbaik pada saat menulis komentar ini.
Pieter Goosen
@PieterGoosen - terima kasih, saya memang melihat itu sebelumnya, dan saya memperbarui pertanyaan saya untuk mempertimbangkan solusi lain. Masih tidak bekerja. Saya ingin tahu apakah saya memecahkan sesuatu dengan menjalankan flush_rewrite_rules () sebelum melihat jawaban yang lain? Mungkin saya harus menghapus situs pengujian saya dan membangun kembali, untuk secara akurat menguji prosedur yang benar?
CC
Itu mungkin. Menjalankan aturan penulisan ulang flush secara salah dalam multisite dapat melanggar semua aturan penulisan ulang di jaringan Anda. Jika saya di mana Anda, saya hanya akan mulai segar. Hanya berharap ini akhir instalasi lokal bukan situs langsung ;-)
Pieter Goosen
benar ... aku akan mencobanya. Dan tidak, ini adalah situs uji dan saya pikir saya dapat menghapus DB dan mengatur ulang konfigurasi jaringan dalam tidur saya sekarang! :-)
CC

Jawaban:

2

The flush_rewrite_rulesfungsi 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:

  • panggil wp-settings.phpfile
  • sebut do_action( 'muplugins_loaded' );hook, di sini plugin Anda diinisialisasi
  • panggil di $GLOBALS['wp_rewrite'] = new WP_Rewrite();sini metode flush_rulesini diinisialisasi dan tersedia mulai sekarang
  • do_action( 'setup_theme' );dipanggil dan saya bertaruh semua uang saya bahwa pada kait ini flush_rewrite_rulesakan bekerja

Larutan?

Secara pribadi, saya menemukan andal penghapusan opsi rewrite_rules.

delete_option('rewrite_rules');

atau

update_option('rewrite_rules', '' );

Setiap kali WordPress kekurangan rewrite_rulesitu akan membangunnya kembali, ini juga yang dilakukan flush_rulesmetode ini.

Ada poin dalam alur eksekusi WordPress di mana fungsi seperti ini tidak tersedia. bahkan di inti WordPress saya menemukan pernyataan ini

// Rewrite rules can't be flushed during switch to blog.
delete_option( 'rewrite_rules' );

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

Andrei
sumber
0

Jika plugin Anda memiliki opsi, saya akan meletakkan flush tepat setelah memperbaruinya:

update_option( 'my_options', $values );
// Flush rules after install
flush_rewrite_rules();
Leon Francis Shelhamer
sumber