如何知道 Discourse 用户在 Wordpress 中未获批准?

我想在 WordPress 新用户注册时自动在 Discourse 中创建用户,但希望他们在完成申请表之前无法访问。

我可以使用“登录时同步”和“必须批准用户”设置来实现大部分功能,但不知道如何获取用户在 Discourse 中的批准状态?

Discourse 是否使用某个 WordPress 用户元数据字段来存储用户的批准状态?如果没有,我是否需要调用 API 从 Discourse 获取该信息?

我的目标是:在 WordPress 仪表板上显示一个按钮,其动态链接根据用户是否已批准而变化。

  • 未批准用户:动态链接指向 WordPress 上的申请表。
  • 已批准用户:动态链接指向 Discourse 社区。

我查阅了一些帖子,但未能找到解决方案。希望能得到帮助!

1 个赞

我已经通过编写数据探索器查询并通过 API 调用,找到了实现这一功能的方法。虽然运行正常,但目前在两个系统之间进行调用,这显然比将数据直接保存在 WordPress 中要慢。

如果页面加载速度较慢,我会使用钩子将审批数据自行存储到用户的自定义字段中。在开始实施之前,最好先确认一下 WP-Discourse 插件是否已经实现了这一功能。

@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。你的解决方案非常优雅。我走了一条稍长的路径:

  1. 我使用 Data Explorer API 获取审批状态
  2. 将其链接到 template_redirect 钩子,以便在登录时检查审批状态
  3. 在登录时更新 WP 中的自定义字段
  4. 如果用户已获批,则阻止 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 个赞