Di mana, Kapan, & Bagaimana Cara Benar Menulis Ulang Aturan Dalam Lingkup Plugin?

10

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_rewritemenggunakan $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 @toschomenampilkan 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 initseperti 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 $_POSTdiproses 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.

Michael Ecklund
sumber
1
sepertinya mungkin Anda salah urutan, sulit untuk mengatakannya tanpa melihat beberapa kode. halaman admin permalinks hanya menelepon flush_rewrite_rules, yang hanya menghapus rewrite_rulesopsi dan membuatnya kembali, Anda dapat membuka file wp-admin/options-permalinks.phpdan melihat di mana ini terjadi. karena operasi ini hanya menghapus seluruh opsi, tidak mungkin untuk aturan flush sebagian.
Milo
@ Moilo, saya pikir Anda benar. Saya memiliki kelas yang memuat initregister tipe tulisan mana. Saya pikir, pengaturan halaman sedang disimpan, dan halaman itu akan dimuat ulang ... lalu jalankan inithook 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.
Michael Ecklund
Hanya peringatan flush_rewrite_rules () di plugin saya yang akhirnya menjadi bagian dari masalah bagi saya. Saya menghapus kait php dan akhirnya hanya memperbarui permalink secara manual dan kesalahan CPT 404 saya menghilang.
myol

Jawaban:

4

Tempat terbaik untuk menghapus aturan penulisan ulang adalah pada aktivasi / penonaktifan plugin.

function myplugin_activate() {
    // register taxonomies/post types here
    flush_rewrite_rules();
}

register_activation_hook( __FILE__, 'myplugin_activate' );

function myplugin_deactivate() {
    flush_rewrite_rules();
}
register_deactivation_hook( __FILE__, 'myplugin_deactivate' );

Lihat artikel kodeks

Mohon maaf sebelumnya, saya tidak menyelesaikan semua pertanyaan Anda, jadi ini adalah sedikit tanggapan pemotong kue.

helgatheviking
sumber
1
Terima kasih atas saran Anda, tetapi saya menyadari hal ini. Masalahnya bukan tentang aktivasi / penonaktifan plugin. Ini ada hubungannya dengan pengguna mengubah pengaturan ke plugin yang sudah aktif, yang menyesuaikan aturan penulisan ulang, sehingga membutuhkan flush.
Michael Ecklund
1
Saya pikir mungkin itu masalahnya, tetapi saya cukup lelah ketika saya membaca pertanyaan Anda. solusi ialocin terlihat menjanjikan, harap Anda berhasil.
Helgatheviking
4

Sulit mengatakan apa yang salah, tanpa melihat kode Anda. Tetapi setelah menyimpan beberapa pengaturan, praktis untuk menghubungkan admin_initseperti yang ditunjukkan di bawah ini untuk menyiram aturan penulisan ulang Anda.

Kode:

add_action('admin_init', 'wpse_123401_plugin_settings_flush_rewrite');
function wpse_123401_plugin_settings_flush_rewrite() {
    if ( get_option('plugin_settings_have_changed') == true ) {
        flush_rewrite_rules();
        update_option('plugin_settings_have_changed', false);
    }
}


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

Nicolai
sumber
2
Atau Anda bisa menggunakan transient mungkin? Tapi yang pasti +1 tidak membilas aturan pada setiap admin_init.
Helgatheviking
Anda tentu saja benar tentang transient, saya kira saya memilih *_option()karena halaman pengaturan. @helgatheviking
Nicolai
Ini sangat membantu. Saya memiliki situasi yang mirip dengan Michael. Saya akhirnya memasukkan saran helga tentang penggunaan transient dan saya mengaturnya dalam fungsi validasi untuk pengaturan. Saya akhirnya perlu mengatur transient ke false setelah pembilasan atau yang lain terus membilas pada setiap halaman admin memuat sampai transien berakhir. Jadi secara fungsional menggunakan opsi atau sementara itu sama. Saya kira sementara mungkin bagus hanya untuk menjaga tabel opsi sedikit lebih bersih. Tapi satu hal kecil.
MatthewLee
Perbedaannya memang kecil, terutama jika transien itu permanen, tidak kedaluwarsa, tetapi tentu saja transien memiliki kemampuan lain, manfaat yang menyenangkan untuk dimiliki. @MatthewLee
Nicolai
3

Saya 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 inithook.

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:

  1. Perbarui pengaturan plugin.
  2. Muat file kelas jenis posting HANYA satu kali di sini sehingga aturan penulisan ulang yang baru dibuat.
  3. Siram aturan penulisan ulang.

(Sebelumnya ... step2 hilang - Seperti disebutkan di atas ...)

Mulai sekarang, tipe posting akan dimuat pada inithook, 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.

Michael Ecklund
sumber
1

@ tazo-todua ini bekerja untuk saya juga saat menggunakan multisite.

add_action( 'wpmu_new_blog', 'set_my_permalink_structure', 11, 2 );

function set_my_permalink_structure( $blog_id ) {

    switch_to_blog( $blog_id );

    global $wp_rewrite;
    $wp_rewrite->set_permalink_structure( '/%postname%/' );
    $wp_rewrite->flush_rules();
    $wp_rewrite->init();

    restore_current_blog();
}
stillatmylinux
sumber
0

SOLUSI YANG SAYA temukan:

global $wp_rewrite; $wp_rewrite->flush_rules(); $wp_rewrite->init();
T.Todua
sumber
0

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 selama activation_hookdan karena itu belum aktif ketika flush_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' ):

class MyPostTypeClass {

public final function register_as_custom_post_type() {
    ...   //do all the setup of your post type here     
    $args = array(
                  ... //populate the other arguments as you see fit
                  'rewrite' => array('slug' => 'slug-of-your-post-type')
                 );
    register_post_type('post-type-name-of-your-post-type', $args );

    $rewrite_rules_must_be_fluhed = true;
    foreach( get_option( 'rewrite_rules' ) as $key => $rule)
        if(strpos($key, $args['rewrite']['slug'] ) === 0)
        {
            $rewrite_rules_must_be_fluhed = false;
            break;
        }
    if($rewrite_rules_must_be_fluhed)
        flush_rewrite_rules(true);
}
}

Kekurangan:

  • Bergantung pada batas tertentu di mana aturan penulisan ulang yang tepat yang dihasilkan WP selama register_post_type().
  • Memeriksa apakah pembilasan diperlukan selama setiap pemuatan halaman juga menciptakan beberapa overhead.

Keuntungan:

  • Sepenuhnya dienkapsulasi di kelas yang mewakili jenis posting.
  • Hanya menyiram aturan penulisan ulang jika benar-benar diperlukan.

Hanya gunakan ini jika Anda tidak dapat mendaftarkan jenis posting Anda dalam fungsi statis yang dapat memanggil selama keduanya initdan activation_hook!

Ketergantungan pada bagaimana aturan penulisan ulang yang dihasilkan selama register_post_type()terlihat seperti dapat dikurangi dengan mengganti tes if(strpos($key, $args['rewrite']['slug'] ) === 0)dengan sesuatu yang lebih rumit, yaitu, ekspresi reguler.

cgogolin
sumber