php - WordPress:我需要在用户角色更改时向用户发送通知,我的代码片段不起作用
问题描述
我正在使用 WordPress 构建一个会员风格的网站。当用户注册他们的默认角色是“订阅者”时,一旦我们手动批准他们的帐户,我们将用户角色更改为“private_event_member”,我们需要向用户发送一封电子邮件,告诉他们我们已经更改了他们的角色。我找到了以下代码片段并将其添加到 functions.php 文件中
function user_role_update( $user_id, $new_role ) {
$site_url = get_bloginfo('wpurl');
$user_info = get_userdata( $user_id );
$to = $user_info->user_email;
$subject = "Role changed: ".$site_url."";
$message = "Hello " .$user_info->display_name . " your role has changed on ".$site_url.", congratulations you are now an " . $new_role;
wp_mail($to, $subject, $message);
}
add_action( 'set_user_role', 'user_role_update', 10, 2);
这未能按预期发送电子邮件。因此,为了确保我决定安装一个名为 WP Mail Log 的插件,然后还安装了 WP Mail SMTP,我配置了 Sendblue SMTP 选项。我已经测试了这个和所有其他电子邮件,例如用户注册通知和新订单正在发送并成功记录在日志中,这些正在被接收。然而,上面提到的代码似乎什么也没做。
这似乎是一段广泛使用的代码,应该可以工作,所以任何人都可以向我解释为什么这个片段的行为与服务器上的其他邮件不同?据我所知,它甚至没有出现在发送日志中,它根本没有做任何事情。我挂钩的 set_user_role 操作是否已更改?可能是什么原因?
任何帮助非常感谢!
解决方案
您应该为此使用 profile_update 挂钩。在这里阅读更多 - https://developer.wordpress.org/reference/hooks/profile_update/
function notify_user_on_role_change($user_id,$old_user_data,$userdata) {
// Getting role before update
foreach($old_user_data->roles as $role):
$old_role = $role;
endforeach;
// error_log(print_r($userdata,true)); // debug
//If we change role send email
if($old_role != $userdata['role']):
$user_info = get_userdata( $user_id );
$to = $user_info->user_email;
$subject = "Profile Updated";
$message = "Hello, your user role is changed to ".$userdata['role']."";
wp_mail( $to, $subject, $message);
endif;
}
add_action('profile_update','notify_user_on_role_change',10,3);
仅当您更改为特定用户角色时才发送通知
function notify_user_on_role_change($user_id,$old_user_data,$userdata) {
// Getting role before update
foreach($old_user_data->roles as $role):
$old_role = $role;
endforeach;
// error_log(print_r($old_role,true)); // debug
//If we change role send email
if($old_role != 'private_event_member' && $userdata['role'] == 'private_event_member'):
$user_info = get_userdata( $user_id );
$to = $user_info->user_email;
$subject = "Profile Updated";
$message = "Hello, your user role is changed to ".$userdata['role']."";
wp_mail( $to, $subject, $message);
endif;
}
add_action('profile_update','notify_user_on_role_change',10,3);
推荐阅读
- office-js - Outlook for Mac 用户的“新 Outlook”中缺少加载项
- arrays - 按jsonb中数组长度查询jsonb类型的列
- delphi - Delphi 10.4 中的研华 DAQNavi ActiveX 组件
- c# - .Where() 中的 .Contains() EF Core 不起作用 .NET Core 3.1.8
- c# - EF Core 2.2 中的 SetDefaultValueSql()
- javascript - NodeJS+request-promise 的并发请求太多
- json - Realm JS react-native无法从具有多对关系的API的大型JSON创建表
- awk - 如何针对 csv 文件循环遍历 txt 文件
- java - 未找到 Java 运行时
- r - 如何解决错误:UseMethod 中的错误(“summarise”)