web-dev-qa-db-ja.com

他のプラグインのプラグインからアクションを削除する

私はプラグインを追加する2つのアクション(特にsportspress)を削除しようとしています。このプラグインの動作は以下のとおりです。

add_action('sportspress_before_single_player','sportspress_output_player_details', 15);
add_action('sportspress_single_player_content','sportspress_output_player_statistics',20);

私はプラグインを作成しました、そして、私はこれらのフックを削除したいです、これは私のコードです:

<?php
/*
Plugin Name: my plugin

Description: Plugin to override plugins' hooks
Version: 0.1
Author: Company Name
Author URI: http://www.example.com/
License: GPL2
*/


add_action('plugins_loaded','remove_hooks');
function remove_hooks(){
    remove_action( 'sportspress_before_single_player', 'sportspress_output_player_details' );
    remove_action( 'sportspress_single_player_content', 'sportspress_output_player_statistics' );
}

私はたくさんのことを検索してみましたが、うまく機能させることはできません。

3
Doruko

フックを外そうとするときに人を混乱させる2つのことがあります。

  1. remove_action()またはremove_filter()の呼び出しは、add_action()またはadd_filter()の呼び出し、およびの後、実際にフックが起動される前に行わなければなりません。これは、コールが追加されたときにフックを知っている必要があることを意味しますおよびフックが起動されたときに
  2. remove_action()またはremove_filter()呼び出しは、add_action()またはadd_filter()呼び出しと同じ優先順位でなければなりません

これらのフックがデフォルトの優先順位でinitフィルタに追加された場合、それらを削除するには、10より後の優先順位でinitにフックして削除します。

add_action( 'init', 'wpse_106269_remove_hooks', 11 );
function wpse_106269_remove_hooks(){
    remove_action( 'sportspress_before_single_player', 'sportspress_output_player_details', 15 );
    remove_action( 'sportspress_single_player_content', 'sportspress_output_player_statistics', 20 );
}

https://codex.wordpress.org/Function_Reference/remove_action より

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

6
Nathan Johnson

プラグインはファイル名の順に読み込まれます。例えばabc.phpという名前のプラグインが最初にロードされ、次にxyz.phpという名前でプラグインabc.phpからアクションを削除しようとしていて、それがプラグインxyz.phpに追加された場合、Tweakなしでは実行できません。アクションはその時点で追加されていないため、削除しようとしています。

どちらのプラグインが最初に出力をエコーするかを確認するには、両方のプラグインにdie(__FILE__);を配置するだけです。あなたのプラグインがより早くロードされた場合、アクションを削除するために2つのことができます

  1. プラグインの名前を変更して、実際のプラグインの後にロードしてください。
  2. 親アクションがいつ実行されるのか私にはわかりませんが、アクションの長いリストがあります Action_Reference あなたのプラグインのremoveアクションをフックすることができます。これで、remove_action()を効果的にするためにいつ置くべきかがわかりました。

それが役に立てば幸い。

2
Sumit

私は同じ問題を抱えていました。他のプラグインから来たアクションを削除し、それを私が開発していたプラグインで書いた別の関数に置き換えたいと思いましたが、私のファイル名は(@Sumitが言ったように)アルファベット順でオリジナルのプラグインファイルの名前です。それでも私はその行動を排除することができた。

私にとって功を奏したのは、すべてのプラグインをロードした後に実行するために、remove_action呼び出しを別のadd_action内にラップすることでした。それはアクション init を使うことで可能です:

add_action( 'init', 'changeActions' );
function changeActions () {
    remove_action('my_action', 'the_function_from_the_plugin', 10);
}

P.S .:アクションが適切に削除されたかどうかを確認したい場合は、 この答え のコードを使用して、希望のアクションにフックされている機能をどこかに印刷できます。テーマファイルを使って作業していなかったので、私はテスト用のショートコードを使用しました(ワードプレスパネル内のどのページにも[test_actions]を追加するだけです)。

add_shortcode('test_actions', 'testActions');
function testActions($attrs) {
    //get the list of all actions using this global variable
    global $wp_filter;

    //get only the actions hooked to 'my_action'
    $r = $wp_filter['my_action'];

    //return the array dump as a string
    return var_export($r, TRUE);
}
1
Brian Hellekin