web-dev-qa-db-ja.com

Functions.phpにないときに関数をオーバーライドする方法

子テーマのテーマの機能をオーバーライドしようとしていますが、機能させることができません。テーマのfunctions.phpで、私はこのrequire_once行を見ることができます:

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

そしてそのファイルの中の関数をオーバーライドしたいのです。元のコードをalterna/functions.phpからalterna-child/functions.phpにコピーし、次のように変更しました。

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;

しかし、テーマの変化が見えないので、うまくいきません。何が悪いの?これを達成するための正しい方法はどれですか。

6
ReynierPM

あなたの子供のテーマのfunctions.phpの新しい関数は、その関数がプラグ可能であるように書かれていない、すなわちif (!function_exists('alterna_get_social_list'))で宣言されていない限り、親のfunctions.phpファイルからの関数をオーバーライドすることはできません

チャイルドテーマに関するドキュメントと、それらがチャイルドのfunctions.phpファイルからどのように継承されるかについて:

functions.phpの使用style.cssとは異なり、子テーマのfunctions.phpは親からの対応物をオーバーライドしません。代わりに、それは親のfunctions.phpに加えてロードされます。 (具体的には、親のファイルの直前に読み込まれます。)

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

また、これは非常に重要です。

親テーマのfunctions.phpの全内容を子テーマのfunctions.phpにコピーしないでください。

プラガブルではない関数を完全に再定義する唯一の方法は、それが何らかのアクションを介して追加された場合です - それから最初に親テーマの関数を呼び出しているアクションを削除し、新しいを呼び出す新しいアクションを追加できます。別の名前で機能します。

2
Tammy Shipps