Bir Eklenti Kapsamında Yeniden Yazma Kurallarını Nerede, Ne Zaman ve Nasıl Düzgün Yıkayın?


10

Yeniden yazma kuralları düzgün kızarma ile garip bir sorun yaşıyorum.

Ben kullanarak denedi flush_rewrite_rules();ve flush_rewrite_rules(true);.

Ayrıca $wp_rewritekullanarak küreselleşmeyi denedim $wp_rewrite->flush_rules();ve$wp_rewrite->flush_rules(true);

Her ikisi de yeniden yazma kurallarını doğru bir şekilde temizlemiyor gibi görünüyor. Bu çağrılar gerçekten çağrıldığında yeniden yazma kurallarını temizliyor. Bunu nasıl bilebilirim? Yeniden yazma kuralı yıkama hata ayıklama çözümünü kullanma .

Şu anda, eklenti etkinleştirme ve eklenti devre dışı bırakma üzerinde yeniden yazma kuralları var. Orada sorun yok.

Kullanıcıların eklentiyi yapılandırması için bir eklenti yönetim ayarları sayfam var. Ayarlardan bazıları kalıcı bağlantı yapısını ayarlar, bu nedenle yeniden yazma kurallarının eklenti yönetimi ayarları sayfasında "Ayarları Kaydet" bölümünde temizlenmesi gerekir. update_option();Ayarları kaydetmek için (standardı kullanır ).

Belirtilen ayarlara bağlı olarak, kullanıcı tarafından belirlenen ayarlarla eşleştirmek için özel yazı türlerinin oluşturulduğunu belirtmek isterim. Bu yüzden yeniden yazma kuralları, ayarlar kaydedildikten hemen sonra temizlenmelidir. Burada işler düzgün çalışmıyor.

Sağlanan yeniden yazma kurallarının hata ayıklaması için yukarıdaki bağlantı çözümü, @toschotonlarca yeniden yazma kuralını temizlediğini gösteriyor. Bununla birlikte, özel yazı tipi tekil öğeyi veya hatta bu konu için özel yazı tipi arşivini ziyaret ederken, her biri 404 hatası olarak döner.

Özel gönderi türü doğru ve uygun şekilde kaydedildi. Sorun olmadığını kesin olarak biliyorum.

Eklenti yönetim sayfası ayarları ile hemen takip edin. Özel yazı türleri oluşturulur, kalıcı bağlantı yapısı ayarlanır ve tüm yeniden yazma kuralları temizlenmeye çalışılır.

Ardından özel yazı tipleri her zaman yüklenir ve initnormal gibi yüklenir .

Bazı nedenlerden dolayı, yeniden yazma kuralları düzgün bir şekilde temizlenmiyor, çünkü daha önce de söylediğim gibi, özel yazı türünün tekil veya arşiv bölümlerini ziyaret etmek 404 hataları döndürüyor.

Şimdi garip kısmı, tüm yaptığım şey yönetim izni ayarları sayfasını ziyaret etmek ve ardından özel yazı türünün tekil veya arşiv bölümlerini görüntülemek için ön uca geri dönmekse, beklendiği gibi büyülü çalışırlar.

Bu yönetim kalıcı ayarları ayarları sayfasında, yeniden yazma kurallarının uygun şekilde temizlenmesini ve benimkinin yapmamasını sağlayan yapmıyorum?

Yani, geçici bir çözüm olarak, eklenti yönetim ayarları sayfasını kaydettikten sonra kullanıcıyı yönetim kalıcı ayarları ayarları sayfasına yönlendiriyorum, ancak bu ideal bir çözüm değil. Yeniden yazma kurallarını eklentimin kodunda düzgün bir şekilde temizlemeyi tercih ederim.

WordPress'te yeniden yazma kurallarını temizlemenin artık TÜM kuralları yıkamadığı belirli bir nokta var mı?

admin_menu - Eklenti ayarları sayfası WordPress yönetimine eklendi.

add_options_page() - Eklenti ayarları sayfası Ayarlar menüsüne eklenir.

Ayarlar sayfası için geri aramada oluşturulur add_options_page(). Bu, $_POSTeklenti ayarlarını güncellemek ve yeniden yazma kurallarını temizlemek için de işlendiği yerdir .

Bu zaten uzun bir soru olduğundan, geçerli bir yanıt üretmeye yardımcı olmak için bir off-link link (eğer yardımcı olur) kod blokları sağlamak için istekli olacaktır.


