add_action()で使用する優先度を知る方法は?


12

私はバックエンドから管理者以外のユーザーのいくつかのメニュー項目を削除する小さなプラグインを書いていて、コードで優先度を指定しない限り、私のプラグインは何もしないことがわかりました:

add_action('admin_bar_menu', 'remove_toolbar_items', 999);

なしでは999、コードは私のremove_toolbar_items関数の項目を削除せず、それでうまく機能します:

function remove_toolbar_items( $wp_admin_bar ) {
    if ( !current_user_can( 'manage_options' ) ) {
        $wp_admin_bar->remove_node('new-post');
        $wp_admin_bar->remove_node('comments');
    }
}

優先度パラメータの状態に関するドキュメント

特定のアクションに関連付けられた関数が実行される順序を指定するために使用されます。小さい番号は以前の実行に対応し、同じ優先順位の関数は、アクションに追加された順に実行されます。デフォルト値:10

ただし、どの優先順位を使用するかを決定する方法を説明するものは見つかりませんでした。いつ優先度を使用するか、どの優先度を使用するかをどのように決定しますか?優先度パラメータをいじっていなければ、何時間も頭を悩ませていたような気がします。

また、デフォルトの優先順位は10であることがわかりましたが、既知の優先順位値の範囲はありますか?

回答:


6

優先値の範囲は?優先値の範囲は?

一般的に言えば、何かがフックされている優先順位をアプリオリに知ることはできません。必要な優先度は、他のコールバックのフック方法によって異なります。多くの場合、これはデフォルト値の10ですが、PHP_INT_MIN(負の整数も整数である)どこにでもPHP_INT_MAXある可能性があり、実験と、可能であれば(コアや、特に関心のあるテーマやプラグインと同様に、ソースを調べます。


1
ありがとう。コアには、この情報を提供するための小さな組み込みユーティリティが必要です。
j08691 2015年

それは正しい情報ではなく、答えることはできません。Mohammed Asifは正しく答えました。has_filter( 'init'、 'some_hook')を使用すると、優先度のアクションが何であるかを知ることができます。
ЮраКосяк

5

WordPressは、アクションをインデックス付きの優先順位を持つ配列に入れます。これは、(管理パネルでadmin_init)印刷して確認できます$wp_filter

* 注意 * @s_ha_dumは以下のコメントで指摘されているように、アクションに追加されたすべてのフックをadmin_initキャッチない場合があり、より信頼性の高い印刷がshutdown代わりにフックされる場合があります。

function filter_print() {
    global $wp_filter;
    print_r( $wp_filter['admin_bar_menu'] );
    die();
}
add_action( 'admin_init', 'filter_print' );

これにより、次のようなきちんとした配列が得られます:(簡略化)

Array(
    [admin_bar_menu] => Array (
        [0] => Array (
            [wp_admin_bar_my_account_menu] => Array (
                [function] => wp_admin_bar_my_account_menu
                [accepted_args] => 1
            )
            [wp_admin_bar_sidebar_toggle] => Array (
                [function] => wp_admin_bar_sidebar_toggle
                [accepted_args] => 1
            )
        )

        [4] => Array (
            [wp_admin_bar_search_menu] => Array (
                [function] => wp_admin_bar_search_menu
                [accepted_args] => 1
            )
        )

        [7] => Array (
            [wp_admin_bar_my_account_item] => Array (
                [function] => wp_admin_bar_my_account_item
                [accepted_args] => 1
            )
        )

        [10] => Array (
            [wp_admin_bar_wp_menu] => Array (
                [function] => wp_admin_bar_wp_menu
                [accepted_args] => 1
            )
        )

        [20] => ...
    )
)

0、4、7、10などはアクションの優先度です。新しいアクションが追加されると、デフォルトで10に設定されます。上記の例のインデックス0と同様に、それらは配列の同じインデックスにスタックされます。多くのフックがこの特定のアクションに追加されることを考えると、特定のアクション(メニューなど)が実行された後、最後に、または最後にしたいでしょう。2つの優先度の1にも同じように効果的に働くことができ:81または201

ほとんどの場合、デフォルトの優先度10で十分です。また、フックを直接追加したい場合(目的を無効にしたり、特定のアイテムを削除したりする場合など)は、を使用して、global $wp_filter;必要な場所を特定できます。


私はこれについて考えましたが、それは前または前にadmin_init フックされたものと現在のインストールでフックされたものだけを表示するつもりです。まだアンインストールされているプラ​​グインやテーマが何をするのかについては何も述べていません。とにかく+1。
s_ha_dum 2015年

@s_ha_dumそれは良い点ですが、あなたはそのようなものを使うこともできると思いadmin_footerますか?それとも同じ問題でしょうか?
Howdy_McGee

1
shutdownフックは、だけインストールされたコードのために、あなたの最善の策だろうと、いくつかのとにかくを欠場することが可能であるので、その後も、物事は条件付きでフックすることができます。
s_ha_dum


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.