Comment charger parent_theme functions.php avant child_theme?

11

J'ai eu le problème suivant: je dois charger le fichier functions.php de mon thème parent avant le chargement du fichier functions.php de mon thème enfant. Ceci est nécessaire pour la configuration et l’amplification. procédure init. J'ai regardé les crochets à l'intérieur de /wp_core_root/wp-settings.php (nommé: do_action('setup_theme'); ).

Le problème est que je ne sais pas comment m'y accrocher, car le premier fichier que je reçois est le functions.php du thème enfant, donc aucun add_action( 'setup_theme', 'my_init_function' ); ne fonctionnera.

Éditer:
a) Je sais que les plugins se chargent avant le thème et peuvent par conséquent accéder même à la requête initiale, mais je ne veux pas compter sur un plugin.
b) Voici le code (abrégé) du fichier 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' );

Je souhaite éviter deux choses: d’abord beaucoup d’explications pour les utilisateurs. Deuxièmement, il y a un risque que quelqu'un casse quelque chose s'il coupe la corde et efface accidentellement la procédure parent init. Les gens doivent juste jouer dans les functions.php sans risquer de casser quelque chose sans le savoir.

En d'autres termes: comment garder mon fichier functions.php de thèmes enfants propre, mais que les thèmes parents soient amorcés?

Des idées? Merci beaucoup!

    
posée kaiser 21.02.2011 - 20:02

5 réponses

9

Justin Tadlock a récemment écrit un excellent article sur la création d'un meilleur fichier functions.php


où (si je me souviens bien), il traite de cette question exacte.

Malheureusement, son site est en panne pour le moment, je dois donc compter sur ma mémoire pour le moment.

Vous êtes sur la bonne voie avec le after_setup_theme hook.

  1. Autant que je me souvienne, l'astuce consiste à envelopper vos filtres et vos actions dans sa fonction.
    Voir exemple ci-dessous.
  2. Vous le faites dans les deux fichiers parent et enfant functions.php .
  3. Ensuite, vous pouvez jouer avec la priorité de ces deux crochets.

Un peu de code vaut mille mots - le function.php de votre thème parent devrait ressembler à ceci:

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() {
...
}
    
réponse donnée Michal Mau 21.02.2011 - 22:24
9

Tout d'abord, vous ne pouvez pas. Le functions.php du thème enfant se charge toujours en premier, point.

Deuxièmement, les thèmes ne peuvent pas se connecter à setup_theme. Les plugins le peuvent, mais la première chose à laquelle un thème peut s’attacher est after_setup_theme.

Si votre parent est conçu correctement, l'enfant est capable de remplacer des fonctions et des éléments de ce dernier, mais uniquement lors du chargement initial.

En gros, si vous pensez que vous devez d'abord charger le fichier de fonctions du parent, vous le faites probablement mal, d'une manière ou d'une autre. Vous devez expliquer le problème plus vaste.

    
réponse donnée Otto 21.02.2011 - 21:30
4

Vous essayez donc d'exécuter du code à partir du fichier functions.php de l'enfant, mais après le chargement du thème parent. Simple, utilisez simplement une action personnalisée:

À la fin de parent/functions.php :

do_action('parent_loaded');

Dans child/functions.php :

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

Tous les thèmes parents qui valent la peine d’être salués le font de cette façon. De plus, ils disposent de plusieurs autres actions et filtres pour le thème enfant.

    
réponse donnée scribu 22.02.2011 - 00:52
0

Pourquoi n'incluez-vous pas le fichier functions.php du thème parent dans le fichier functions.php du thème enfant, comme ceci:

Dans le fichier functions.php du thème de l'enfant:

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

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

De cette manière, le fichier functions.php du thème parent n'est pas modifié (cela est parfois important).

    
réponse donnée Anh Tran 22.02.2011 - 06:40
0

J'avais un problème similaire auparavant et je l'ai résolu en créant un "child-functions.php" extra vide dans parent et en l'incluant dans "functions.php" (parent aussi) juste après les fichiers / fonctions que je veux utiliser. dans child, puis dans child theme, je crée un fichier "child-functions.php" et il existe un point de départ pour simuler un enfant functions.php exécuté après le parent n'est pas une solution élégante, mais le travail a été fait.

    
réponse donnée Softmixt 07.04.2017 - 12:50

Lire d'autres questions sur les étiquettes