web-dev-qa-db-ja.com

WordPressフックの匿名関数

WordPressフックは次の2つの方法で使用できます。

  1. コールバック関数名と適切な関数を使用する

    add_action( 'action_name', 'callback_function_name' );
    function callback_function_name() {
        // do something
    }
    
  2. 匿名関数(閉鎖)の使用

    add_action( 'action_name', function() {
        // do something
    } );
    

WordPressの使用方法に違いはありますか?推奨される方法とその理由は何ですか?

28

無名関数の欠点は、 remove_action を使用してアクションを削除できないことです。

重要:フックを削除するには、フックが追加されたときに$function_to_removeおよび$priority引数が一致する必要があります。これは、フィルターとアクションの両方に当てはまります。削除の失敗に関する警告は表示されません。

function_to_removeを定義していないため、削除できません。

そのため、他の誰かが上書きしたいと思う可能性のあるプラグインやテーマの中でこれを使用してはなりません。

31
TeeDeJee

クロージャを使用すると、コールバックとして渡すために最初にグローバル関数を作成する必要がないため、グローバル名前空間をクリーンに保つの利点があります。

add_action('admin_init', function () {
    // some code...
});

個人的には、コールバックとしてクロージャを使用することを好みますnless

  • コールバックを削除する可能性が欲しい
  • コールバック関数は複数回使用する必要があります
  • 古いPHPバージョン(5.3未満)のサポートが必要です)

クラス内の閉鎖

クロージャはクラス内で有益にすることもできます。

class SomeClass
{
    public function __construct()
    {
        add_action('wp_head', function () {
            $this->addSomeStyling();
        });
    }

    protected function addSomeStyling()
    {
        echo '<style> body { color: #999; } </style>';
    }
}

通常、コールバックメソッドはpublicにする必要がありますが、この場合、privateまたはprotected

このソリューションはPHP 5.4+でのみ機能します。PHP 5.3+でも機能させるには、$thisオブジェクト参照を明示的に渡す必要があります。次のようなクロージャー

    public function __construct()
    {
        $self = $this;

        add_action('wp_head', function () use ($self) {
            $self->addSomeStyling();
        });
    }
15
Victor