Child_theme'den önce parent_theme function.php nasıl yüklenir?


12

Alt temamın dosya yüklenmeden functions.phpönce ana temanın dosyasını yüklemek zorunda sorun var functions.php. Bu, kurulum ve başlatma prosedürü için gereklidir. /Wp_core_root/wp-settings.php (adlandırılmış:) içindeki kancalara baktım do_action('setup_theme');.

Sorun i nasıl kancaya bilmiyorum, çünkü ben ilk dosya almak çocuk tema's functions.php, yani hayır add_action( 'setup_theme', 'my_init_function' );işe yarayacak.

Düzenleme:
a) Eklentiler tema daha önce yük biliyorum ve bu nedenle ilk Sorgu bile erişebilir, ancak bir Eklenti güvenmek istemiyorum.
b) wp-settings.php dosyasındaki kod (kısaltılmış)

// happens a lot earlier:  
do_action( 'plugins_loaded' );

// localize stuff happening here
    do_action( 'setup_theme' );

        // Load the functions for the active theme, for both parent and child theme if applicable.
        if ( TEMPLATEPATH !== STYLESHEETPATH && file_exists( STYLESHEETPATH . '/functions.php' ) )
            include( STYLESHEETPATH . '/functions.php' );
        if ( file_exists( TEMPLATEPATH . '/functions.php' ) )
            include( TEMPLATEPATH . '/functions.php' );
    // first available hook, *after* functions.php was loaded
    do_action( 'after_setup_theme' );

İki şeyden kaçınmak istiyorum: Öncelikle kullanıcılara çok fazla açıklama. İkincisi, yanlışlıkla ipi keserek ebeveynlerin init prosedürünü silerek birinin herhangi birisini kırma şansı. İnsanlar herhangi bir şeyi bilmeden kırma riski olmadan işlevler içinde oynarlar. Php.

Başka bir deyişle: Çocuğum temaları function.php dosyasını nasıl temiz tutabilirim, ancak ana temalar önyükleme yapılsın mı?

Herhangi bir fikir? Çok teşekkürler!


Sadece dahil edemez misin?
wyrfel

Sorum şu: nereden? Tema bağlamında yüklenen ilk dosya alt temadır functions.php. wp-settings.phpÇekirdek (satır: 275-279 @wp 3.1 rc) içindeki "molto loko" dosyasına bir göz atın ... şuna benzer:, bu if ( TEMPLATEPATH !== STYLESHEETPATH && file_exists( STYLESHEETPATH . '/functions.php' ) ) include( STYLESHEETPATH . '/functions.php' ); if ( file_exists( TEMPLATEPATH . '/functions.php' ) ) include( TEMPLATEPATH . '/functions.php' );yüzden bir şans göremiyorum ... Ve kullanmak istemiyorum benim tema bootstrap için bir eklenti.
kaiser

Burada tamamen bir şey eksik olabilirim, ancak include(/path/to/parent/themes/functions.php)çocuğunuzun temaları işlevlerinin üstüne eklerseniz . Php, o zaman orada her şey daha önce yüklenir. Değil?
wyrfel

@wyrfel: Q'yu daha açık hale getirmek için güncelledim
kaiser

Anladım, teşekkürler, şimdi çok daha net. Ayrıca bunu sadece tek bir kurulum için yaptığınızı varsaydım.
wyrfel

Yanıtlar:


11

Justin Tadlock kısa bir süre önce (doğru hatırlıyorsam) bu sorunla ilgilenen daha iyi bir function.php dosyası oluşturma hakkında harika bir yazı yazdı
.

Maalesef sitesi şu anda kapalı, bu yüzden şimdilik hafızama güvenmek zorundayım.

after_setup_themeKanca ile doğru yoldasınız .

  1. Hatırladığım kadarıyla hile, filtrelerinizi ve eylemlerinizi işlevine sarmaktır.
    Aşağıdaki örneğe bakın.
  2. Bunu hem üst hem de alt functions.phpdosyalarda yaparsınız .
  3. Sonra bu iki kancanın önceliği ile oynayabilirsiniz.

Biraz kod bin kelimeye bedeldir - ana temanız şu function.phpşekilde görünmelidir:

add_action( 'after_setup_theme', 'your_parent_theme_setup', 9 );
function your_parent_theme_setup() {    
    add_action(admin_init, your_admin_init);
    add_filter(the_content, your_content_filter);
}

function your_admin_init () {
...
}

function your_content_filter() {
...
}

Ehm, yazdığınız için teşekkürler (+1). Etkileyici bir beyniniz var;). Sorun after_setup_themeçok geç, çünkü function.php dosyaları zaten yüklenmişti.
kaiser

DÜZENLEME: Kodunuzu yeniden düşünüp okuduktan sonra "bunu hem üst hem de alt işlevlerde yapın. Hala kullanıcının bu kadar kolay kırılamayacağı daha iyi bir çözüm arıyor, ama mantıklı! Teşekkürler!
kaiser

Burada gerçek bir çözüm yok, bu yüzden bunu işaretleyen ilk kişi olarak bunu işaretleyin.
kaiser

9

İlk olarak, yapamazsınız. Alt temanın fonksiyonları.php her zaman önce yüklenir, nokta.

İkinci olarak, temalar setup_theme öğesine bağlanamaz. Eklentiler yapabilir, ancak bir temanın bağlandığı ilk şey after_setup_theme'dir.

Ebeveyniniz doğru bir şekilde tasarlandıysa, çocuk ebeveynte işlevleri ve şeyleri geçersiz kılabilir, ancak yalnızca ilk yüklendiğinde.

Genel olarak, öncelikle ebeveynin işlevler dosyasını yüklemeniz gerektiğini düşünüyorsanız, muhtemelen bir şekilde yanlış yapıyorsunuzdur. Daha büyük sorunu açıklamanız gerekir.


