Cum să elimini o acțiune din plugin?
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...
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
.

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.

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

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

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.

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

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?

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

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.
