web-dev-qa-db-ja.com

アクションフックで関数を使用するための適切な方法は?

以下の論理が正しいのかどうか、そしてそれが機能するために特定の状況が存在するべきなのかと疑問に思います。

以下の例はとても簡単です。テーマ関連ファイルの他の場所で定義されている関数を使用したいとしましょう。私の子テーマ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()を使用できるかどうかです。

ありがとう

1
RobbTe

はい、できます。ただし、特別なケースがいくつか発生する可能性があるため、注意が必要です。それらのいくつかは以下のとおりです。

1.関数はクラスメソッドであり、グローバル関数ではありません。

class SomeClass {
   ...
   function some_function() { ... }
   ...
}

そのような場合、あなたがそれを使用できるのは、次の場合だけです。

2.その機能を持つファイルが常に含まれているとは限りません。

function do_something() {
    if ( condition_met() ) {
        include_once( 'parent_theme_hooks.php' );
    }
}

そのような場合、そのファイルからの機能は常にアクセス可能とは限りません。

3.関数はif文の中で宣言することができます。

if ( class_exists( 'SomeClass' ) ) {
    function some_function() { ... }
}

繰り返しますが - 与えられたクラスが存在しない場合、その関数はアクセスできません。

4.ファイルはまだロードされていません

関数にプラグインやテーマが付属している場合は、アクションフックを使って宣言することができます。

そのような場合、そのフックが起動される前に関数にアクセスすることはできません。

この場合のもう1つの例は、子テーマ内の親テーマの関数を使用することです。親テーマからのfunctions.phpファイルは、子テーマからの同じファイルの後に来ます。そのため、子テーマのfunctions.phpファイルで直接親関数を使うことはできません。

しかし...

このような関数を使用するときにコードの信頼性を高める方法がいくつかあります。

  1. その関数がいつ、どのように宣言されているかを常に理解するようにしてください。
  2. 関数がif ( function_exists( 'function_name' ) )で存在するかどうかを確認し、存在する場合にのみそれを呼び出します。それが存在しない場合、あなたはいくつかの代替解決策(代替)を提供することもできます。
2

親テーマで定義されている関数は使用できますが、親テーマがロードされた後にのみ使用できます。親テーマが読み込まれます の後 あなたの子テーマ。

つまり、親テーマの関数を使いたい場合は、after_setup_themeまたは later のフックにフックされている関数内でしか実行できません。

ですから、あなたの例は、親テーマがロードされた後にcheck_if_enabled()が実行された場合にのみ機能します。親テーマがロードされる前に子テーマでその機能を使用しようとすると、機能しません。

2
Jacob Peattie