我想在 WordPress 新用户注册时自动在 Discourse 中创建用户,但希望他们在完成申请表之前无法访问。
我可以使用“登录时同步”和“必须批准用户”设置来实现大部分功能,但不知道如何获取用户在 Discourse 中的批准状态?
Discourse 是否使用某个 WordPress 用户元数据字段来存储用户的批准状态?如果没有,我是否需要调用 API 从 Discourse 获取该信息?
我的目标是:在 WordPress 仪表板上显示一个按钮,其动态链接根据用户是否已批准而变化。
- 未批准用户:动态链接指向 WordPress 上的申请表。
- 已批准用户:动态链接指向 Discourse 社区。
我查阅了一些帖子,但未能找到解决方案。希望能得到帮助!
1 个赞
我已经通过编写数据探索器查询并通过 API 调用,找到了实现这一功能的方法。虽然运行正常,但目前在两个系统之间进行调用,这显然比将数据直接保存在 WordPress 中要慢。
如果页面加载速度较慢,我会使用钩子将审批数据自行存储到用户的自定义字段中。在开始实施之前,最好先确认一下 WP-Discourse 插件是否已经实现了这一功能。
angus
(Angus McLeod)
3
嘿 @Himanshu_Singh,简短的回答是:WP Discourse 插件不会存储 Discourse 用户的审批状态。
建议您查看 wpdc_after_sync_sso 操作,该操作会在用户登录 WordPress 后用户记录同步完成时触发。
您可以在其中添加日志记录,例如:
function wpdc_after_sync_sso_callback($discourse_user, $user_id) {
error_log(print_r($discourse_user, true));
}
add_action( 'wpdc_after_sync_sso', 'wpdc_after_sync_sso_callback', 10, 2 );
您会看到 discourse_user 对象包含了用户的审批状态,例如:
stdClass Object
(
[id] => 43
[username] => angus4
[name] => angus4
...
[approved] =>
)
然后您可以将该状态自行存储为用户自定义字段,并用于创建您的动态链接。
1 个赞
谢谢你,Angus。你的解决方案非常优雅。我走了一条稍长的路径:
- 我使用 Data Explorer API 获取审批状态
- 将其链接到 template_redirect 钩子,以便在登录时检查审批状态
- 在登录时更新 WP 中的自定义字段
- 如果用户已获批,则阻止 API 再次运行
add_action('template_redirect', 'update_discourse_approval_status', 1);
function update_discourse_approval_status() {
global $post;
$post_slug = $post->post_name;
if ($post_slug == 'page-slug') {
$current_user_id = get_current_user_id();
$approval_status_stored_in_wp = get_user_meta($current_user_id, 'custom-field', true);
if ($approval_status_stored_in_wp != 1) {
$user_discourse_id = (int) get_user_meta($current_user_id, 'discourse_sso_user_id')[0];
// API 凭据
$api_key = 'api-key';
$api_username = 'name';
$discourse_user_param_string = 'params={"user_param":';
$discourse_user_param_string .= '"';
$discourse_user_param_string .= $user_discourse_id;
$discourse_user_param_string .= '"}';
// 对于 Discourse API,header 是必须的。
$headers = array("Content-Type: multipart/form-data;", "Api-Key:$api_key", "Api-Username:$api_username");
$url = 'https://community.showprowess.com/admin/plugins/explorer/queries/<query-number>/run';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_POSTFIELDS, $discourse_user_param_string);
$result = curl_exec($ch);
if (curl_errno($ch) !== 0) {
// 处理错误,调用 curl_close($ch) 并返回。
echo 'error';
curl_close($ch);
return;
}
curl_close($ch);
$decoded_result = json_decode($result, true);
$user_approved = $decoded_result['rows'][0][0];
$updated = update_user_meta($current_user_id, 'custom-field', $user_approved);
}
} // 结束检查自定义字段中数据的 if 语句
} // 结束检查正确页面的 if 语句
?>
1 个赞