¿Cómo eliminar una acción de un plugin?
Tengo un plugin que agrega la siguiente acción que, entre otras cosas, envía un correo de registro cuando se agrega un nuevo usuario:
add_action('um_post_registration_approved_hook', 'um_post_registration_approved_hook', 10, 2);
Me gustaría eliminar esta acción para poder agregarla nuevamente con algunas verificaciones adicionales en la función llamada. He intentado lo siguiente, pero no logro que funcione:
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);
}
¿Alguna idea?
EDICIÓN
Resulta que tenía la prioridad incorrecta, ¡gracias! Ahora puedo eliminar la acción y registrar una nueva en su lugar. Sin embargo, ahora estoy teniendo algunos problemas con eso. Esto es lo que he anulado:
add_action('um_post_registration_approved_hook', 'um_post_registration_approved_hook', 10, 2);
function um_post_registration_approved_hook($user_id, $args){
// Función original del hook
global $ultimatemember;
$ultimatemember->user->approve();
}
Luego he registrado lo siguiente en su lugar:
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();
}
// Hacer que la acción llame a otra versión de esta función - verificar meta de usuario - 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 {
// verificar paupress_pp_user_type antes de enviar
$this->password_reset_hash();
// NO ENVIAR ESTE CORREO
//$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') );
}
Que es simplemente otra versión de la función approve() original, con la notificación por correo eliminada. PERO esto no funciona, ya que el approve() original está definido dentro de la clase UM_user y la función depende de esto. El archivo original está aquí, con la función approve() definida desde la línea 941: http://pastebin.com/FknrcxzM
¿Tiene sentido mi problema? ¿Y puedo conectarme a la clase en lugar de la función? - Realmente no sé cuál es el enfoque correcto aquí...
Quieres:
remove_action('um_post_registration_approved_hook', 'um_post_registration_approved_hook', 10, 2);
... que se ejecute después del add_action
original, pero antes de que la acción active la función um_post_registration_approved_hook
La forma más fácil de hacer esto, aunque no lo he probado, podría ser simplemente darle a tu eliminación una prioridad anterior en el mismo 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);
}
Esto es lo que estabas intentando, pero la prioridad estaba al revés. 11
se ejecuta después de 10
.

¿Pero no debería remove_action ejecutarse dentro de una función para que funcione? Estoy bastante seguro de haber visto eso en la documentación en alguna parte.

Solo necesitas asegurarte de que se ejecute después del add_action original y antes de que se dispare la acción. Así que puedes ponerlo en una función pero usar un hook más apropiado. ¿Cuál es el contexto para el add_action? Sin eso no podemos elegir un hook para el remove. ¿Qué dispara la acción um_?

Estoy siendo lento - sé lo que necesitas - un segundo mientras edito la respuesta.

¡Gracias! Acabo de confirmar - la primera sugerencia con solo la línea remove_action no funciona ni en functions.php ni en otro plugin.

Sí - creo que tienes la prioridad incorrecta. Prueba con 9 y no con 11. Si eso falla, entonces necesitamos usar un hook diferente.

Gracias. Ahora funciona; puedo eliminar la acción y registrar otra en su lugar. Sin embargo, la función que estoy reemplazando está definida dentro de una clase, y cuando la sobreescribo, deja de funcionar. He editado mi pregunta; ¿tiene sentido la explicación?

Ah. ¡Dentro de una clase cambia las reglas! Ten paciencia mientras reviso.

if(!function_exists('remove_my_action')){
function remove_my_action(){
// Eliminar acciones específicas del tema Storefront
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);
Está funcionando correctamente, he probado este fragmento de código.
Nota: En Remove Action, la prioridad de la acción debe ser la misma que se usó al agregar la acción.
