子テーマのテーマの機能をオーバーライドしようとしていますが、機能させることができません。テーマの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;
しかし、テーマの変化が見えないので、うまくいきません。何が悪いの?これを達成するための正しい方法はどれですか。
あなたの子供のテーマの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にコピーしないでください。
プラガブルではない関数を完全に再定義する唯一の方法は、それが何らかのアクションを介して追加された場合です - それから最初に親テーマの関数を呼び出しているアクションを削除し、新しいを呼び出す新しいアクションを追加できます。別の名前で機能します。