如何从插件中删除动作?

时间:2016-09-29 作者:user2806026

我有一个插件,它添加了以下操作,其中包括在添加新用户时发送注册邮件:

add_action(\'um_post_registration_approved_hook\', \'um_post_registration_approved_hook\', 10, 2);
我想删除此操作,以便通过在调用的函数中进行一些额外检查来再次添加它。我尝试了以下方法,但未能成功:

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);
}
有什么想法吗?

EDIT

原来我的优先级错了,谢谢!我现在可以删除该操作并注册一个新操作。然而,我现在对此有一些问题。这是我取消注册的内容:

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

    function um_post_registration_approved_hook($user_id, $args){

        global $ultimatemember;

        $ultimatemember->user->approve();

    }
然后,我注册了以下内容:

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

// Make the action call another version of this function - check for 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 {

        // check for paupress_pp_user_type before sending

        $this->password_reset_hash();
        // DONT SEND THIS 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\') );

}
它只是原始approve()函数的另一个版本,删除了邮件通知。但这不起作用,因为最初的approve()是在UM\\u用户类中定义的,函数依赖于此。原始文件位于此处,第941行定义了approve()函数:http://pastebin.com/FknrcxzM

我的问题有意义吗?我可以钩住类而不是函数吗?-我真的不知道这里的正确方法。。

2 个回复
最合适的回答,由SO网友:Andy Macaulay-Brook 整理而成

您需要:

remove_action(\'um_post_registration_approved_hook\', \'um_post_registration_approved_hook\', 10, 2);
。。。在原始文件之后运行add_action, 但在动作触发函数之前um_post_registration_approved_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);
}
这是你一直在尝试的,但优先顺序是错误的。11 追求10.

SO网友:Zahid Ali Keerio

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);
通过使用这个片段,我测试了它的工作性能。

注意:在删除操作中,操作的优先级应与添加操作中使用的优先级相同。

相关推荐

致命错误:未捕获错误:无法将WP_ERROR类型的对象用作/../plugins/rm-payment.php中的数组

我使用2个WordPress站点、1个WordPress站点到2个WordPress站点的远程支付系统。第一个是主网站;第二个网站的工作方式类似于处理贝宝支付的商户网站。我们将第一个网站的用户订单详细信息提取到第二个网站,以处理贝宝付款。但在获取第二个网站的网页时出现错误,但请记住,如果重新加载它一次,问题就解决了致命错误:未捕获错误:无法将WP\\u error类型的对象用作/中的数组/插件/rm支付。php:第231行 $response = wp_remote_post( $remote_url,