web-dev-qa-db-fra.com

Comment charger le fichier parent_theme functions.php avant le paramètre child_theme?

J'ai eu le problème que je devais 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 procédure d'installation et d'initialisation. 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 aucune fonction add_action( 'setup_theme', 'my_init_function' ); ne fonctionnera.

Modifier:
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 veux éviter deux choses: d'abord beaucoup d'explications aux 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 simplement jouer dans le 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 le thème parent soit-il amorcé?

Des idées? Merci beaucoup!

11
kaiser

Justin Tadlock a récemment écrit un excellent article sur créer un meilleur fichier functions.php
où (si je me souviens bien), il traite exactement de cette question.

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 hook after_setup_theme.

  1. Autant que je me souvienne, l'astuce consiste à envelopper vos filtres et vos actions dans sa fonction.
    Voir l'exemple ci-dessous.
  2. Vous faites cela dans les deux parent et enfant functions.php fichiers.
  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() {
...
}
9
Michal Mau

Tout d'abord, vous ne pouvez pas. 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 peuvent, mais la première chose à laquelle un thème peut se connecter est after_setup_theme.

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

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

9
Otto

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 parent qui valent la peine de le faire le font de cette façon. De plus, ils ont plusieurs autres actions et filtres dispersés pour le thème enfant à utiliser.

4
scribu

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 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).

0
Anh Tran

J'avais un problème similaire auparavant et je l'ai résolu en créant un "enfant-functions.php" très vide dans parent et en l'incluant dans "functions.php" (parent aussi) juste après les fichiers/fonctions que je veux utiliser dans enfant, puis dans le thème enfant, je crée un fichier "child-functions.php" et il y a 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.

0
Softmixt