web-dev-qa-db-ja.com

Add_action()での優先順位を使用するかを知る方法

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

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');
    }
}

docs 優先順位パラメーターの状態の場合:

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

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

また、デフォルトの優先順位は10ですが、既知の優先順位値の範囲はありますか。

8
j08691

優先順位の値の範囲優先順位の値の範囲

一般的に言って、あなたは アプリオリに 何かがフックされている優先順位を知ることができません。必要とされる優先順位は、他のコールバックがどのように接続されたかによって異なります。多くの場合、これはデフォルト値の10ですが、1からPHP_INT_MAXの間のどこでもかまいません。ソースを調べて、あなたが特に関心を持っているテーマやプラグイン。

5
s_ha_dum

WordPressは、インデックス付けされた優先度でアクションを配列に入れます。これは、(管理パネルadmin_initで)$wp_filterを印刷することで確認できます。

**@s_ha_dumは以下のコメントで指摘しているように、admin_initはそうではないcatchallはアクションにフックを追加しました。代わりに、より信頼性の高い印刷が 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などはアクションの優先順位です。新しいアクションが追加されると、上記の例のインデックス0と同様にデフォルトで10になり、配列の同じインデックスにスタックされます。 。この特定のアクションに多くのフックが追加されることを考慮すると、特定のアクション(メニューなど)の最後または最後に実行する必要があります。 2つの優先順位のうちの1つ(81または201)も同様に効果的に機能します。

ほとんどの場合、デフォルトの優先順位10で十分です。また、フックを次々と直接追加したい場合(その目的を無効にするか、特定のアイテムを削除する場合)には、global $wp_filter;を使用して、どこに行く必要があるかを判断できます。

4
Howdy_McGee

さて、行動の優先順位を見つける方法があります。

次のcodehas_action( $tag, $function_to_check )を使うことができます。これは指定された関数のフックの優先順位をオプションで返します。

参照: https://codex.wordpress.org/Function_Reference/has_action

1
Mohammed Asif