web-dev-qa-db-fra.com

Essayez d'utiliser add_action et do_action avec les paramètres

Dans mes thèmes functions.php, j'essaie d'ajouter une fonction avec des paramètres (comme test si cela fonctionne, pas pour la fonctionnalité) et cela ne fonctionne tout simplement pas.

Les paramètres arrivent toujours vides même si j'appelle do_action avec les paramètres mis en file d'attente comme suggéré dans cette page de codex .

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

Vous l'utilisez mal.

  • add_action: attache une fonction à un hook d’action. Dans votre code, vous attachez la fonction alter_item au __ hook action admin_menu. Ainsi, lorsque l’action admin_menu se produit, la fonction alter_item est exécutée. Selon codex , aucun paramètre n'est transmis aux fonctions attachées à admin_menu. Ainsi, les paramètres que vous essayez d'utiliser dans alter_item ne sont pas valides.

  • do_action: appelle toutes les fonctions attachées à un hook d’action. Dans votre code, vous appelez toutes les fonctions attachées au hook d'action alter_item. Le crochet d'action alter_item serait un crochet d'action personnalisé, car ce n'est pas dans le noyau WP, mais actuellement dans votre code, aucune fonction n'est attachée à cette action, donc rien ne se passera avec votre do_action('alter_item'....

La manière correcte d'attacher une fonction à admin_menu est la suivante:

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

La manière correcte de définir des actions personnalisées:

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

Ensuite, vous pouvez attacher des fonctions à l'action alter_item comme ceci:

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
}

Si vous souhaitez transmettre des informations aux actions principales, vous pouvez:

  • utilisez les paramètres valides pour chaque action. Reportez-vous à la documentation officielle de chaque action.
  • définissez des variables globales, utilisez des options, des transiets ou des propriétés/méthodes d'objets personnalisés pour pouvoir utiliser ces informations à différents endroits de votre code. Exemple .
  • Utilisez PHP fonctions anonymes avec le mot clé use.

Exemple d'utilisation du mot clé 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