以下の論理が正しいのかどうか、そしてそれが機能するために特定の状況が存在するべきなのかと疑問に思います。
以下の例はとても簡単です。テーマ関連ファイルの他の場所で定義されている関数を使用したいとしましょう。私の子テーマparent_theme_hooks.php
のアクションフックを通してfunctions.php
としましょう。
parent_theme_hooks.php
function is_enabled(){
return true;
}
function check_if_enabled(){
do_action( 'my_hook', $some, $args );
}
それからchild-theme functions.php に
function my_function($some, $args) {
if ( is_enabled() ) {
$message = 'yes';
} else {
$message = 'no';
}
echo $message;
}
add_action( 'my_hook', 'my_function', 11, 2 );
質問 それでは、私の質問は、それが親テーマの他の場所で定義されているときに、子テーマfunctions.php
で関数is_enabled()
を使用できるかどうかです。
ありがとう
はい、できます。ただし、特別なケースがいくつか発生する可能性があるため、注意が必要です。それらのいくつかは以下のとおりです。
class SomeClass {
...
function some_function() { ... }
...
}
そのような場合、あなたがそれを使用できるのは、次の場合だけです。
function do_something() {
if ( condition_met() ) {
include_once( 'parent_theme_hooks.php' );
}
}
そのような場合、そのファイルからの機能は常にアクセス可能とは限りません。
if ( class_exists( 'SomeClass' ) ) {
function some_function() { ... }
}
繰り返しますが - 与えられたクラスが存在しない場合、その関数はアクセスできません。
関数にプラグインやテーマが付属している場合は、アクションフックを使って宣言することができます。
そのような場合、そのフックが起動される前に関数にアクセスすることはできません。
この場合のもう1つの例は、子テーマ内の親テーマの関数を使用することです。親テーマからのfunctions.php
ファイルは、子テーマからの同じファイルの後に来ます。そのため、子テーマのfunctions.phpファイルで直接親関数を使うことはできません。
このような関数を使用するときにコードの信頼性を高める方法がいくつかあります。
if ( function_exists( 'function_name' ) )
で存在するかどうかを確認し、存在する場合にのみそれを呼び出します。それが存在しない場合、あなたはいくつかの代替解決策(代替)を提供することもできます。親テーマで定義されている関数は使用できますが、親テーマがロードされた後にのみ使用できます。親テーマが読み込まれます の後 あなたの子テーマ。
つまり、親テーマの関数を使いたい場合は、after_setup_theme
または later のフックにフックされている関数内でしか実行できません。
ですから、あなたの例は、親テーマがロードされた後にcheck_if_enabled()
が実行された場合にのみ機能します。親テーマがロードされる前に子テーマでその機能を使用しようとすると、機能しません。