Tentativo di utilizzare add_action e do_action con parametri
Nel file functions.php del mio tema sto cercando di aggiungere una funzione con parametri (come test per verificare se funziona, non per la funzionalità) e semplicemente non funziona.
I parametri arrivano sempre vuoti anche se chiamo do_action con i parametri accodati come suggerito in questa pagina del 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);
Lo stai usando in modo sbagliato.
add_action
: collega una funzione a un hook di azione. Nel tuo codice, stai collegando la funzionealter_item
all'hook di azioneadmin_menu
. Quindi, quando avviene l'azioneadmin_menu
, viene eseguita la funzionealter_item
. Secondo il codex, nessun parametro viene passato alle funzioni collegate aadmin_menu
. Pertanto, i parametri che stai cercando di usare inalter_item
non sono validi.do_action
: invoca tutte le funzioni collegate a un hook di azione. Nel tuo codice, stai invocando tutte le funzioni collegate all'hook di azionealter_item
.alter_item
sarebbe un hook di azione personalizzato, poiché non è nel core di WP, ma attualmente nel tuo codice non ci sono funzioni collegate a questa azione, quindi non succederà nulla con il tuodo_action('alter_item'...
.
Il modo corretto per collegare una funzione a admin_menu
è:
function alter_item() {
//Fai quello che vuoi
}
//L'argomento priority (10 nel codice sotto) è opzionale.
add_action( 'admin_menu', 'alter_item', 10 );
Il modo corretto per definire azioni personalizzate:
do_action('alter_item', 'my-user', 'plugins.php', false);
Quindi puoi collegare funzioni all'azione alter_item
in questo modo:
add_action( 'alter_item', 'alter_item_attached_function', 10, 3 );
function alter_item_attached_function( $user, $items, $action ) {
//Ora $user, $items e $action saranno 'my-user', 'plugins.php' e false
}
Se vuoi passare informazioni alle azioni core, puoi:
- usare i parametri validi per ogni azione. Fai riferimento alla documentazione ufficiale di ogni azione.
- definire variabili globali, usare opzioni, transients o proprietà/metodi di oggetti personalizzati, così puoi usare quelle informazioni in diversi punti del tuo codice. Esempio.
- Usare funzioni anonime PHP con la parola chiave
use
.
Esempio usando la parola chiave 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;
}
} );

WOW, è molto più complicato di quanto immaginassi, ma ha perfettamente senso, grazie cybmeta!

Downvotato, perché le chiamate a funzioni anonime tramite action_hooks non possono essere scollegate. Questa è davvero una cattiva pratica, perché significa che altri non possono rimuovere/sostituire la chiamata. Gli action hook dovrebbero SEMPRE essere implementati correttamente.
Esempio:
add_action('some_action_hook', 'some_function'); // Questo è corretto e può essere rimosso via remove_action().
add_action('admin_menu', function() { // roba }); // questo è sbagliato, perché ora non c'è modo di usare remove_action per rimuovere questo comportamento.
Davvero, questo metodo è solo pigro e approssimativo e non c'è una vera ragione valida per doverlo usare, a parte la pigrizia :)

Non sono d'accordo con te. Ci possono essere situazioni in cui l'uso di funzioni anonime agganciate ad action e filter può essere totalmente giustificato. Inoltre, devi sapere che le funzioni anonime possono essere scollegate (in un modo molto sporco lo ammetto). Comunque, era solo un esempio tra le tante possibilità di cui ho parlato (variabili globali, opzioni, transient, proprietà di oggetti, .....). Rileggi la risposta con più attenzione, non essere pigro nella lettura ;)
