Intentando usar add_action y do_action con parámetros

4

En mis temas functions.php trato de agregar una función con parámetros (como prueba si esto funciona, no para la funcionalidad) y simplemente no funciona.

Los parámetros siempre aparecen vacíos incluso si llamo a do_action con los parámetros encolados como se sugiere en esta página de 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);
    
pregunta mebu83 15.01.2015 - 11:05

1 respuesta

6

Lo estás usando mal.

  • add_action : asocia una función a un gancho de acción. En su código, está adjuntando alter_item funtion a admin_menu action hook. Entonces, cuando ocurre la acción admin_menu , se ejecuta la función alter_item . De acuerdo con el códice , no se pasan parámetros a las funciones asociadas a admin_menu . Por lo tanto, los parámetros que intenta utilizar en alter_item no son válidos.

  • do_action : invoca todas las funciones asociadas a un gancho de acción. En su código, está invocando todas las funciones vinculadas al gancho de acción alter_item . El gancho de acción alter_item sería un gancho de acción personalizado, ya que no está en el núcleo de WP, pero actualmente en su código no hay funciones adjuntas a esta acción, por lo que no ocurrirá nada con su do_action('alter_item'... .

La forma correcta de adjuntar una función a admin_menu es:

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

La forma correcta de definir acciones personalizadas:

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

Luego puedes adjuntar funciones a alter_item action como esta:

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 desea pasar información a acciones centrales, puede:

  • use los parámetros válidos para cada acción. Consulte la documentación oficial de cada acción.
  • defina variables globales, use las opciones, transiets u propiedades / métodos de objetos personalizados, para que pueda usar esa información en diferentes lugares de su código. Ejemplo .
  • Use las funciones anónimas de PHP con la palabra clave use .

Ejemplo usando la palabra clave 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;
    }
} );
    
respondido por el cybmeta 15.01.2015 - 12:29

Lea otras preguntas en las etiquetas