Bagaimana andal menyiram aturan penulisan ulang pada multisite?

20

Katakanlah Anda memiliki plugin yang perlu menghapus aturan penulisan ulang. Anda melakukan semuanya dengan benar dengan kait aktivasi dan menambahkan flush terlambat, jadi semuanya lancar dan kompatibel.

Dan kemudian suatu hari seseorang mencoba untuk menjalankannya di multisite.

Alih-alih skenario sederhana seperti:

  1. Situs WordPress dibuat
  2. Plugin diinstal dan diaktifkan

Anda sekarang memiliki skenario mimpi buruk seperti:

  1. Plugin diinstal dan jaringan diaktifkan
  2. Situs WordPress baru (atau seratus) dibuat dalam multisite

Secara teori itu seharusnya bekerja, kan? Dalam praktiknya itu salah dengan cara yang spektakuler:

  • $wp_rewrite negara dapat dari situs yang salah
  • switch_to_blog() juga tidak melacak kondisi penulisan ulang
  • bagian "nanti" mungkin terjadi di blog yang berbeda sama sekali
  • semua plugin lain , yang seharusnya Anda sukai, mungkin tidak diaktifkan secara konsisten di situs yang berbeda

Misalnya, Anda dapat melihat masalah ini bagaimana mencoba melakukannya dengan benar meniup permalink di situs utama setiap kali situs baru dibuat .

Jadi, bagaimana plugin melakukan pembilasan aturan penulisan ulang yang andal di multisite :

  1. Kapan situs baru dibuat, untuk situs itu?
  2. Ketika situs yang ada diaktifkan dari tidak aktif, untuk situs?
  3. Kapan plugin diaktifkan jaringan, untuk setiap situs?
  4. Kapan plugin dinonaktifkan jaringan, untuk setiap situs?
  5. Mungkin dalam skenario lain, yang melibatkan penulisan ulang konteks global berubah?
Jarang
sumber

Jawaban:

11

Catatan: ini adalah jawaban yang tidak lengkap yang akan diperluas secara bertahap


Satu-satunya cara yang dapat diandalkan untuk menyiram aturan penulisan ulang di multisite, tanpa berpotensi menghancurkan struktur permalink utama dan atau konteks blog lainnya (tergantung pada bagaimana dan apa yang Anda beralih ke dan dari) adalah untuk menyiram aturan penulisan ulang dalam konteks tertentu seperti :

global $wp_rewrite;
$wp_rewrite->init(); //important...
$wp_rewrite->flush_rules();

Di atas memastikan bahwa struktur permalink yang benar untuk konteks yang diberikan diambil dan diatur sebelum membuat aturan penulisan ulang dan melakukan perubahan pada database.

Ini tidak berlaku untuk situs tunggal di mana konteks tidak menjadi masalah, karena hanya ada satu konteks.

flush_rewrite_rules()menurut pendapat saya cacat dalam premis bahwa itu mengasumsikan konteks yang benar, tetapi tidak memperhitungkan penggunaan kami switch_to_bloguntuk yang benar-benar mengubah konteks dan meninggalkan kami di wilayah berbahaya jika kami mencoba untuk menyiram aturan, berpotensi.

Inilah yang flush_rewrite_rules()tampak seperti internal :

function flush_rewrite_rules( $hard = true ) {
    global $wp_rewrite;
    $wp_rewrite->flush_rules( $hard );
}

Saya tidak dapat memikirkan alasan mengapa tidak terlihat seperti ini:

function flush_rewrite_rules( $hard = true ) {
    global $wp_rewrite;
    $wp_rewrite->init(); //hello....
    $wp_rewrite->flush_rules( $hard );
}

... terutama ketika Anda menganggap bahwa konstruktor WP_Rewritemelakukan apa? Itu melakukan ini ...

public function __construct() {
    $this->init();
}

Menyentuh titik perhatian pertama Anda untuk melanjutkan garis ini,

Jadi, bagaimana plugin melakukan pembilasan aturan penulisan ulang yang andal di multisite :

  • Kapan situs baru dibuat, untuk situs itu?

Mari kita lihat apa yang akan disebut inti WordPress selama proses ini:

  • pertama wpmu_create_blog()
  • yang kemudian memanggil install_blog()yang pada gilirannya panggilanpopulate_options()
  • lalu populate_options()atur struktur tautan permanen default di tabel opsi
  • setelah install_blog()berlari, wp_install_defaults()lalu dipanggil
  • kemudian wp_install_defaults()siram aturan penulisan ulang untuk situs yang baru dibuat sebelum akhirnya beralih kembali ke blog saat ini via restore_current_blog().

Yang penting untuk dicatat adalah bahwa wp_install_defaults()flushes aturan persis seperti yang saya sarankan di atas:

$wp_rewrite->init();
$wp_rewrite->flush_rules();

... karena itulah satu-satunya cara untuk memastikan permalink_structureaturan yang benar dan dibangun untuk konteks saat ini.

Juga dalam masalah yang dibuktikan dalam masalah Github , alasan mengapa pengguna mengalami perilaku berikut:

Ketika sebuah situs baru dibuat, ia merusak permalink level posting hanya di situs level atas - dalam sebagian besar konfigurasi permalink tetapi tidak semua:

2 format ini berfungsi dengan benar.

Default - Bekerja seperti yang diharapkan

Hari & Nama - Bekerja seperti yang diharapkan

... adalah karena jika blog utama memiliki struktur permalink Day & Name /%year%/%monthnum%/%day%/%postname%/, ketika situs baru dibuat, itu juga memiliki struktur permalink Day & Name /%year%/%monthnum%/%day%/%postname%/secara default yang mengapa tidak ada masalah penting muncul ketika plugin Yoast SEO memerah menulis ulang aturan tentang shutdownhook.

Adam
sumber
Kedengarannya benar. Hal yang mengganggu dengan menginstal situs baru adalah bahwa Anda tidak dapat mengaitkan selama proses, hanya setelah itu telah selesai. Karena itu aturan akan disiram dua kali.
Anton Timmermans
Waktu karunia habis, jadi poin untuk jatuh pada pedang di sini. :) Masih banyak yang harus dicari tahu. :(
Paling lambat
Apakah tidak mungkin untuk secara manual mengatur konteks $wp_rewritesehingga Anda dapat mengulang dan mengatur ulang setiap situs jaringan? Saya memiliki situs jaringan besar yang menderita beberapa masalah permalink pada plugin khusus. Membuat plugin yang menambahkan cron tampaknya berlebihan karena akan selalu mengatur ulang mereka. Mengaitkannya dengan URL khusus akan ideal tetapi saya tidak tahu bagaimana melakukannya untuk semua situs.
Adam Patterson