WordpressでDiscourseユーザーが未承認か確認する方法

WordPress で新規登録が発生した際に Discourse 上で自動的にユーザーを作成したいと考えていますが、申請フォームの完了まではアクセスを許可したくありません。

sync on loginmust approve users の設定を使用すれば、この要件の大部分を満たせることは理解していますが、Discourse 側でユーザーが承認されたかどうかを確認する方法がわかりません。

Discourse は、ユーザーの承認ステータスを保存するために WP のユーザーメタフィールドを使用しているのでしょうか?もしそうでなければ、Discourse からその情報を取得するために API を使用する必要があるでしょうか?

私の目標は、承認ステータスに応じて動的にリンクが切り替わるボタンを WP のダッシュボードに表示することです。

  • 未承認ユーザー:動的リンクは WP 上の申請フォームへ
  • 承認済みユーザー:動的リンクは Discourse コミュニティへ

いくつかの投稿を確認しましたが、解決策は見つかりませんでした。ご助言をいただければ幸いです!

「いいね!」 1

データエクスプローラーのクエリを作成し、API を介して呼び出すことで、この実現方法を見つけました。機能は問題ありませんが、現在は 2 つのシステム間で呼び出しを行っているため、当然ながらデータを WP に保存している場合よりも遅くなります。

ページ読み込みが遅い場合は、フックを使用して承認データを独自のユーザーカスタムフィールドに保存する予定です。着手する前に、WP-Discourse プラグインが既にその処理を行っているかどうかを確認しておくと良いでしょう。

@Himanshu_Singh さん、簡潔に申し上げますと、WP Discourse プラグインは Discourse ユーザーの承認ステータスを保存しません。

ユーザーが WordPress にログインした後にユーザーレコードが同期された後に発火する wpdc_after_sync_sso アクションを確認することをお勧めします。

そこにログを出力する処理を入れてみてください。例えば:

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

ありがとうございます、アングス。あなたの解決策はエレガントですね。私は少し長い手順を踏みました。

  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 ではヘッダーが必須です。
      $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