WordPress终极会员插件-设置用户状态为等待管理员批准

ergxz8rk  于 5个月前  发布在  WordPress
关注(0)|答案(3)|浏览(67)

WordPress终极会员(UM)插件允许我们通过wp-admin将新注册的用户设置为“待定”。
Pending函数做两件事:

  • 将用户状态设置为“等待管理员批准”
  • 向用户发送电子邮件

请看这里:

function pending(){ 
global $ultimatemember; 
$this->set_status('awaiting_admin_review'); 
$ultimatemember->mail->send( um_user('user_email'), 'pending_email' );

字符串
但是,如果用户编辑现有帐户,则无法将现有用户设置为“待定”管理员批准。
我不是很擅长PHP,但我发现了一个挂钩到'um_user_edit_profile'操作,所以如果现有用户编辑他们的配置文件,状态将更改为'pending'。
请看这里:

// Set profile to under pending after edits
add_action('um_user_edit_profile', 'um_post_edit_pending_hook', 10, 2); 
function um_post_edit_pending_hook($user_id, $args){ 
if ( is_super_admin() ) {
    return false;
    } else { 
        global $ultimatemember; 
        $ultimatemember->user->pending(); 
    }
}


不幸的是,我刚刚发现'um_user_edit_profile'操作也在注册时使用,所以我的钩子也在注册时触发,导致两封电子邮件被发送。
我试图通过以下方式来克服这一点:
添加和if语句,以便仅为登录的用户触发操作:

// Set profile to under review after edits
add_action('um_user_edit_profile', 'um_post_edit_pending_hook', 10, 2); 
function um_post_edit_pending_hook($user_id, $args){ 
if ( is_super_admin() ) {
    return false;
    } else {
if ( is_user_logged_in() ) {
        global $ultimatemember; 
        $ultimatemember->user->pending();
    }
}


通过尝试将状态设置为“等待管理员批准”,而不包括电子邮件:

// Set profile to under review after edits
add_action('um_user_edit_profile', 'um_post_edit_pending_hook', 10, 2); 
function um_post_edit_pending_hook($user_id, $args){ 
if ( is_super_admin() ) {
    return false;
    } else { 
        global $ultimatemember; 
        $ultimatemember->set_status('awaiting_admin_review');
    }
}

// Set profile to under review after edits
add_action('um_user_edit_profile', 'um_post_edit_pending_hook', 10, 2); 
function um_post_edit_pending_hook($user_id, $args){ 
if ( is_super_admin() ) {
    return false;
    } else { 
        global $ultimatemember; 
        $this->set_status('awaiting_admin_review');
    }
}


我也尝试了太多的其他变化,包括和所有这些打破了网站。
所以,我要求社区提供一些支持/指针,告诉他们如何在不发送电子邮件的情况下使用挂起功能,或者如何使用我的钩子将状态设置为“等待管理员审查”。
我一直在使用UM github repository来帮助我研究UM代码:

omhiaaxx

omhiaaxx1#

我无法在UM 2+中实现这一点。然而,对于那些仍然在为此而挣扎的人,我确实找到了一种方法,通过将用户Meta更改添加到我发现的电子邮件通知片段的末尾。我还调整了电子邮件,以包括配置文件中的“描述”字段,因此管理员可以立即看到它是否被更改为包括任何不受欢迎的内容。

/*function to notify admin of profile changes*/
add_action( 'um_after_user_updated', 'my_after_user_updated', 10, 3 );
function my_after_user_updated( $user_id, $args, $userinfo ) {
    um_fetch_user($user_id);
    $groupMember = um_user('display_name');
    $groupMmbr_name = um_user('user_login');
    $groupMmbr_hidden = um_user('hide_in_members');
    $groupMmbr_status = um_user('account_status');
    $groupMmbr_desc = um_user('description');
    $loggedIn_user = wp_get_current_user();
    $loggedIn_userEml =  $loggedIn_user->user_email;
    $headers = array('Content-Type: text/html; charset=UTF-8', 'Cc:[email protected]', 'Bcc:', 
    'From:Your Website <[email protected]>', 'Reply-To:No-reply Email<[email protected]>');
    wp_mail( '[email protected]', 'The member profile '.$groupMember.' has been updated.', 
    'The <b>'.$groupMember.'</b> profile was updated by the user with this email address: '.$loggedIn_userEml.'. <a href="https://yourwebsite.com/member/'.$groupMmbr_name.'/?profiletab=main&um_action=edit"><br>
    <b>Click here</b></a> to visit this profile online.<br><br><i style="color:#767676; font-size:11px; text-align:center;"><b>NOTE:</b> you must be logged in first to see this profile.</i>
    <br><br>The new profile description is:<br><br>'.$groupMmbr_desc.'<br><br>',$headers);
    update_user_meta( $user_id, 'account_status', 'awaiting_admin_review');
}

字符串

0ejtzxu1

0ejtzxu12#

经过相当多的进一步研究,我设法确定了um_submit_form_profile操作,该操作在用户编辑其配置文件时触发,但在注册时不使用,因此注册时的重复电子邮件问题得到了解决。
这是我对新操作的原始钩子。当用户编辑他们的个人资料时,它将用户状态设置为待处理的管理员审查。

// Set profile to under pending after edits
add_action('um_submit_form_profile', 'um_post_edit_pending_hook', 10, 2); 
function um_post_edit_pending_hook($user_id, $args){ 
if ( is_super_admin() ) {
    return false;
    } else { 
        global $ultimatemember; 
        $ultimatemember->user->pending(); 
    }
}

字符串
感谢插件作者之一的Champ Campo,我得到了一个更好的解决方案,只是将帐户状态更改为等待管理员审核,其他什么都不做。

// Set profile to under review after edits
add_action('um_user_edit_profile', 'um_post_edit_pending_hook');
function um_post_edit_pending_hook( $args ){
    $user_id =  $args['user_id'];
    if ( is_super_admin() ) {
        return;
    }
        update_user_meta( $user_id, 'account_status', 'awaiting_admin_review');

}

8i9zcol2

8i9zcol23#

我只是想补充一下@DaniB的回答。当你直接用update_user_meta函数更改用户数据时,你应该在update_user_meta之后清除用户缓存,这样它会用更新后的数据再次重建该高速缓存:
UM()->user()->remove_cache( $user_id )
如果不清除用户缓存,旧的account_status仍将加载并在UM函数/功能中使用。

相关问题