Come rimuovere un'azione da un plugin?

29 set 2016, 11:24:13
Visualizzazioni: 29.2K
Voti: 1

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...

4
Commenti

Per iniziare a rispondere alla tua seconda domanda, sembra che i riferimenti a this non abbiano un posto dove andare. Se ho capito bene il codice qui, quello non è l'oggetto $ultimatemember? Se cambi this con il nome corretto dell'oggetto, potrebbe essere sufficiente in questo caso.

Andy Macaulay-Brook Andy Macaulay-Brook
29 set 2016 12:33:18

Grazie. Purtroppo cambiare this con $ultimatemember non funziona. Si trova nel class UM_User { function __construct() { $this->id = 0;, quindi potrebbe riferirsi all'oggetto UM_User?

user2806026 user2806026
29 set 2016 13:45:29

Creerò una nuova domanda. Grazie per il tuo aiuto qui :-)

user2806026 user2806026
29 set 2016 13:48:53

Fantastico - probabilmente attirerai più attenzione in questo modo! Potresti voler modificare questa domanda riportandola alla versione più breve nello stesso momento, così manterrai il formato del sito ordinato.

Andy Macaulay-Brook Andy Macaulay-Brook
29 set 2016 13:49:41
Tutte le risposte alla domanda 2
8

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.

29 set 2016 11:35:55
Commenti

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.

user2806026 user2806026
29 set 2016 11:37:51

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_?

Andy Macaulay-Brook Andy Macaulay-Brook
29 set 2016 11:40:29

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

Andy Macaulay-Brook Andy Macaulay-Brook
29 set 2016 11:41:29

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

user2806026 user2806026
29 set 2016 11:53:30

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

Andy Macaulay-Brook Andy Macaulay-Brook
29 set 2016 11:57:09

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?

user2806026 user2806026
29 set 2016 12:20:52

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

Andy Macaulay-Brook Andy Macaulay-Brook
29 set 2016 12:26:53

Questa è una domanda completamente diversa in realtà.

Andy Macaulay-Brook Andy Macaulay-Brook
29 set 2016 12:30:39
Mostra i restanti 3 commenti
0
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.

19 dic 2019 05:28:09