Tentando usar add_action e do_action com parâmetros

4

Nos meus temas functions.php eu estou tentando adicionar uma função com parâmetros (como um teste se isso funciona, não para a funcionalidade) e simplesmente não funciona.

Os parâmetros sempre chegam vazios, mesmo se eu chamar do_action com os parâmetros enfileirados como sugerido nesta página do códice .

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);
    
por mebu83 15.01.2015 / 11:05

1 resposta

6

Você está usando errado.

  • add_action : anexa uma função a um gancho de ação. Em seu código, você está anexando alter_item funtion ao admin_menu action hook. Então, quando a ação admin_menu acontece, alter_item function é executada. De acordo com o codex , nenhum parâmetro é passado para as funções anexadas a admin_menu . Portanto, os parâmetros que você está tentando usar em alter_item não são válidos.

  • do_action : invoca todas as funções anexadas a um gancho de ação. Em seu código, você está invocando todas as funções anexadas ao gancho de ação alter_item . alter_item action hook seria um hook de ação customizado, já que não está no core do WP, mas atualmente no seu código não há nenhuma função anexada a esta ação, então nada acontecerá com o seu do_action('alter_item'... .

A maneira correta de anexar uma função a 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 );

A maneira correta de definir ações personalizadas:

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

Depois, você pode anexar funções à ação alter_item da seguinte forma:

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
}

Se você quiser passar informações para as ações principais, você pode:

  • use os parâmetros válidos para cada ação. Consulte a documentação oficial de cada ação.
  • defina variáveis globais, use opções, transiets ou propriedades / métodos de objetos personalizados, para que você possa usar essas informações em diferentes locais do seu código. Exemplo .
  • Use funções anônimas do PHP com use keyword.

Exemplo usando a palavra-chave 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;
    }
} );
    
por cybmeta 15.01.2015 / 12:29