Çoklu sitede yeniden yazma kurallarını güvenilir bir şekilde nasıl temizleyebilirim?


20

Yeniden yazma kurallarını temizlemeniz gereken bir eklentiniz olduğunu varsayalım. Her şeyi aktivasyon kancasıyla ve geç sifon ekleyerek düzgün bir şekilde yaparsınız, böylece her şey pürüzsüz ve uyumludur.

Ve sonra iyi bir gün birisi onu çoklu sitede çalıştırmaya çalışır.

Basit bir senaryo yerine:

  1. WordPress sitesi oluşturuldu
  2. Eklenti yüklendi ve etkinleştirildi

Artık kabus senaryolarınız var:

  1. Eklenti yüklü ve ağ etkin
  2. Çoklu sitede yeni WordPress sitesi (veya yüz) oluşturuldu

Teoride sadece işe yaramalı, değil mi? Pratikte muhteşem yollarla yanlış gider:

  • $wp_rewrite devlet yanlış siteden olabilir
  • switch_to_blog() yeniden yazma durumunu da izlemiyor
  • "daha sonra" kısmı tamamen farklı blogda olabilir
  • iyi oynamanız gereken diğer tüm eklentiler, farklı sitelerde sürekli olarak etkinleştirilmemiş olabilir

Örneğin, doğru bir şekilde yapmaya çalıştığınız bu sorunu , her yeni site oluşturulduğunda ana sitedeki kalıcı bağlantıları uçurduğunu görebilirsiniz .

Peki, eklenti çok sitede yeniden yazma kurallarını güvenilir bir şekilde temizlemeye nasıl devam eder :

  1. Site için yeni site oluşturulduğunda?
  2. Mevcut site etkin değilken etkinleştirildiğinde, site için?
  3. Eklenti ağ etkinleştirildiğinde, her site için?
  4. Eklenti her site için ağ devre dışı bırakıldığında?
  5. Muhtemelen başka bağlamlarda, küresel bağlamın yeniden yazılmasını içerir?

Yanıtlar:


11

Not: Bu, kademeli olarak genişletilecek eksik bir cevaptır


Birincil ve / veya başka herhangi bir blog bağlamının kalıcı bağlantı yapısını potansiyel olarak yok etmeden, birden çok sitede yeniden yazma kurallarını temizlemenin tek güvenilir yolu (nasıl ve neye geçiş yaptığınıza ve ne yaptığınıza bağlı olarak) böyle bir bağlamda yeniden yazma kurallarını temizlemektir. :

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

Yukarıdakiler, yeniden yazma kurallarını oluşturmadan ve veritabanındaki değişiklikleri gerçekleştirmeden önce, verilen bağlam için doğru kalıcı bağlantı yapısının alınmasını ve ayarlanmasını sağlar.

Bu, bağlamın önemli olmadığı tek bir site için geçerli değildir, çünkü yalnızca bir bağlam vardır.

flush_rewrite_rules()bence doğru bağlamı kabul ettiği öncülünde kusurludur, ancak switch_to_blogkuralları tamamen değiştiren ve potansiyel olarak kuralları yıkmaya çalışırsak bizi tehlikeli topraklarda bırakan kullanımımızı dikkate almaz .

İç kısımları flush_rewrite_rules()şöyle görünür:

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

Bunun böyle görünmemesi için bir neden düşünemiyorum:

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

... özellikle kurucunun ne yaptığını düşündüğünüzde WP_Rewrite? Bunu yapar ...

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

Bu çizgiyi daha da ileriye taşımak için ilk endişe noktanıza dokunarak,

Peki, eklenti çok sitede yeniden yazma kurallarını güvenilir bir şekilde temizlemeye nasıl devam eder :

  • Site için yeni site oluşturulduğunda?

Bu işlem sırasında WordPress çekirdeğinin özellikle neyi arayacağına bakalım:

  • ilk wpmu_create_blog()
  • Daha sonra hangi aramaları install_blog()hangi dönüş çağrılarıpopulate_options()
  • ardından populate_options()seçenekler tablosunda varsayılan kalıcı bağlantı yapısını ayarlar
  • sonra install_blog()koştu wp_install_defaults()sonra çağırılır
  • ardından wp_install_defaults()son olarak mevcut blog'a geri dönmeden önce yeni oluşturulan site için yeniden yazma kurallarını temizler restore_current_blog().

Dikkat edilmesi gereken nokta, wp_install_defaults()yukarıda yukarıda önerdiğim gibi kuralları tam olarak temizler:

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

... çünkü permalink_structuremevcut bağlam için doğru ve kuralların oluşturulduğundan emin olmanın tek yolu budur .

Ayrıca Github sorunu içinde ortaya çıkan problemde , kullanıcının aşağıdaki davranışı yaşama nedeni:

Yeni bir site oluşturulduğunda, gönderi düzeyi kalıcı bağlantılarını yalnızca en üst düzey sitede keser - çoğu kalıcı bağlantı yapılandırmasında, ancak hepsinde değil:

Bu 2 biçim düzgün çalışıyor.

Varsayılan - Beklendiği gibi çalışır

Gün ve İsim - Beklendiği gibi çalışır

... çünkü birincil blogda bir Gün ve Ad kalıcı bağlantı yapısı varsa /%year%/%monthnum%/%day%/%postname%/, yeni bir site oluşturulduğunda, /%year%/%monthnum%/%day%/%postname%/varsayılan olarak bir Gün ve Ad kalıcı bağlantı yapısına da sahiptir. shutdownkanca kuralları .


Kulağa doğru geliyor. Yeni bir site kurmakla ilgili can sıkıcı bir şey, işlem sırasında, ancak zaten tamamlandıktan sonra bağlanamamanızdır. Bu nedenle kurallar iki kez yıkanacaktır.
Anton Timmermans

Ödül zamanı tükendi, bu yüzden burada kılıca düştüğünüz için puan verin. :) Yine de anlamaya çok şey var. :(
Nadir

$wp_rewriteHer bir ağ sitesinde dolaşıp sıfırlayabilmeniz için bağlamını manuel olarak ayarlamak mümkün değil mi? Özel eklentiler üzerinde bazı kalıcı bağlantı sorunları muzdarip büyük bir ağ sitem var. Bir cron ekleyen bir eklenti yapmak, onları her zaman sıfırlar gibi aşırıya kaçmış gibi görünüyor. Onları özel bir URL ile döngüye almak ideal olur, ancak tüm siteler için nasıl yapılacağını bilmiyorum.
Adam Patterson
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.