Tout savoir sur WordPress

Écraser les fonctions de bases d’un thème parent

Découvrez comment modifier le comportement d’un hook WordPress utilisé dans un thème parent à partir d’une fonction d’un thème enfant.

Les Child Themes (ou thèmes enfants en français) sont très utiles pour personnaliser l’apparence ou le code d’un thème (payant ou gratuit) tout en continuant à bénéficier des mises à jour sans perdre nos modifications.

Lorsqu’il s’agit de créer des nouvelles fonctions, il n’y a aucun risque de conflit avec le thème parent puisqu’elles n’ont jamais été déclarées auparavant. Par contre, quand il faut modifier des fonctions présentes dans le thème parent, c’est un peu plus délicat. En effet, le fichier functions.php du thème parent n’est pas “écrasé” par celui de l’enfant. Par conséquent, si on déclare une fonction déjà présente dans le fichier functions.php du thème parent dans celui du thème enfant, une erreur fatale sera déclenchée.

Pour écraser le comportement d’un hook WordPress apporté par une fonction du thème parent à partir du thème enfant, voici un modèle de base que l’on pourrait insérer dans le fichier functions.php d’un thème enfant :

add_action('after_setup_theme','remove_fonction_parent');
function remove_fonction_parent() {
   remove_action('hook','fonction_parent');
   add_action('hook','fonction_enfant');
}

function fonction_enfant() {
   // Votre code perso ici
}

Vous remarquerez que la technique est simple puisqu’il suffit uniquement de faire usage de la fonction remove_action() pour annuler la modification d’un hook par une fonction du thème parent.

Dans l’exemple ci-dessous, on décide de modifier le comportement du hook wp_title qui est apporté par la fonction twentytwelve_wp_title() présent dans le thème parent :

add_action('after_setup_theme','remove_fonction_parent');
function remove_fonction_parent() {
    remove_action('wp_title','twentytwelve_wp_title');
    add_action('wp_title','my_wp_title');
}

function my_wp_title( $title, $sep ) {
    return $title . $sep . ' Mon Blog';
}

Pour les personnes qui souhaitent en savoir plus sur la mise en place d’un thème enfant, je vous recommande de lire le guide suivant : Personnaliser un thème WordPress avec un Child Theme

Cet article a été mis à jour il y a 4415 jours - Il n'est peut être plus à jour !

Article écrit par jmlapam