1
belki de yanlış şeylerin sırasına sahipsiniz, bazı kodları görmeden söylemek zor. kalıcı bağlantılar yönetici sayfası sadece çağırır flush_rewrite_rules, yalnızca rewrite_rulesseçeneği siler ve yeniden oluşturur, dosyayı açabilir wp-admin/options-permalinks.phpve bunun nerede olduğunu görebilirsiniz. Bu işlem tüm seçeneği sildiğinden, kuralları kısmen yıkamak mümkün değildir.
Milo

@Milo bence haklısın. initHangi yazı türleri kaydeder yüklü bir sınıf var . Sayfa ayarlarının kaydedildiğini ve sayfanın yeniden yükleneceğini düşündüm ... sonra initgerekli yazı türlerini kaydetmek için kancayı tekrar ateşledim . Bu yüzden yazı türlerinin zaten yükleneceğini düşündüm ve tek yapmam gereken seçeneği güncellemek, ardından eklenti ayarları sayfamdan yeniden yazma kurallarını temizlemekti. Bir çözümü nasıl bulduğuma dair bir cevap göndereceğim.
Michael Ecklund

Eklentimdeki bir uyarı flush_rewrite_rules () benim için sorunun bir parçası oldu. Ben php kanca sildi ve sadece el ile permalinks güncelleme sona erdi ve benim CPT 404 hataları kayboldu.
myol

Yanıtlar:


5

Yeniden yazma kurallarını temizlemek için en iyi yer eklentinin etkinleştirilmesi / devre dışı bırakılmasıdır.

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' );

Kodeks makalesine bakın

Özür dilerim, sorunuzu tamamen çözemedim, bu yüzden bir çerez kesici yanıtı.


1
Önerin için teşekkürler, ama bunun farkındayım. Sorun, eklentinin etkinleştirilmesi / eklentinin devre dışı bırakılmasıyla ilgili değildir. Kullanıcıların, ayarları yeniden etkinleştirme kurallarını ayarlayan ve böylece bir temizleme gerektiren zaten aktif eklentiye değiştirmesiyle ilgilidir.
Michael Ecklund

1
Bunun olabileceğini düşündüm, ama sorunuzu okurken oldukça yorgundum. ialocin'in çözümü umut verici görünüyor, umarım çözmüşsünüzdür.
helgatheviking

4

Kodunuzu görmeden neyin yanlış olduğunu söylemek zor. Ancak bazı ayarları kaydettikten sonra admin_init, yeniden yazma kurallarınızı temizlemek için aşağıda gösterildiği gibi takmak pratiktir .

Kod:

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);
    }
}


Seçeneği, ayarlar sayfanızda bazı yerlerde ayarlamanız veya ayarları kaydetme işleminde tam olarak nerede olmanız gerekir. Opsiyon olmadan yapmak kötüdür, çünkü her seferinde kuralları yıkamak istemezsiniz.


Not: denenmemiş


2
Veya bir geçici süre kullanabilir misiniz? Ancak her admin_init'teki kuralları temizlemediği için + 1'leyin.
helgatheviking

Elbette geçici olarak haklısınız, sanırım *_option()ayarlar sayfası nedeniyle seçtim. @helgatheviking
Nicolai

Bu çok yardımcı oldu. Michael ile benzer bir durum yaşadım. Bir geçici kullanım hakkında helga'nın önerisini dahil ettim ve ayarları için doğrulama işlevine ayarladım. Yıkamadan sonra geçici olarak yanlış ayarlamaya gerek kaldım veya geçici olarak süresi dolana kadar her yönetici sayfası yükünde yıkamaya devam ettim. Yani işlevsel olarak bir seçenek veya geçici bir kullanım aynı idi. Geçici seçenekler tablo biraz daha temiz tutmak için güzel olabilir sanırım. Ama küçük bir nokta.
MatthewLee

Fark, özellikle de geçici durumlar kalıcı, süresi dolmamışsa, ancak tabii ki geçici durumlar başka özelliklere sahipse, faydaları güzelse, küçüktür. @MatthewLee
Nicolai

3

Eklentinin seçenek ayarlarını okumaktan ve kullanıcı tarafından belirlenen ayarlara göre gerekli özel yazı türlerini oluşturmaktan sorumlu olan bir yazı türleri sınıf dosyası vardı.

