Bir mu-plugins eklentisinde özel yazı tipi için flush_rewrite_rules yapmanın en iyi yolu mu?


9

Özel bir yazı türünü (diğer şeylerin yanı sıra) başlatan bir eklenti yazıyorum. Çok siteli bir eklentidir ve mu-eklentileri dizininde yaşar .

Bu durumda flush_rewrite_rules () yöntemini işlemek için en iyi uygulama hangisidir ? 'Normal' bir eklenti için bunu bir aktivasyon kancasında yaparsınız - bu kancalar mevcut olmadığından mutlaka kullanılması gereken bir eklenti için mümkün olmayacaktır.

Bunun, özel gönderi türünü kaydettikten sonra "bir kerelik" bir etkinlik olması gerektiğinden, sınıfımda CPT'yi kaydeden böyle bir şey yapmak mantıklı olur mu?

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

Yani, CPT kaydı her 'init' eyleminde gerçekleşir - ancak bu hakkım varsa, yeniden yazma kurallarının temizlenmesi yalnızca bir kez gerçekleşir. Hiç .

Ben doğru yolda mıyım?

Sadece değiştirdim; CPT'm 404 bulunamadı hatası veriyor, bu nedenle yeniden yazma kuralları çalışmıyor :-(

(değiştir # 2): Bu soruda gösterildiği gibi genel değişkene erişmek için çözümü denedim: Çoklu sitede yeniden yazma kurallarını güvenilir bir şekilde nasıl temizleyebilirim? - Bunu göstermek için yukarıdaki kod örneğimi güncelleyeceğim. Ne yazık ki hala bir CPT yüklemeye çalışırken 404 hatası alıyorum. Yeniden yazma kurallarının veritabanında saklandığını görüyorum, sadece kullanılmıyor gibi görünüyor. Kayboldum.



Bunu yapmanın uygun bir yolu yok. Bu , bu yorumu yazarken en iyisidir.
Pieter Goosen

@PieterGoosen - teşekkürler, daha önce gördüm ve diğer çözümü düşünmek için sorumu güncelledim. Hala çalışmıyor. Diğer cevabı görmeden önce flush_rewrite_rules () yürüterek bir şey kırdı acaba? Belki de doğru prosedürü doğru bir şekilde test etmek için test sitemi silmeli ve yeniden kurmalıyım?
CC

Bu mümkün olabilir. Floş yeniden yazma kurallarını çok sitede yanlış çalıştırmak ağınızdaki tüm yeniden yazma kurallarını bozabilir. Eğer senin neredeysem, yeni başlıyorum. Sadece umut bu bir yerel yükleme sonu değil canlı bir site ;-)
Pieter Goosen

doğru ... Bunu deneyeceğim. Ve hayır, bu bir test sitesi ve ben DB silmek ve şimdiye kadar benim uyku ağ yapılandırmasını yeniden ayarlayabilirsiniz düşünüyorum! :-)
CC

Yanıtlar:


2

flush_rewrite_rulesFonksiyon kanca dayalı bir tema veya bir eklenti gibi bazı bağlamlarda güvenilirdir ama emin o a için çalışıyorsa değilimmu-plugin

İfadem WordPress'in bu şekilde başlatılmasına dayanıyor:

  • çağrı wp-settings.phpdosyası
  • do_action( 'muplugins_loaded' );kanca çağırın , burada eklentiniz başlatıldı
  • $GLOBALS['wp_rewrite'] = new WP_Rewrite();burada arayın yöntem flush_rulesbaşlatılır ve şu andan itibaren kullanılabilir
  • do_action( 'setup_theme' );denir ve bahse girerim tüm paramı bu kancada flush_rewrite_rulesişe yarayacak

Çözüm?

Şahsen, rewrite_rules seçeneğinin silinmesini güvenilir buluyorum.

delete_option('rewrite_rules');

veya

update_option('rewrite_rules', '' );

WordPress ne zaman eksik olursa rewrite_rulesonları geri getirecektir, bu da flush_rulesyöntemin yaptığıdır.

WordPress yürütme akışında bunun gibi işlevlerin bulunmadığı noktalar vardır. WordPress'in çekirdeğinde bile bu ifadeyi buldum

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

Tek sorun performans olurdu, her istekte bunu yapmayın çünkü onları geri oluşturmak zor bir süreçtir. Gördüğüm gibi sadece ilk çağrıda onları yıkamak istiyorsun ve bu iyi bir şey.

PS: Ben böyle bir tanıtım hayranı değilim ama bu kadar uzun zaman önce bir makale de yazdım ve bence hala bunun için ayağa kalkıyor


1

MU-Eklentileri her zaman etkin kabul edilir, bu nedenle register_activation_hookve register_deactivation_hookkancaları asla çağrılmaz.

Bunun yerine, yeniden yazma kurallarını etkileyen herhangi bir değişiklik yapıldığında güncellenmesi gereken bir eklenti sürümü ekleyin:

namespace My\Namespace;

define( 'MY_CPTS_REWRITES', '2020-05-19.1' );

function maybe_flush_rewrite_rules() {
    if ( update_option('MY_CPTS_REWRITES', MY_CPTS_REWRITES) ) {
        flush_rewrite_rules(false);
    }
}

add_action( 'init', __NAMESPACE__ . '\\maybe_flush_rewrite_rules', 11 );

Kanca önceliği, yazı tipi kaydedildikten sonra çalıştırıldığından emin olmak için 11 olarak ayarlanmıştır (varsayılan öncelik 10 kullanıldığında).

update_option()Bir test get_option()ile bir update_option()çağrı arasında değerin başka bir talepte değiştirildiği ve sonsuz boşluğa neden olduğu yüksek trafikli sitelerde bulunan bir yarış koşulundan kaçındığımızı test ediyoruz . update_option()seçeneğin eski değeri için bir kontrol içerir ve yalnızca seçenek değiştirilirse true değerini döndürür.

Bu çalışmayı test etmek için özel yazı türünün yeniden yazma sümüğünü başka bir şeye güncelleyin, ardından ön uçtaki öğelerden birini görüntüleyin ve güncellenen sümük içermelidir. Sürüm numarasını güncellemeden güncellenirse, araştırılması gereken kalıcı bağlantıları başka bir şey güncellemektedir.


0

Mu-eklentinizin seçenekleri varsa, güncellemeden hemen sonra floşu koyacağım:

update_option( 'my_options', $values );
// Flush rules after install
flush_rewrite_rules();
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.