¿Cómo eliminar una acción de un plugin?

29 sept 2016, 11:24:13
Vistas: 29.2K
Votos: 1

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

4
Comentarios

Para comenzar a responder tu segunda pregunta, parece que las referencias a this no tienen a dónde ir. Si entiendo correctamente el código, ¿ese no es el objeto $ultimatemember? Si cambias this por el nombre correcto del objeto, eso podría ser suficiente en este caso.

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

Gracias. Desafortunadamente, cambiar this por $ultimatemember no funciona. Está en class UM_User { function __construct() { $this->id = 0;, por lo que podría estar haciendo referencia al objeto UM_User?

user2806026 user2806026
29 sept 2016 13:45:29

Crearé una nueva pregunta. Gracias por tu ayuda aquí :-)

user2806026 user2806026
29 sept 2016 13:48:53

Genial, probablemente así atraerás más atención. Quizás quieras editar esta pregunta y volver a la versión más corta al mismo tiempo para mantener el formato del sitio ordenado.

Andy Macaulay-Brook Andy Macaulay-Brook
29 sept 2016 13:49:41
Todas las respuestas a la pregunta 2
8

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.

29 sept 2016 11:35:55
Comentarios

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

user2806026 user2806026
29 sept 2016 11:37:51

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

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

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

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

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

user2806026 user2806026
29 sept 2016 11:53:30

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

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

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?

user2806026 user2806026
29 sept 2016 12:20:52

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

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

Esa es una pregunta completamente diferente en realidad.

Andy Macaulay-Brook Andy Macaulay-Brook
29 sept 2016 12:30:39
Mostrar los 3 comentarios restantes
0
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.

19 dic 2019 05:28:09