web-dev-qa-db-fra.com

Charger les fichiers de thème avant le thème enfant functions.php

Je crée un cadre de thème à utiliser dans les futurs thèmes wordpress que je développe. Je voudrais inclure des fichiers dépendants tels que des classes dans le thème parent avant que le thème enfant functions.php ne soit chargé. De cette façon, le thème enfant n'a pas besoin d'inclure les classes.

Je vais essayer de montrer un exemple:

thème-parent - fichier.php:

require_once get_template_directory().'/classes/Core.php';
require_once get_template_directory().'/classes/Core_View.php';
$CoreView = new Core_View();
$CoreView->init();

thème enfant - functions.php:

require_once get_template_directory().'/classes/ContentSidebarView.php';
$ContentSidebarView = new ContentSidebarView();
$ContentSidebarView->init();

Fichier de classe ContentSidebarView:

Class ContentSidebarView extends Core_View{

    public function init(){
        // Do Something
    }

}

Actuellement, je reçois un message d'erreur indiquant que la classe Core_View est introuvable lorsque j'utilise le thème enfant. Ce n'est pas le cas si j'utilise simplement le thème parent.

Ce que j'aimerais: Je voudrais n'exiger que le modèle du thème enfant et l'initier. Cela signifie que Core_View devrait déjà être chargé.

Je suis également ouvert aux suggestions sur la manière de créer le modèle. Peut-être que ce serait mieux dans le fichier index du thème enfant?

1
MiracleGotMojo

Le fichier functions.php s'exécute à plugins_loaded, le thème enfant functions.php s'exécutant avant le thème parent functions.php. Cela signifie que, pour charger des sous-fichiers fonctionnels dans le thème enfant après le thème parent functions.php, il vous suffit de raccrocher vos appels include() après plugins_loaded.

Une action généralement sans danger à ces fins est after_setup_theme:

function wpse130681_load_dependent_functional_files() {
    require_once get_template_directory().'/classes/ContentSidebarView.php';
    $ContentSidebarView = new ContentSidebarView();
    $ContentSidebarView->init();
}
add_action( 'after_setup_theme', 'wpse130681_load_dependent_functional_files' );

Cela dit: si vous rencontrez des problèmes tels que celui-ci, vous faites probablement quelque chose de mal en premier lieu. Devinez juste à partir de votre exemple de code:

  1. Accrochez votre instanciation de classe à un crochet approprié, tel que init
  2. Rendez vos classes d'infrastructure extensibles via des filtres et étendez-les dans votre thème enfant via ces filtres.
3
Chip Bennett

Fournissez une action personnalisée dans votre thème parent:

do_action( get_template() . '_loaded', $api_class_instance );

Dans votre thème enfant, exécutez le premier code sur ce hook, pas plus tôt:

add_action( get_template() . '_loaded', function( $api_class_instance ) {
    $api_class_instance->some_public_method();
});
0
fuxia