Aller plus loin avec un Child-Thème
Lors de la mise en place d’un thème enfant, la question principale à se poser, est, « Pourquoi mettons nous en place ce thème enfant? »… Est ce pour le faire évoluer afin de devenir un nouveau thème majeur, ou alors est ce simplement pour venir compléter et affiner le thème principal utilisé.
Il faut, continuellement, faire attention à ne pas réinventer l’eau chaude, ni surcharger le thème principal au point de le surpasser, et donc presque travailler à contre sens. Nous allons voir au cour de cet article quelques opérations qui vont nous permettre de pouvoir continuer à améliorer, ou affiner, le thème enfant sans pour autant déborder de son rôle de thème enfant.
Tout cela est bien beau, mais rien ne valant le test afin de pouvoir tester, et/ou mettre en application, le bon fonctionnement et la prise en compte des divers scripts abordés au cour de cet article. Je vous propose de mettre en place un bac à sable, accompagné d’un environnement de débogage, et de pouvoir ainsi tester au fur et à mesure l’ensemble des scripts qui vont suivre. Scripts que vous pouvez récupérer sur le github à l’adresse WP-Further-with-Child-Theme.
Comment adapter, modifier ou compléter un comportement ?
Les modifications peuvent porter aussi bien sur un fichier de structure et de contenu du thème, que sur un script présent dans le fichier functions.php. Donc commençons par la structure et poursuivons ensuite par le comportement.
Surcharger un fichier du thème parent
Parfois, pour apporter une modification dans un fichier de base, le plus simple reste de cloner le fichier original depuis le thème parent et de le modifier ensuite dans le thème enfant. Le fichier du thème enfant remplacera complètement le fichier du thème parent. Par exemple, nous pouvons dupliquer le fichier footer.php présent dans le thème parent, et une fois utilisé dans le thème enfant, nous allons pouvoir intervenir à souhait dans la partie structurelle en retirant des balises, ou, en en ajoutant. À chaque fois il suffit de recharger le site pour constater alors la prise en compte des modifications.
Il faut cependant penser, à placer des commentaires afin de mieux suivre ce travail dans le temps et dans son évolution. Quoiqu’il en soit, dorénavant nous allons devoir consulter ce fichier à chacune des mises à jour du thème parent afin de s’assurer de ne pas passer à coté d’une modification majeure, et même mineure, de ce fichier, qui pouffait venir déstabiliser l’évolution générale du thème.
Remplacer une pluggable function
En ce qui concerne les fonctionnalités, nous allons procéder à peu près à l’identique, à savoir, cloner ou remplacer la fonction souhaité. Seulement est ce que le thème parent prévoit-il une telle éventualité?
Dit différemment, imaginons que nous ayons une fonction fait_ceci() au sein du thème parent, si on place son clone dans le thème enfant, nous allons recevoir une erreur de type Fatal error: Cannot redeclare fait_ceci() (previously declared …).
Pour mettre ce test en évidence, créons une simple fonction, fait_ceci() au sein du fichier functions.php du thème parent et invoquons là depuis un hook basé sur wp_footer. Une fois le fichier enregistré, rechargeons le site afin de s’assurer de la bonne prise en compte. Contenu de la fonction parent devrait apparaître en pied de page. Parfait. Répétons l’opération en ajoutant cette même fonction dans le thème enfant et rechargeons une fois de plus la page. Cette fois-ci une erreur devrait faire son apparition.
// functions.php du thème parent function fait_ceci() { return 'contenu de la fonction parent'; } add_action('wp_footer','fait_ceci'); // functions.php du thème enfant function fait_ceci() { return 'contenu de la fonction enfant'; }
Pour éviter cette erreur, il eut fallut que le thème parent implémente cette fonction au travers d’un test d’existence, autrement dit, en employant une pluggable fonction. Remplacez la fonction présente dans le fichier functions.php du thème parent par le code ci-dessous, tout en maintenant la mise en place du hook.
if ( ! function_exists( 'fait_ceci' ) ) { function fait_ceci() { return 'contenu de la fonction parent'; } } add_action('wp_footer','fait_ceci');
Après avoir ajouté la fonction pluggable dans le site parent, nous n’obtenons plus l’erreur en rechargeant la page et c’est bien la fonction placée dans le fichier functions.php enfant qui prend le dessus, du fait que nous voyons apparaître Contenu de la fonction enfant en pied de page. Il existe également un certain nombre de fonctions pluggable au sein du coeur de WordPress, vous en avez la liste sur l’article Pluggable Functions.
Remplacer en donnant une priorité différente
S’il nous faut remplacer une fonction employée par le thème parent, et, qu’il ne s’agisse pas d’une fonction pluggable, il nous reste à savoir si cette fonction est implémentée en utilisant un hook, aussi bien une action qu’un filtre. Si tel est le cas, alors, nous pouvons ajouter une fonction dans le thème enfant, en utilisant un nouveau nom, par exemple fait_cela(), et si besoin, nous pourrons par la suite retirer la fonction parent si son exécution n’est pas souhaitée.
Commençons par ajouter la fonction enfant en définissant une priorité plus forte, ou moins forte, en fonction des besoins. N’oubliez pas que par défaut, les priorités équivalent à 10. Deux cas de figure se présente, la priorité n’est pas définie, ou la priorité est définie (la palisse).
function fait_ceci() { echo 'contenu de la fonction parent'; } add_action( 'wp_footer','fait_ceci');
Donc, nous pouvons venir ajouter la fonction enfant avec un degré de priorité adapté… essayez la première fois en donnant une valeur de priorité XXX inférieure à 10, la seconde équivalente à 10 et la dernière supérieure à 10.
function fait_cela() { echo 'contenu de la fonction enfant'; } add_action( 'wp_footer','fait_cela', XXX);
Dans les deux premiers cas vous devriez obtenir Contenu de la fonction enfant Contenu de la fonction parent en pied de page et l’inverse pour le dernier
Remplacer, tout en retirant la fonction parent au préalable
Parfois, il est nécessaire de s’assurer que la fonction parent soit mise au vert, et ne s’exécute pas. Le plus simple reste de la retirer en employant le même hook (action ou filtre) et la même priorité qui l’ont activés. Nous allons donc compléter le script placé dans le fichier functions.php enfant.
Cependant, afin de pouvoir retirer correctement la fonction parent, il va falloir utiliser un hook qui soit invoqué juste au moment où la fonction est chargée, et surtout, avant qu’elle ne soit exécutée. Le plus sûr, pour cela, est de crocheter le retrait au moment où l’ensemble du chargement de WordPress soit réalisé, et donc, d’employer wp_loaded. Si vous avez un doute quant à l’ordre d’invocation des hooks, rapprochez vous de l’article Plugin API/Action Reference.
function retrait_fonction_parent() { remove_action( 'wp_footer','fait_ceci', 10); } add_action( 'wp_loaded', 'retrait_fonction_parent' ); function fait_cela() { echo 'contenu de la fonction enfant'; } add_action( 'wp_footer','fait_cela');
Lors de ce test, nous ne devrions obtenir que Contenu de la fonction enfant dans le pied de page.
Attention, a bien respecter le même degré de priorité lors du retrait que celui employé au moment de l’ajout. Dans notre cas, du fait que nous sommes sur des valeurs par défaut, nous aurions pu l’omettre.
Enfin, remplacer l’irremplaçable
Si la fonction est utilisée par le thème parent, mais n’est ni une fonction pluggable, ni implémentée en utilisant un hook, il va, alors, être compliqué de surpasser cette fonction, à moins d’agir directement sur le thème parent.
Améliorer les fonctionnalités
En complément des remplacements de fonctionnalités, et nous avons vu comment les implémenter dans les chapitres précédents, il est parfois nécessaires de compléter ces fonctionnalités, ou d’en créer de nouvelles.
Étendre plutôt au travers de plugin
Faites attention en créant de nouvelles fonctionnalités, à ne pas mettre en place des mécaniques qui soient importantes pour votre site, ou votre application, car n’oublions que nous parlons de fonctionnalités qui sont directement implémentées au sein d’un thème. Et donc, lorsque des fonctionnalités sont liées à un thème, ces fonctionnalités disparaissent dès que l’on change de thème. Donc, il peut, parfois, être préférable d’implémenter certaines fonctionnalités au travers d’un plugin et non pas d’un thème, fût il enfant aussi bien que thème principal.