プラグインクラスの関数の廃止


8

私は自分のプラグインの1つを更新していますが、廃止予定の機能に少し行き詰まっています。

元々、私のプラグインにはグローバル変数があり、プラグインのメインクラスはインスタンス化され、グローバル変数に格納されていました。このように、ユーザーはグローバルを使用してプラグインクラスの関数にアクセスできます。

$GLOBALS['my_custom_plugin'] = new my_custom_plugin();

次に、たとえば、私のFAQに、特定のフックからクラスの関数の1つを削除し、別のフックに追加する方法を示すコードがありました。

function move_input(){ 
    global $my_custom_plugin;
    remove_action( 'before_main_content', array( $my_custom_plugin, 'display_input') );
    add_action( 'after_main_content', array( $my_custom_plugin, 'display_input' ) );
}
add_action( 'wp_head' , 'move_input' );

今、私の更新では、display_input()関数は別のクラスに移動されており、それにアクセスする方法を人々に知らせたいと思います。(メインプラグインクラスの)元の関数を次の廃止通知で置き換えてみました。

public function display_input() { 
    _deprecated_function( 'display_price', '2.0', 'my_custom_plugin()->display->display_input' );
    return $this->display->display_input();
}

ただし、add_actionおよびremove_action関数は非推奨通知をトリガーしないようです。奇妙なことに、関数が完全に削除されても、array( $my_custom_plugin, 'display_input')存在しなくてもエラーは発生しません。

誰かが関数に直接アクセスしようとした場合:

$my_custom_plugin->display_input();

次に、デバッグ通知が表示されます。これは期待される結果_deprecated_function()ですか?または私は何かを逃していますか?廃止された関数を使用してアクションを削除または追加しようとしたときにデバッグ通知を表示することは可能ですか?

更新

add_actionページのかなり下に追加しているため、のデバッグメッセージが表示されないことに気付きました。#facepalm!ただし、のデバッグ通知はまだ表示されませんremove_action


興味深いcall_user_func(function(){trigger_error('hello?');});動作ですが、add_actionごとに登録されたコールバックで失敗します。
fuxia

facepalmの準備中ですが、それは質問ですか、それともステートメントですか?
helgatheviking 2014

ただのテスト結果。私もびっくりです。
fuxia

わかりました、私は本当に何も見落としていません、それそれどのようにあるのですか?
helgatheviking 2014

2
ああ、クエリモニターは私の設定でメッセージを非表示にしています。のメッセージadd_action()は実際にありました。remove_action()そのように扱うことはできません。
fuxia

回答:


2

存在しないコールバック

良い点の1つは、コールバックが存在しない場合でも、エラーdo_action()apply_filters()トリガーされないことです。その最も安全な方法は、テンプレートにデータを挿入するためのプラグインというこの手段:プラグインはオフになっている場合およびdo_action()/ apply_filters()グローバルでのコールバックが見つからない$wp_filters配列は、何も起こりません。

エラー出力

remove_filter()最初にコールバックをフックした関数/メソッドを呼び出すと、コールバックはグローバル配列から削除されるだけです。つまり、コールバックは登録されていないため、実行されません。

解決策は簡単です。コールバック自体から削除することにより、トリガーされたにコールバックを削除します。

コールバックの削除

WPsプラグイン「API」は、削除するときに苦労することは誰でも知っています。問題は主に、global $wp_filter;配列内のキーに「一意の」名前を追加する奇妙な構成です。非常に簡単な解決策は、単に使用することです__METHOD__あなたは、静的コンテキストで削除することとコールフィルタ:

class FOoooo
{
    public function __construct()
    {
        add_filter( 'hook', array( __CLASS__, 'bar' ) );
    }
    public static function bar( $baz )
    {
        remove_filter( current_filter(), __METHOD__ );

        return $baz;
    }
}

これは良いことではありませんが、... いくつかのユースケースに対する解決策のようなものです。しかし、クロージャーを削除することさえ考えないでください。

上記はコールバックを削除するだけで、それを実行します。それでも、さらに進んで使用することができますremove_all_actions()(またはremove_all_filters())。

// Check if a callback is attached and tell about the deprecated stuff
if ( has_action( 'before_main_content' ) )
    _deprecated_function( 'display_price', '2.0', 'my_custom_plugin()->display->display_input' );
// Remove the callback
remove_all_actions( 'before_main_content' );

さらに進んで、グローバルフィルター配列からコールバックを抽出し、それを新しいフック/フィルターに再接続することもできます(互換性がある場合)。


カイザーありがとう!これは素晴らしく詳細な答えです。明日テストしてみます。
helgatheviking 2014
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.