Bu yazı türleri sınıf dosyası kancaya yüklendi init.

Yapmam gereken tek şeyin eklenti ayarlarını güncellemek olduğunu düşündüm, sonra yeniden yazma kurallarını yıkayın. Yazı türleri sınıfı eklenti ayarlarına göre zaten yüklendiğinden. Ancak yönetim sayfalarında, initkancadan SONRA yüklenir .

Ayarlar henüz gerçekte ayarlanmadığından gönderi türleri hiçbir zaman gerçekte kaydedilmedi. Posta türleri kayıt sınıfı, hiçbir posta türü kaydedilmeden erken sona erdi.

Çözüm şuydu:

  1. Eklenti ayarlarını güncelleyin.
  2. Yeni yeniden yazma kurallarının oluşturulması için, yazı türleri sınıf dosyasını SADECE bir kez buraya yükleyin.
  3. Yeniden yazma kurallarını yıkayın.

(Önceden ... adım2 eksikti - Yukarıda belirtildiği gibi ...)

Şu andan itibaren, yazı türleri initkancaya yüklenecek ve ayarların önceden belirlenmiş olacak ve böylece yazı türlerinin uygun yeniden yazma kurallarıyla oluşturulmasına ve eşleştirilmesine izin verilecektir.

Her ne sebeple olursa olsun, yukarıdaki üç adımı uyguladıktan sonra geçerli sayfaya yönlendirmek için bir JavaScript çağrısı eklemek zorunda kaldım.

Ayrıca flush_rewrite_rules();eklentinin yönetim ayarları sayfasına bir çağrı eklemek zorunda kaldım .

Bu yüzden her şeyin yıkıldığından emin olmak için ...

Adım 1) Eklentinin yönetim ayarları sayfasına gidin. - İlk yıkama.

Adım 2) Eklenti ayarlarını güncelleyin. - İkinci sifon.

Adım 3) Sayfa eklentinin ayarlar sayfasına yönlendirir. Neden ... Üçüncü ve son sifon (ilk sifonla aynı - Eklentinin ayarlar sayfası ziyaret edildiğinde otomatik olarak yapılır)

Bunun pratik bir çözüm olduğunu söylemiyorum, ama benim için çalıştı. Çok garip bir konu ve büyük olasılıkla kodlama altyapımla ilgili.


1

@ tazo-todua multisite kullanırken bu da benim için çalıştı.

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();
}

0

Bulduğum ÇÖZÜM:

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

0

Aynı problemi yaşıyordum. Eklentimde, dinamik olarak oluşturulan yayın türlerim var. Bu nedenle register_post_type(), sırasında statik bir yöntemle kaydedilemezler activation_hookve bu nedenle flush_rewrite_rules()bu kanca sırasında çalıştırıldığında henüz aktif değildirler (normalde yeniden yazma kurallarını yıkamanın önerilen yolu budur ).

Sonunda karşılaşabileceğim en temiz çözüm, yazı tiplerinin kaydedilmesinden sonra yeniden yazma kurallarını yıkamaktı, ancak elbette sadece böyle bir yıkama gerçekten gerekliyse (işlem yavaş olduğu için). Benim durumumda aslında tek bir temel sınıftan miras birkaç özel yazı türleri var ve bu yüzden orada yıkama yapan kodu uygulamak arzu edildi.

Kızarmanın gerekli olup olmadığına aşağıdakilerin çıktısına bakarak karar verilebilir 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);
}
}

Dezavantajları:

  • WP'nin tam olarak yeniden yazma kurallarının oluşturduğu bir dereceye kadar güvenir register_post_type().
  • Her sayfa yüklemesi sırasında yıkama gerekip gerekmediğini kontrol etmek de ek yük oluşturur.

Avantajları:

  • Gönderi türünü temsil eden sınıfta tamamen kapsüllenmiştir.
  • Yeniden yazma kurallarını yalnızca gerçekten gerekliyse temizler.

Bunu yalnızca yazı türünüzü hem hem initde activation_hook!

Görünüş sırasında oluşturulan yeniden yazma kurallarının nasıl bağlı register_post_type()olduğuna bağlı olarak, test if(strpos($key, $args['rewrite']['slug'] ) === 0)daha ayrıntılı bir şeyle, yani normal bir ifadeyle değiştirilerek azaltılabilir .

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.