web-dev-qa-db-ja.com

Add_actionとdo_actionをパラメータと一緒に使用しようとしています

私のテーマではfunctions.php私は(これは機能のためではなく、動作するかどうかのテストとして)パラメータを持つ関数を追加しようとし、それは単に動作しません。

この codexページ で提案されているようにキューに入れられたパラメータでdo_actionを呼び出しても、パラメータは常に空になります。

function alter_item ($user, $items, $action) {
    global $current_user, $menu;
    get_currentuserinfo();

    switch ($action) {
        case false:
            if ($current_user->user_login == $user) {
                remove_menu_page ($items);
            }
        break;

        case true:
            if ($current_user->user_login == $user) {
                remove_menu_page ($items);
            }
        break;
    }
}

add_action( 'admin_menu', 'alter_item', 10, 3 );
do_action('alter_item', 'my-user', 'plugins.php', false);
6
mebu83

あなたはそれを間違って使っています。

  • add_action:アクションフックに関数を添付します。あなたのコードでは、あなたはalter_item機能をadmin_menuアクションフックに付けています。そのため、admin_menuアクションが発生すると、alter_item関数が実行されます。 codex によると、admin_menuにアタッチされた関数にパラメータは渡されません。そのため、alter_itemで使用しようとしているパラメータは無効です。

  • do_action:アクションフックにアタッチされているすべての関数を呼び出します。あなたのコードでは、あなたはalter_itemアクションフックにアタッチされているすべての関数を呼び出しています。 WPコアにはないため、alter_itemアクションフックはカスタムアクションフックになりますが、現在のコードにはこのアクションに関連付けられた関数は0個あり、do_action('alter_item'...では何も起こりません。

関数をadmin_menuにアタッチする正しい方法は、次のとおりです。

function alter_item() {
    //Do whatever you want
}
//The priority argument (10 the code bellow) is optional.
add_action( 'admin_menu', 'alter_item', 10 );

カスタムアクションを定義する正しい方法:

do_action('alter_item', 'my-user', 'plugins.php', false);

それから、このようにalter_itemアクションに関数を添付することができます:

add_action( 'alter_item', 'alter_item_attached_function', 10, 3 );

function alter_item_attached_function( $user, $items, $action ) {
     //Now $user, $items and $action will be 'my-user', 'plugins.php' and false
}

コアアクションに情報を渡したい場合は、次のことができます。

  • 各アクションに有効なパラメーターを使用してください。各アクションの公式文書を参照してください。
  • グローバル変数を定義し、オプション、トランジット、またはカスタムオブジェクトのプロパティ/メソッドを使用するので、コードのさまざまな場所でその情報を使用できます。
  • useキーワードでPHP無名関数を使用してください。

useキーワードの使用例

$user = 'my-user';
$items = 'plugins.php';
$action = false;

add_action( 'admin_menu', function() use ($user, $items, $action) {
    global $current_user, $menu;
    get_currentuserinfo();
    switch ($action) {
        case false:
            if ($current_user->user_login == $user) {
                remove_menu_page ($items);
            }
        break;

        case true:
            if ($current_user->user_login == $user) {
                remove_menu_page ($items);
            }
        break;
    }
} );
8
cybmeta