web-dev-qa-db-fra.com

Redéclare une fonction dans un thème enfant

Je souhaite redéclarer une fonction que j'ai héritée du thème parent.

Quand je le fais dans functions.php, j'obtiens une erreur fatale qui dit que la redéclaration n'est pas possible.

J'ai fait une solution de contournement: créer un nom de fonction modifié, copier tous les fichiers de modèle, index.php, etc. dans le répertoire du thème enfant et réécrire les appels de fonction. Alors maintenant, la nouvelle fonction est appelée.

Cela fonctionne, mais ignore toutes les mises à jour que le thème parent aurait.

Y a-t-il une meilleure solution à cela?

4
Gergely

Redéclarer une fonction dans un thème enfant ne fonctionne que lorsque la fonction des thèmes parents est encapsulée dans un

 if( !function_exists( 'function_name' )):

état. Ensuite, vous pouvez simplement copier la fonction complète dans le thème de l’enfant et faire les modifications nécessaires.

Si les fonctions des thèmes parents ne sont pas encapsulées dans cette instruction conditionnelle if, et si aucun filtre ni crochet n'est fourni dans la fonction, il est préférable de copier la fonction dans votre thème enfant, de renommer cette fonction, de faire vos modifications, puis mettez à jour vos fichiers de modèle en conséquence pour refléter la nouvelle fonction.

8
Pieter Goosen

Vous pouvez d’abord supprimer la fonction avec

remove_filter( 'hook', 'function_name' );

puis ajoutez à nouveau la fonction avec le nouveau nom et le même crochet.

Par exemple

    function remove_content_filter() {

       remove_filter( 'the_content', 'function_name' );

    }

    add_action( 'after_setup_theme', 'remove_content_filter' );

    function new_function_name( $output ) {
        //some code here
        return $output;
    }

    add_filter( 'the_content', 'new_function_name' );
2
user3635808