Come caricare parent_theme features.php prima di child_theme?


12

Ho avuto il problema che devo caricare il functions.phpfile del tema del mio genitore prima del functions.phpcaricamento del file del tema del mio bambino . Ciò è necessario per la procedura di installazione e inizializzazione. Ho guardato gli hook all'interno di /wp_core_root/wp-settings.php (chiamato:) do_action('setup_theme');.

Il problema è che non so come collegarmi lì, perché il primo file che ottengo è il tema figlio functions.php, quindi non add_action( 'setup_theme', 'my_init_function' );funzionerà.

Modifica:
a) So che i plugin si caricano prima del tema e quindi possono accedere anche alla Query iniziale, ma non voglio fare affidamento su un Plugin.
b) Ecco il codice (abbreviato) dal file 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' );

Voglio evitare due cose: prima molte spiegazioni agli utenti. In secondo luogo la possibilità che qualcuno rompa qualcosa se taglia la corda eliminando accidentalmente la procedura di avvio dei genitori. Le persone devono semplicemente giocare all'interno di Functions.php senza rischiare di rompere qualcosa senza saperlo.

In altre parole: come posso mantenere pulito il mio file Functions.php di temi per bambini, ma ho fatto il bootstrap dei temi principali?

Qualche idea? Molte grazie!


Non puoi semplicemente includerlo?
Wyrfel,

La mia domanda è: da dove? Il primo file che viene caricato nel contesto del tema è quello del tema figlio functions.php. Dai un'occhiata al wp-settings.phpfile "molto loko" nel core (riga: 275-279 @wp 3.1 rc) ... assomiglia a questo:, if ( TEMPLATEPATH !== STYLESHEETPATH && file_exists( STYLESHEETPATH . '/functions.php' ) ) include( STYLESHEETPATH . '/functions.php' ); if ( file_exists( TEMPLATEPATH . '/functions.php' ) ) include( TEMPLATEPATH . '/functions.php' );quindi non vedo alcuna possibilità ... E non voglio usare un plugin per avviare il mio tema.
Kaiser,

Potrei essermi perso completamente qualcosa qui, ma se inserisci include(/path/to/parent/themes/functions.php)nella parte superiore delle funzioni.php dei temi di tuo figlio, allora tutto viene caricato prima. Non?
Wyrfel,

@wyrfel: ho aggiornato la Q per renderlo più chiaro
kaiser

Vedo, grazie, ora è molto più chiaro. Inoltre ho pensato che lo stavi facendo solo per una singola installazione.
Wyrfel,

Risposte:


11

Justin Tadlock ha recentemente scritto un ottimo post su come creare un file funzioni.php migliore in
cui (se ricordo bene) si occupa di questo problema esatto.

Purtroppo il suo sito non è attivo al momento, quindi per ora devo fare affidamento sulla mia memoria.

Sei sulla strada giusta con il after_setup_themegancio.

  1. Per quanto ricordo il trucco è avvolgere i filtri e le azioni nella sua funzione.
    Vedi esempio sotto.
  2. Lo fai in file sia padre che figlio functions.php.
  3. Quindi puoi giocare con la priorità di questi due ganci.

Un po 'di codice che vale più di mille parole: il tema del tuo genitore function.phpdovrebbe apparire così:

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, grazie per la scrittura (+1). Hai un cervello impressionante;). Il problema è che after_setup_themeè troppo tardi, perché i file Functions.php erano già stati caricati.
Kaiser

EDIT: Dopo aver ripensato il tuo codice e aver letto "fallo in entrambe le funzioni genitore e figlio.php" e "gioca con la priorità" inizia a dare un senso. Sei ancora alla ricerca di una soluzione migliore che l'utente non possa rompere così facilmente, ma ha senso! Grazie!
Kaiser

Nessuna vera soluzione qui, quindi spunta questo, poiché sei stato il primo a proporlo.
Kaiser

9

Innanzitutto, non puoi. Le funzioni.php del tema figlio vengono sempre caricate per prime, punto.

In secondo luogo, i temi non possono essere agganciati a setup_theme. I plugin possono farlo, ma la prima cosa a cui un tema può agganciarsi è after_setup_theme.

Se il tuo genitore è progettato correttamente, il figlio è in grado di sovrascrivere funzioni e cose nel genitore, ma solo quando viene caricato per primo.

In generale, se pensi di dover prima caricare il file delle funzioni del genitore, probabilmente stai sbagliando, in qualche modo. Devi spiegare il problema più grande.