24 Commentaires

  1. Je me suis penché sur la question il y a peu. En fait, pour que cette manip fonctionne, il faut que la fonction ait un add_action. Si ce n’est pas le cas, vous êtes dans le c… WP conseille FORTEMENT de rédiger vos fonctions avec un test d’existence pour pouvoir les réécrire facilement. En fait, tous les concepteurs de thème devrait faire ainsi pour permettre une utilisation plus souple des child thèmes (http://codex.wordpress.org/Child_Themes#Using_functions.php)

  2. @Li-An
    “WP conseille FORTEMENT de rédiger vos fonctions avec un test d’existence pour pouvoir les réécrire facilement.”
    Un test d’existence du genre “Qui suis-je” ou “Dans quel état j’erre” ?
    =D
    Je sors, je t’autorise à me fouetter pour cette mauvaise blague ==> []

  3. Tu as le droit de te moquer: en me relisant, j’ai bien vu que c’était foireux comme phrase. Mais comme je ne maîtrise pas vraiment le php, j’ai préféré rester dans le vague. L’article WP est bien plus clair quoiqu’en anglais :-)

  4. @LI-AN: Salut, on parle :
    “d’écraser le comportement d’un hook WordPress apporté par une fonction du thème parent”.

    Donc je ne vois pas le souci ici.

  5. Ben la réponse la plus évidente et la plus générale c’est: les créateurs de thème doivent suivre les consignes WP pour la gestion des thèmes enfants. Il n’y aurait pas besoin de bidouillage de ce genre :-) Désolé d’élever le débat ;-)))

  6. Pas de problème pour ma part, tu as bien raison. Cela dit l’astuce s’adapte aux thèmes en général donc si c’est bas on va chercher en bas me comprends-tu ? Je peux te citer sur mon site? J’aimerais mettre à jour mon article pour préciser mieux.

    Merci à toi :)

  7. Dites-moi les blogueurs vous tous sur Mac? çà ne m’étonne pas du tout finalement.
    Merci pour l’astuce :)

  8. @Eric : L’avantage de Mac est que l’on trouve un nombre important de bons logiciels qu’on ne retrouve pas sur Windows. Pour ma part, cela devient indispensable de développer sous mac.

  9. Quel logiciel par exemple? Je n’ai jamais utilisé de mac, je me renseigne car je connais que windows et linux.Tu es développeur ?

  10. @Li-an : Je ne vois pas où est le piège à fric… Pour un développeur ou un graphiste, un mac est le meilleur outil de travail qu’il soit ! C’est sûr que si tu as besoin d’un ordinateur pour aller uniquement sur Internet et faire du Word, pas mal peine de prendre un mac…

    @Eric : Voici une liste de logiciel que j’utilise sur mac et qui ne sont pas dispo sur windows : Coda 2, Transmit, ImageOptim, Sequel Pro, Codekit (juste INDISPENSABLE), MAMP Pro. Je viens de citer ceux que j’utilise tous les jours, mais il y en a encore quelques uns qui sont encore pas mal.

  11. @Jonathan: c’est tellement… bon, je laisse tomber, c’est comme parler à une pomme de terre – chers zamis modérateurs, vous pouvez effacer tous mes commentaires sur ce sujet qui ne font que polluer le sujet et sont aussi utiles qu’une verrue sur une jambe de bois. Merci d’avance et bonnes fêtes à tous :-)

  12. voir les commentaires d’en tête du thème Twenty Twelve

    When using a child theme (see http://codex.wordpress.org/Theme_Development and http://codex.wordpress.org/Child_Themes), you can override certain functions (those wrapped in a function_exists() call) by defining them first in your child theme’s functions.php file. The child theme’s functions.php file is included before the parent theme’s file, so the child theme functions would be used.

    Functions that are not pluggable (not wrapped in function_exists()) are instead attached to a filter or action hook.

  13. Merci pour ce billet fort intéressant. Je ne comprends pas tout (dommage !), mais j’ai l’impression (enfin !) de toucher du doigt la solution à mes tracas depuis quelques semaines, ou pas. j’ai un souci de lien sur ma page d’accueil, et je pense que c’est lié à un truc “parent”, mais impossible de détacher le précédent sujet… bref tout le monde s’en fout ; pendant ce temps je rame et ça me fait les bras… Bon Noël quand même.

  14. Merci @géraldine et joyeux noël à toi aussi. J’en profite pour le souhaiter à tous ceux qui sont liés de près ou de loin à GeekPress. En réalité pour les child themes WordPress va toujours regarder dans les deux dossiers (thème enfant et parent) avec un système de priorités(pour le dire grosso modo). Pour tous les fichiers le child theme a la priorité MAIS il y a une exception pour le functions.php : c’est le fichier enfan qui est chargé juste avant.

    Pour ton souci, on n’a pas assez de détails mais pour l’article, il s’agit d’une astuce qui te permet d’écraser une fonction du thème parent, donc de la refaire à ta sauce, avec toutes tes modifications. Il n’y a pas d’autres moyens à moins que le thème parent ait été optimisé pour cela (function_exists()) comme on le rappelle plus haut dans les commentaires.

  15. Merci Julien pour ce tutoriel. Depuis un certain temps, je cherchais à me familiariser avec les fonctions des thèmes WordPress mais j’avais peur de tout mélanger. Votre tutoriel m’aideras à faire des changements. Merci!

  16. Merci beaucoup pour ce tutoriel très clair et… en français compréhensible de surcroit. Je vais enfin pouvoir mettre certains de mes blogs à jour sans devoir refaire tous les copier/coller nécessaires aux transformations que j’ai apporté. Mais pourquoi n’ai-je pas découvert votre blog plus tôt ? Bonnes fêtes, Richard.

  17. Salut.
    Parfait ton tuto pour un handicapé du code comme moi.
    Ça roule pile poil, je voulais ajouter une zone de pied de page dans les widget, j’ai pu faire comme tu le décris en supprimant l’action

    remove_action('widgets_init','twentyeleven_widgets_init');
    

    et en créant une nouvelle

    add_action('widgets_init','twentyeleven_widgets_init_2');
    

    En revanche, j’ai laissé la fonction de base twentyeleven_footer_sidebar_class car il n’y a aucune action qui l’appelle, et je n’ai pas trouvé comment l’écraser. Mais bon ça fonctionne qd même.
    Si tu peux m’éclairer là dessus, ça me permettrait de ne pas en rester au milieu du gué niveau compréhension.

    Milles mercis

  18. @Yann : De rien avec un peu de retard :)

    @punkitude: la méthode porte en effet sur les hooks, pour écraser les fonctions du thème parent qui n’ont pas de add_action ou add_filter, il suffira de les réécrire en gardant les mêmes noms tout simplement POUR PEU que le développeur ait bien fait son travail en ajoutant un if(!function_exists()) dans son thème.

  19. Bonjour,

    le themeforest que j’installe en ce moment a ni add_action, ni add_filter, ni if(!function_exist()) dans une fonction que je veux juste traduire via un theme enfant. Voilà la fonction :

    function pixelwars_theme_excerpt_more( $more )
    {
    return ‘… ‘ . __( ‘Read More’, ‘read’ ) . ‘‘;
    }

    add_filter( ‘excerpt_more’, ‘pixelwars_theme_excerpt_more’ );

    Vous me conseillez de faire comment (je veux juste traduite le “Read more” en “lire la suite…”) ?
    Le theme n’a pas prévu la traduction… super quoi!