Cum să elimini o acțiune din plugin?

29 sept. 2016, 11:24:13
Vizualizări: 29.2K
Voturi: 1

Am un plugin care adaugă următoarea acțiune care, printre altele, trimite un email de înregistrare când este adăugat un utilizator nou:

add_action('um_post_registration_approved_hook', 'um_post_registration_approved_hook', 10, 2);

Aș dori să elimin această acțiune pentru a o putea adăuga din nou cu niște verificări suplimentare în funcția apelată. Am încercat următoarele, dar nu reușesc să o fac să funcționeze:

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);
}

Vreo idee?

EDITARE

Se pare că am avut prioritatea greșită, mulțumesc! Acum pot să elimin acțiunea și să înregistrez una nouă în schimb. Totuși, acum am niște probleme cu asta. Iată ce am dezînregistrat:

add_action('um_post_registration_approved_hook', 'um_post_registration_approved_hook', 10, 2);

    function um_post_registration_approved_hook($user_id, $args){
        // Se obține instanța globală
        global $ultimatemember;

        $ultimatemember->user->approve();
    }

Apoi am înregistrat următoarele în schimb:

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();
}

// Face ca acțiunea să apeleze o altă versiune a acestei funcții - verifică pentru 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 {
        // verifică paupress_pp_user_type înainte de trimitere
        $this->password_reset_hash();
        // NU TRIMITE ACEST EMAIL
        //$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') );
}

Care este pur și simplu o altă versiune a funcției originale approve(), cu notificarea prin email eliminată. DAR aceasta nu funcționează, deoarece approve() original este definit în interiorul clasei UM_user și funcția se bazează pe aceasta. Fișierul original este aici, cu funcția approve() definită de la linia 941: http://pastebin.com/FknrcxzM

Are sens problema mea? Și pot să mă conectez la clasă în loc de funcție? - Nu știu care este abordarea corectă aici...

4
Comentarii

Pentru a începe să răspund la a doua întrebare, se pare că referințele la this nu au unde să meargă. Dacă am înțeles corect codul de aici, acesta nu este obiectul $ultimatemember? Dacă schimbi this în numele corect al obiectului, atunci ar putea fi suficient în acest caz.

Andy Macaulay-Brook Andy Macaulay-Brook
29 sept. 2016 12:33:18

Mulțumesc. Din păcate, schimbarea lui this în $ultimatemember nu funcționează. Se află în class UM_User { function __construct() { $this->id = 0;, deci s-ar putea să se refere la obiectul UM_User?

user2806026 user2806026
29 sept. 2016 13:45:29

Voi crea o nouă întrebare. Mulțumesc pentru ajutorul tău aici :-)

user2806026 user2806026
29 sept. 2016 13:48:53

Super - probabil vei atrage mai multă atenție în felul acesta! S-ar putea să vrei să editezi întrebarea înapoi la versiunea mai scurtă în același timp, pentru a păstra formatul site-ului ordonat.

Andy Macaulay-Brook Andy Macaulay-Brook
29 sept. 2016 13:49:41
Toate răspunsurile la întrebare 2
8

Doriți:

remove_action('um_post_registration_approved_hook', 'um_post_registration_approved_hook', 10, 2);

... să ruleze după add_action original, dar înainte ca acțiunea să declanșeze funcția um_post_registration_approved_hook

Cea mai simplă metodă, deși netestată, ar putea fi să dați prioritate mai mare acțiunii de eliminare pe același 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);
}

Aceasta este ceea ce ați încercat, dar prioritatea era inversată. 11 rulează după 10.

29 sept. 2016 11:35:55
Comentarii

Dar nu ar trebui ca remove_action să ruleze într-o funcție pentru a funcționa? Sunt sigur că am văzut asta în documentație undeva.

user2806026 user2806026
29 sept. 2016 11:37:51

Trebuie doar să te asiguri că rulează după add_action original și înainte ca acțiunea să fie declanșată. Deci poți să-l pui într-o funcție dar să folosești un hook mai potrivit. Care este contextul pentru add_action? Fără asta nu putem alege un hook pentru remove. Ce declanșează acțiunea um_?

Andy Macaulay-Brook Andy Macaulay-Brook
29 sept. 2016 11:40:29

Sunt mai lent acum - știu de ce ai nevoie - dă-mi o secundă să editez răspunsul.

Andy Macaulay-Brook Andy Macaulay-Brook
29 sept. 2016 11:41:29

Mulțumesc! Tocmai am confirmat - prima sugestie cu doar linia remove_action nu funcționează nici în functions.php și nici într-un alt plugin.

user2806026 user2806026
29 sept. 2016 11:53:30

Da - cred că ai prioritatea greșită. Încearcă cu 9 și nu 11. Dacă nu funcționează, atunci trebuie să folosim un alt hook.

Andy Macaulay-Brook Andy Macaulay-Brook
29 sept. 2016 11:57:09

Mulțumesc. Acum funcționează; am reușit să elimin acțiunea și să înregistrez alta în loc. Totuși, funcția pe care o suprascriu este definită în interiorul unei clase, iar când o suprascriu, încetează să mai funcționeze. Am editat întrebarea mea; explicația are sens?

user2806026 user2806026
29 sept. 2016 12:20:52

Ah. În interiorul unei clase se schimbă regulile! Ai răbdare cu mine în timp ce verific.

Andy Macaulay-Brook Andy Macaulay-Brook
29 sept. 2016 12:26:53

Aceasta este cu totul altă întrebare, de fapt.

Andy Macaulay-Brook Andy Macaulay-Brook
29 sept. 2016 12:30:39
Arată celelalte 3 comentarii
0
if(!function_exists('remove_my_action')){
    function remove_my_action(){
        // Elimină acțiunile pentru navigația secundară din header
        remove_action( 'storefront_header', 'storefront_secondary_navigation', 30 );
        // Elimină acțiunea de închidere a containerului header
        remove_action( 'storefront_header', 'storefront_header_container_close', 41 );
        // Elimină wrapper-ul pentru navigația primară
        remove_action( 'storefront_header', 'storefront_primary_navigation_wrapper', 42 );
        // Elimină navigația primară
        remove_action( 'storefront_header', 'storefront_primary_navigation', 50 );
        // Elimină închiderea wrapper-ului pentru navigația primară
        remove_action( 'storefront_header', 'storefront_primary_navigation_wrapper_close', 68 );
    }
}
// Adaugă acțiunea la inițializarea WordPress cu prioritate mare (99)
add_action( 'init', 'remove_my_action', 99);

Funcționează perfect, am testat folosind acest fragment de cod.

Notă: În Remove Action, prioritatea acțiunii trebuie să fie aceeași cu cea folosită la adăugarea acțiunii inițiale.

19 dec. 2019 05:28:09