Cevabınız için teşekkürler. Temalardan önce eklentileri yükleme ihtiyacını anlıyorum ve gerçeği zaten fark ettim (yukarıda okuyun: "Ve temamı önyüklemek için bir eklenti kullanmak istemiyorum."). Benim durumumu detaylandırmak için: Ben tüm çerçeve parçaları yükleme umurumda, dosya gerektiren ve init-sınıfı yükleme ile ana temalar fonksiyonları php başlar bir ini dosyası var. InitClass alt temaları .ini dosyalarından a) ve veri dizisini yüklemeyi önemser ve sonra ex. meta kutuları, özel gönderi türleri, vb.
kaiser

Benim sorunum, tüm bu benim ailem function.php dosyasından başlatmak zorunda, bu yüzden normal bir kullanıcı alt tema içinde oynarken, kıramazsınız. İkinci sorunum, tüm bu sınıfların child theme'nın function.php dosyası içinde mevcut olmaması, bu yüzden hiçbir faydası yok ... ama belki de burada büyük bir düşünme hatası aldım . Nasıl daha iyi hale getireceğiniz konusunda herhangi bir fikir veya öneriniz var mı?
kaiser

3
.... Sanırım sadece bir kullanıcı bir şeyleri bozarsa, bu gerçekten onların problemi olduğunu kabul etmek zorunda kalacaksınız. Alt satır: İlk olarak ana temanın işlevlerini yüklemenin bir yolu yoktur . Php ve alt temayı "temiz" bırakın. Ana temanın function.php dosyası yüklendikten sonra çalıştırmak için alt temada bir şeye ihtiyacınız varsa, after_setup_theme öğesine bağlanan bir işlevin içine koyarsınız. Her iki function.php dosyası yüklendikten sonra çalışır.
Otto

Tamam. Bu büyük bir sorun değil. Bir ihtimal varsa ben sadece interessted'im. Soru: Ne için "tuz değerinde bir çerçeve" init prosedüründen sonra bir kanca var ve sadece after_setup_themekanca kullanmak değil ? Sadece kanca "spam" değil, ya da daha "girişimci" ya da "kool" er olduğu için? Demek istediğim: Temaya özel paralel kancaların arkasındaki "en iyi uygulama" fikri "eklentiler için çekirdek kancalar bırakıyor mu?" (Şu anda bu şekilde idare
ediyorum

"Eğer buna gideceksen, fazladan bir eylemle uğraşma. Sadece after_setup_theme'e bağlan." Tamam. Teşekkürler. +1
kaiser

4

Yani kodu çocuğun işlevlerinden yürütmeye çalışıyorsunuz.php, ancak ana tema yüklendikten sonra. Basit, sadece özel bir işlem kullanın:

Sonunda parent/functions.php:

do_action('parent_loaded');

İçinde child/functions.php:

function parent_loaded() {
    // do init stuff
}
add_action('parent_loaded', 'parent_loaded');

Tuzlarına değecek tüm ana temalar bunu böyle yapar. Dahası, çocuk temasının kullanması için etrafa serpilmiş başka eylemler ve filtreler var.


Mümkün olduğunca çok talimattan kaçınmaya çalışıyorum. Alt tema klasöründeki bir config.php dosyasından geçiş yapmamın ve şimdi ini dosyalarını kullanmamın nedenlerinden biri budur. Bir cümleyle: Eski / çözümümden uzaklaşmaya ve mümkün olduğunca çekirdek ve kodekse geri dönmeye çalışıyorum. Benim sorunum, çocuk temaları tek bir işlevi teslim edemez, çünkü hiçbir sınıf ya da başka bir bootstrap gelen çocuk temaları fonksiyonları.php dosya (özel / çerçeve şablon etiketleri hakkında konuşmak değil) içinde kullanılabilir.
kaiser

Güncellenmiş cevaba bakınız.
scribu

Q'yu da güncelledim. Bu 2/3 cevapları okuduktan sonra aynı kaynağa (tematik, düzenleme önce) işaret ettikten sonra ben dahil sadece "justin tadlock" yöntemi olduğunu hissediyorum olsun, ama emin olmak istiyorum.
kaiser

2
Eğer buna gidecekseniz, fazladan bir eylemle uğraşmayın. After_setup_theme öğesine bağlanmanız yeterlidir.
Otto

0

Neden ana temanın functions.phpdosyasını alt temanın functions.phpdosyasına eklemiyorsunuz, şöyle:

Alt tema functions.phpdosyasında:

if ( TEMPLATEPATH !== STYLESHEETPATH && file_exists( TEMPLATEPATH . '/functions.php' ) )
            include( TEMPLATEPATH . '/functions.php' );

// code of child theme's functions.php file continues here

Bu şekilde, ana temanın functions.phpdosyası değiştirilmez (bazen bu önemlidir).


Q: Daha da iyisi: Herhangi bir function.php dosyasının içinden bir çağrıyı nasıl önleyebilirim? Neden: İnsanlar oradaki şablon dosyalarında olmasını istemedikleri her saçmalık parçalamak için kullanılır. Bu yüzden birinin yanlışlıkla bazı satırları silmesi ihtimali yüksektir. Deneyimlerim: Kimse gerçekten yorumları, benioku veya belgeleri okumuyor.
kaiser

0

Daha önce benzer bir sorunum vardı ve üst öğede fazladan boş bir "child-functions.php" oluşturarak ve çocukta kullanmak istediğim dosyalardan / işlevlerden hemen sonra "function.php" (ebeveyn de) içine alarak düzelttim, çocuk temasında bir "child-functions.php" dosyası oluştururum ve üst fonksiyonların benzetimini yapmaya başlayabileceğim bir dosya var.

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.