Mam problem z załadowaniem functions.php
pliku motywu nadrzędnego przed załadowaniem pliku motywu podrzędnego functions.php
. Jest to potrzebne do procedury konfiguracji i inicjowania. Spojrzałem na haki w katalogu /wp_core_root/wp-settings.php (o nazwie:) do_action('setup_theme');
.
Problem polega na tym, że nie wiem, jak się tam podłączyć, ponieważ pierwszy plik, który otrzymuję, to motyw podrzędny functions.php
, więc żadne nie add_action( 'setup_theme', 'my_init_function' );
będzie działać.
Edycja:
a) Wiem, że wtyczki ładują się wcześniej niż motyw i dlatego mogą uzyskać dostęp nawet do początkowego zapytania, ale nie chcę polegać na wtyczce.
b) Oto kod (skrócony) z pliku wp-settings.php
// 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' );
Chcę uniknąć dwóch rzeczy: Najpierw wiele wyjaśnień dla użytkowników. Po drugie szansa, że ktoś coś zepsuje, jeśli przecina linę, przypadkowo usuwając procedurę inicjacyjną rodziców. Ludzie powinni po prostu bawić się funkcjami.php, nie ryzykując, że coś zepsują, nie wiedząc o tym.
Innymi słowy: w jaki sposób mogę utrzymać czystość mojego pliku motywów potomnych functions.php, ale wykonać bootstrap motywów nadrzędnych?
Jakieś pomysły? Wielkie dzięki!
functions.php
. Spójrz nawp-settings.php
plik „molto loko” w jądrze (linia: 275-279 @wp 3.1 rc) ... wygląda tak:if ( TEMPLATEPATH !== STYLESHEETPATH && file_exists( STYLESHEETPATH . '/functions.php' ) ) include( STYLESHEETPATH . '/functions.php' ); if ( file_exists( TEMPLATEPATH . '/functions.php' ) ) include( TEMPLATEPATH . '/functions.php' );
więc nie widzę szansy ... I nie chcę używać wtyczka do ładowania mojego motywu.include(/path/to/parent/themes/functions.php)
na górze swoich motywów potomnych functions.php, wtedy wszystko tam jest ładowane wcześniej. Nie?Odpowiedzi:
Justin Tadlock napisał ostatnio świetny post na temat tworzenia lepszego pliku functions.php
którym (o ile dobrze pamiętam) zajmuje się dokładnie tym problemem.
Niestety jego strona jest obecnie niedostępna, więc na razie muszę polegać na mojej pamięci.
Jesteś na dobrej drodze z
after_setup_theme
hakiem.Zobacz przykład poniżej.
functions.php
plikach nadrzędnych, jak i podrzędnych .Trochę kodu wartego tysiąca słów - Twój motyw nadrzędny
function.php
powinien wyglądać tak:źródło
after_setup_theme
jest już za późno, ponieważ pliki functions.php zostały już załadowane.Po pierwsze nie możesz. Funkcje motywu podrzędnego. Php zawsze ładuje się najpierw, kropka.
Po drugie, motywy nie mogą podpiąć się do setup_theme. Wtyczki mogą, ale pierwszą rzeczą, do której może się przyczepić motyw, jest after_setup_theme.
Jeśli rodzic jest poprawnie zaprojektowany, dziecko może nadpisywać funkcje i elementy w rodzicu, ale tylko wtedy, gdy zostanie załadowane jako pierwsze.
Mówiąc ogólnie, jeśli uważasz, że musisz najpierw załadować plik funkcji rodzica, prawdopodobnie robisz to źle. Musisz wyjaśnić większy problem.
źródło
after_setup_theme
haka? Żeby nie „spamować” haka, czy dlatego, że jest bardziej „enterprisy” lub „kool”, er? Mam na myśli: Czy idea „najlepszych praktyk” kryjąca się za hakami równoległymi dla poszczególnych tematów „pozostawia haki rdzenia dla wtyczek”? (Tak sobie obecniePróbujesz więc wykonać kod z funkcji potomnych.php, ale po załadowaniu motywu nadrzędnego. Proste, wystarczy użyć niestandardowej akcji:
Na końcu
parent/functions.php
:W
child/functions.php
:Wszystkie motywy nadrzędne warte swojej soli robią to w ten sposób. Co więcej, mają kilka innych akcji i filtrów rozsianych wokół motywu potomnego.
źródło
Dlaczego nie dołączasz
functions.php
pliku motywu nadrzędnego do pliku motywu podrzędnegofunctions.php
, tak jak to:W
functions.php
pliku motywu podrzędnego :W ten sposób
functions.php
plik motywu nadrzędnego nie jest zmieniany (czasami jest to ważne).źródło
Miałem wcześniej podobny problem i naprawiłem go, tworząc dodatkowy pusty „child-functions.php” w rodzicu i włączając do „functions.php” (także rodzic) zaraz po plikach / funkcjach, których chcę używać w potomku, następnie w motywie potomnym tworzę plik „child-functions.php” i tam mogę rozpocząć symulację funkcji potomnych. php uruchamiany po rodzicu nie jest eleganckim rozwiązaniem, ale zadziałał.
źródło