Come rimuovere un'azione da un plugin?
Ho un plugin che aggiunge la seguente azione che, tra le altre cose, invia una mail di registrazione quando viene aggiunto un nuovo utente:
add_action('um_post_registration_approved_hook', 'um_post_registration_approved_hook', 10, 2);
Vorrei rimuovere questa azione, così posso aggiungerla nuovamente con alcuni controlli aggiuntivi nella funzione chiamata. Ho provato quanto segue, ma non riesco a farlo funzionare:
add_action( 'um_post_registration_approved_hook', 'remove_my_action', 11 );
function remove_my_action(){
remove_action('um_post_registration_approved_hook', 'um_post_registration_approved_hook', 10, 2);
}
Qualche idea?
MODIFICA
Si è scoperto che avevo sbagliato la priorità, grazie! Ora sono in grado di rimuovere l'azione e registrarne una nuova. Tuttavia, sto avendo alcuni problemi con questo. Ecco cosa ho deregistrato:
add_action('um_post_registration_approved_hook', 'um_post_registration_approved_hook', 10, 2);
function um_post_registration_approved_hook($user_id, $args){
// Gestisce l'approvazione
global $ultimatemember;
$ultimatemember->user->approve();
}
Ho quindi registrato quanto segue al suo posto:
add_action( 'um_post_registration_approved_hook', 'remove_my_action', 9 );
function remove_my_action(){
remove_action('um_post_registration_approved_hook', 'um_post_registration_approved_hook', 10, 2);
add_action('um_post_registration_approved_hook', 'um_post_registration_approved_hook_new', 10, 2);
}
function um_post_registration_approved_hook_new($user_id, $args){
newApprove();
}
// Fa chiamare all'azione un'altra versione di questa funzione - controlla per user meta - paupress_pp_user_type
function newApprove(){
global $ultimatemember;
$user_id = um_user('ID');
delete_option( "um_cache_userdata_{$user_id}" );
if ( um_user('account_status') == 'awaiting_admin_review' ) {
$this->password_reset_hash();
$ultimatemember->mail->send( um_user('user_email'), 'approved_email' );
} else {
// controlla paupress_pp_user_type prima dell'invio
$this->password_reset_hash();
// NON INVIARE QUESTA MAIL
//$ultimatemember->mail->send( um_user('user_email'), 'welcome_email');
}
$this->set_status('approved');
$this->delete_meta('account_secret_hash');
$this->delete_meta('_um_cool_but_hard_to_guess_plain_pw');
do_action('um_after_user_is_approved', um_user('ID') );
}
Che è semplicemente un'altra versione della funzione approve() originale, con la notifica mail rimossa. MA questo non funziona, poiché l'approve() originale è definito all'interno della classe UM_user e la funzione si basa su questo. Il file originale è qui, con la funzione approve() definita dalla riga 941: http://pastebin.com/FknrcxzM
Il mio problema ha senso? E posso agganciarmi alla classe invece che alla funzione? - Non conosco davvero l'approccio corretto qui...
Vuoi:
remove_action('um_post_registration_approved_hook', 'um_post_registration_approved_hook', 10, 2);
... che venga eseguito dopo l'originale add_action
, ma prima che l'azione attivi la funzione um_post_registration_approved_hook
Il modo più semplice per farlo, anche se non l'ho testato, potrebbe essere quello di assegnare alla tua rimozione una priorità più alta sullo stesso hook:
add_action( 'um_post_registration_approved_hook', 'remove_my_action', 9 );
function remove_my_action(){
remove_action('um_post_registration_approved_hook', 'um_post_registration_approved_hook', 10, 2);
}
Questo è quello che stavi provando a fare, ma la priorità era invertita. 11
viene eseguito dopo 10
.

Ma remove_action non dovrebbe essere eseguito all'interno di una funzione per funzionare? Sono abbastanza sicuro di averlo visto nella documentazione da qualche parte.

Devi solo assicurarti che venga eseguito dopo l'originale add_action e prima che l'azione venga attivata. Quindi puoi metterlo in una funzione ma usando un hook più appropriato. Qual è il contesto per l'add_action? Senza questo non possiamo scegliere un hook per il remove. Cosa attiva l'azione um_?

Sto andando piano - so cosa ti serve - un attimo mentre modifico la risposta.

Grazie! Ho appena verificato - il primo suggerimento con solo la riga remove_action non funziona né in functions.php né in un altro plugin.

Sì - penso che tu abbia semplicemente la priorità sbagliata. Prova con 9 e non 11. Se non funziona allora dobbiamo usare un hook diverso.

Grazie. Ora funziona; riesco a rimuovere l'azione e registrarne un'altra al suo posto. Tuttavia, la funzione che sto sostituendo è definita all'interno di una classe, e quando la sovrascrivo, smette di funzionare. Ho modificato la mia domanda; la spiegazione ha senso?

Ah. Essere dentro una classe cambia le regole! Abbi pazienza mentre controllo.

if(!function_exists('remove_my_action')){
function remove_my_action(){
remove_action( 'storefront_header', 'storefront_secondary_navigation', 30 );
remove_action( 'storefront_header', 'storefront_header_container_close', 41 );
remove_action( 'storefront_header', 'storefront_primary_navigation_wrapper', 42 );
remove_action( 'storefront_header', 'storefront_primary_navigation', 50 );
remove_action( 'storefront_header', 'storefront_primary_navigation_wrapper_close', 68 );
}
}
add_action( 'init', 'remove_my_action', 99);
Funziona perfettamente, ho testato utilizzando questo snippet.
Nota: In Remove Action la priorità dell'azione deve essere la stessa di quella utilizzata quando si aggiunge un'azione.