Grazie per la tua risposta. Comprendo la necessità di caricare plugin prima dei temi e ho già capito il fatto (leggi sopra: "E non voglio usare un plugin per avviare il mio tema"). Per elaborare il mio caso: ho ottenuto un file ini che si preoccupa di caricare tutte le mie parti del framework, che inizia in temi padre funzioni php con la richiesta del file e il caricamento della classe init. InitClass si preoccupa del caricamento di a) e della matrice di dati dai file .ini-file di temi figlio, quindi li inserisce in classi diverse per ulteriori elaborazioni ex. meta box, tipi di post personalizzati, ecc.
kaiser,

Il mio problema è che devo iniziare tutto questo dal file di funzione.php dei miei genitori, quindi un utente normale non può romperlo, quando gioca all'interno del tema figlio. Il mio secondo problema è che tutte quelle classi non sono disponibili all'interno del file Functions.php del tema figlio, quindi non sono utili ... ma forse ho avuto un grosso errore di pensiero proprio qui. Qualche idea o suggerimento su come migliorarlo?
Kaiser,

3
.... Penso che dovrai solo accettare il fatto che se un utente rompe le cose, questo è davvero il loro problema. In conclusione: non c'è modo di caricare prima le funzioni.php del tema principale e lasciare il tema secondario "pulito". Se hai bisogno di qualcosa nel tema figlio da eseguire dopo che il file Functions.php del tema principale è stato caricato, allora lo metti all'interno di una funzione agganciata a after_setup_theme. Ciò viene eseguito dopo il caricamento di entrambi i file Functions.php.
Otto,

Ok. Non è un grosso problema. Sono solo interessato se c'è una possibilità. Domanda: a che serve un "framework degno di essere salato" quindi ha un hook dopo la procedura init e non usa semplicemente l' after_setup_themehook? Solo per non "spam" il gancio, o perché è più "enterprisy" o "kool" ehm? Voglio dire: l'idea di "best practice" dietro gli hook paralleli specifici del tema "lascia hook di core per i plugin"? (Ecco come lo gestisco attualmente.)
Kaiser

"Se hai intenzione di farlo, non preoccuparti di un'azione aggiuntiva. Basta agganciarsi a after_setup_theme." Ok. Grazie. +1
kaiser

4

Quindi stai provando ad eseguire il codice da features.php del bambino, ma dopo che il tema principale è stato caricato. Semplice, basta usare un'azione personalizzata:

Alla fine di parent/functions.php:

do_action('parent_loaded');

In child/functions.php:

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

Tutti i temi dei genitori che meritano il loro sale lo fanno in questo modo. Inoltre, hanno diverse altre azioni e filtri sparsi per il tema secondario da utilizzare.


Cerco di evitare quante più istruzioni possibili. Questo è uno dei motivi per cui sono passato da un file config.php nella cartella del tema figlio e ora uso invece i file ini. In una frase: cerco di allontanarmi dalla mia vecchia / tua soluzione e di avvicinarmi il più possibile al core e al codice. Il mio problema è che non riesco a fornire una singola funzione dal tema figlio, perché nessuna classe o altro dal mio bootstrap è disponibile all'interno del file Functions.php dei temi figlio (non parlando di tag modello personalizzati / framework).
Kaiser,

Vedi la risposta aggiornata.
scribu,

Ho aggiornato anche la Q. Dopo aver letto che 2/3 risposte mi indicano la stessa fonte (tematica, prima della tua modifica) ho la sensazione che ci sia solo il metodo "justin tadlock" di includere, ma voglio esserne sicuro.
Kaiser,

2
Se hai intenzione di farlo, non preoccuparti di un'azione aggiuntiva. Basta agganciarsi a after_setup_theme.
Otto,

0

Perché non includere il functions.phpfile del tema principale nel file del tema functions.phpsecondario, in questo modo:

Nel functions.phpfile del tema figlio :

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

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

In questo modo, il functions.phpfile del tema principale non viene modificato (a volte è importante).


come accennato nel Q: "In altre parole: come posso mantenere pulito il file Functions.php dei temi di mio figlio, ma ho fatto il bootstrap dei temi principali?" Ancora meglio: come evitare una chiamata dall'interno di qualsiasi file Functions.php? Perché: le persone sono abituate a distruggere ogni schifezza che non vogliono avere nei file modello lì dentro. Quindi c'è un'alta probabilità che qualcuno elimini accidentalmente alcune righe. La mia esperienza: nessuno legge davvero commenti, file Leggimi o documentazione.
Kaiser

0

Ho avuto un problema simile prima e lo risolvo creando un "child-Functions.php" extra vuoto in parent e includendolo in "funzioni.php" (anche parent) subito dopo i file / funzioni che voglio usare in child, poi nel tema figlio creo un file "child-Functions.php" e qui è dove posso iniziare a simulare funzioni figlio.php eseguite dopo che parent non è una soluzione elegante ma ha fatto il lavoro.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.