web-dev-qa-db-fra.com

Comment remplacer une fonction quand pas à functions.php

J'essaie de remplacer une fonction pour un thème du thème enfant, mais je ne parviens pas à la faire fonctionner. Au functions.php sur le thème, je peux voir cette ligne require_once:

require_once("inc/alterna-functions.php");

Et je veux remplacer une fonction à l'intérieur de ce fichier. Je viens de copier le code d'origine de alterna/functions.php vers alterna-child/functions.php et d'apporter les modifications suivantes:

if (!function_exists('alterna_get_social_list')) :
    function alterna_get_social_list($extra_name = '', $topbar = false, $data = null, $target = '_blank')
    {
        global $alterna_options;

        $str = "";
        $social_list = array(
            array('Twitter', 'Twitter'),
            array('Twitter_1', 'Twitter #1'), // this is new
            array('Twitter_2', 'Twitter #2'), // this is new
            array('Twitter_3', 'Twitter #3'), // this is new
            array('Twitter_4', 'Twitter #4'), // this is new
            array('facebook', 'Facebook'),
            array('facebook_1', 'Facebook #1'), // this is new
            array('facebook_2', 'Facebook #2'), // this is new
            array('facebook_3', 'Facebook #3'), // this is new
            array('facebook_4', 'Facebook #4'), // this is new
            array('google', 'Google Plus', 'google-plus'),
            array('google_1', 'Google Plus #1', 'google-plus_1'), // this is new
            array('google_2', 'Google Plus #2', 'google-plus_2'), // this is new
            array('google_3', 'Google Plus #3', 'google-plus_3'), // this is new
            array('google_4', 'Google Plus #4', 'google-plus_4'), // this is new
            array('youtube', 'Youtube'),
            array('linkedin', 'Linkedin'),
            array('instagram', 'instagram'),
            array('whatsapp', 'Whatsapp'),
            array('email', 'Email', 'envelope'),
            array('rss', 'Rss')
        );

        if ($data != null) {
            foreach ($social_list as $social_item) {
                if (isset($data['type']) && $data['type'] == $social_item[0]) {
                    if (!isset($data['url'])) {
                        $data['url'] = '#';
                    }
                    if (!isset($data['target'])) {
                        $data['target'] = '_blank';
                    }
                    $str .= '<li class="social"><a  href="' . esc_attr($data['url']) . '" target="' . esc_attr($data['target']) . '"';

                    if (isset($data['tooltip']) && $data['tooltip'] == "yes") {
                        $str .= ' title="' . esc_attr($social_item[1]) . '" class="show-tooltip"';
                        if (isset($data['placement']) && $data['placement'] != "") {
                            $str .= ' data-placement="' . esc_attr($data['placement']) . '"';
                        }
                    }

                    $str .= '><span class="alterna-icon-' . esc_attr($social_item[0]) . '"';

                    if ($data['bg_color'] != "" || $data['color'] != "") {
                        $str .= ' style="';
                        if ($data['bg_color'] != "") {
                            $str .= 'background:' . esc_attr($data['bg_color']) . ';';
                        }
                        if ($data['color'] != "") {
                            $str .= 'color:' . esc_attr($data['color']) . ';';
                        }
                        $str .= '"';
                    }

                    $str .= '><i class="fa fa-' . (isset($social_item[2]) ? esc_attr($social_item[2]) : esc_attr($social_item[0])) . '"></i></span></a></li>';
                }
            }
        } else {
            foreach ($social_list as $social_item) {
                if (penguin_get_options_key('social-' . $social_item[0]) != '') {
                    if (!$topbar) {
                        $str .= '<li class="social"><a title="' . esc_attr($social_item[1]) . '" href="' . esc_attr(penguin_get_options_key('social-' . $social_item[0])) . '" target="' . esc_attr($target) . '" ><span class="alterna-icon-' . esc_attr($social_item[0]) . '"><i class="fa fa-' . (isset($social_item[2]) ? esc_attr($social_item[2]) : esc_attr($social_item[0])) . '"></i></span></a></li>';
                    } else {
                        $str .= '<li class="social"><a href="' . esc_attr(penguin_get_options_key('social-' . $social_item[0])) . '" target="' . esc_attr($target) . '" ><i class="fa fa-' . (isset($social_item[2]) ? esc_attr($social_item[2]) : esc_attr($social_item[0])) . '"></i></a></li>';
                    }
                }
            }
        }

        return $str;
    }
endif;

Mais cela ne fonctionne pas car je ne vois pas les changements sur le thème. Qu'est ce que je fais mal? Quel est le bon moyen d'y parvenir?

6
ReynierPM

La nouvelle fonction du fichier functions.php de votre thème enfant ne peut pas remplacer une fonction du fichier functions.php du parent à moins que cette fonction ne soit écrite pour pouvoir être connectée, c'est-à-dire déclarée avec if (!function_exists('alterna_get_social_list')).

Selon la documentation sur les thèmes enfants et la manière dont ils héritent des fichiers child functions.php:

Utilisation de functions.phpContrairement à style.css, le functions.php d'un thème enfant ne remplace pas son homologue du parent. Au lieu de cela, il est chargé en plus du fichier functions.php du parent. (Plus précisément, il est chargé juste avant le fichier du parent.)

[ https://codex.wordpress.org/Child_Themes#Using_functions.php][1]

Aussi, et c'est super important:

Ne copiez pas tout le contenu du fichier functions.php du thème parent dans le fichier functions.php du thème enfant.

Le seul moyen de redéfinir complètement une fonction qui n'est pas connectable est de l'ajouter via une action. Vous pouvez alors supprimer l'action qui appelle la fonction du thème parent et ajouter une nouvelle action qui appelle votre nouvelle action. fonction avec un nom différent.

2
Tammy Shipps