Discourse と MemberMouse を 2 つのサイトで運用しています。このガイドが皆様のお役に立てれば幸いです。あなたの具体的な要件は、私の目的とは異なる場合があります。このガイドでは、MemberMouse の フック、フィルター、および MemberMouse の PHP インターフェース に精通していることを前提としています。また、functions.php または独自のカスタムプラグインを通じて WordPress にカスタムコードを追加できることも前提としています。
以下のガイドは、以下の目的のために追加したものです:
- MemberMouse の会員ステータスに応じて、Discourse でのユーザーのアクティブ化/非アクティブ化
- MemberMouse の会員レベルを表す Discourse グループの設定
- ユーザー名とメールアドレスの変更を瞬時に同期
- その他、便利な小規模な調整
ステップ 1: Discourse、WordPress、および wp-discourse WordPress プラグインのインストール
WordPress と Discourse、そして wp-discourse WordPress プラグインをセットアップし、WordPress を SSO プロバイダーとして正しく設定してください。これについては、多くのスレッドがここにあります。
ステップ 2: wp-discourse プラグインが WordPress でユーザーが作成された際に Discourse で新しいユーザーを作成できるようにチェックボックスをオンにする
WordPress でユーザーが作成された際に wp-discourse が実際に Discourse でユーザーを作成するためには、プラグイン内でコードの変更を行う必要があることがわかりました。これは、プラグインが「wp_login」アクションに依存していますが、MemberMouse における動作は通常の WordPress の動作とは異なるためです。そのため、public function __construct( $wordpress_email_verifier ) 内の /lib/discourse-sso.php ファイルに以下の行を追加する必要があります:
add_action( 'my_mm_account_added', array( $this, 'create_discourse_user' ), 10, 2 );
そして、functions.php または独自プラグインに以下を追加します:
function add_user_to_discourse($data) {
do_action( 'my_mm_account_added', $data["username"], get_user_by('ID',$data["member_id"]) );
}
add_action('mm_member_add', 'add_user_to_discourse');
ステップ 3: (任意)新しいユーザーが Discourse のメールアクティベーションリンクをクリックする必要がないようにする
デフォルトでは、Discourse は新しいユーザーにアクティベーションメールを送信しますが、ユーザーは WordPress で参加するためにすでに十分な手順を踏んでいるため、これをオフにすることを選びました。あなたの WordPress サイトの参加障壁が低い場合は、アクティベーションメールをスキップしたくないかもしれません。私たちの場合、参加するには支払いが必要です。これを functions.php または作成した専用プラグインに追加してください。
add_filter( 'wpdc_auto_create_user_require_activation', 'my_wpdc_auto_create_user_require_activation' );
function my_wpdc_auto_create_user_require_activation( $require_activation ) {
return false;
}
ステップ 4: MemberMouse ユーザーのアカウント変更が発生するたびに:
- MemberMouse の会員レベルを Discourse グループにマッピング
- メールアドレス/ユーザー名の同期
- 状況に応じて Discourse でのユーザーのアクティブ化/非アクティブ化
これを functions.php または独自プラグインに追加できます。
add_action('mm_member_membership_change', 'run_discourse_sync_based_on_mm_acct_change');
add_action('mm_member_status_change', 'run_discourse_sync_based_on_mm_acct_change');
add_action('mm_member_account_update', 'run_discourse_sync_based_on_mm_acct_change');
run_discourse_sync_based_on_mm_acct_change 関数では、以下を行います:
(1) Discourse API を使用して、このユーザーの Discourse ユーザー名(Discourse 独自のユーザー名規則により WordPress のものとはわずかに異なる場合があります)と Discourse ID 番号を取得します。(ドキュメント)
(2) MemberMouse の会員レベル ID を同等の Discourse グループ ID にマッピングし、Discourse でそのグループを設定します。まず、古いグループ ID を削除する必要があります。(ドキュメント)その後、新しいグループを設定できます。(ドキュメント)
(3) WordPress で変更された場合、ユーザー名とメールアドレスを同期します。これらは WordPress でのみ変更できるようにしています。この部分については、こちらでサポートを受けました。
(4) MemberMouse でのステータスに応じて、Discourse でのユーザーをアクティブ化/非アクティブ化します。アクティブ化:ドキュメント。非アクティブ化は API ドキュメントから欠落しているようです。$url = $url_base.'admin/users/'.$discourse_userid.'/deactivate.json?'.$api_auth;
ステップ 5: 適切な場合に Discourse へ自動的にリダイレクトする
(この部分は、WordPress と Discourse がどのように連携するかを十分に理解するまで、実行しないことを強くお勧めします。)
ユーザーが Discourse にも WordPress にもログインしていない状態で、Discourse の URL にアクセスし、青い「ログイン」ボタンをクリックすると、WordPress に移動してログインしますが、その後 MemberMouse が設定されたリダイレクト先にユーザーを誘導します。残念ながら、ユーザーは Discourse へ戻りません。これを解決する方法を以下に示します。これを functions.php または独自プラグインに追加できます。(詳細はこちらのスレッド)
// ユーザーが Discourse フォーラムから来た場合、ログイン後に正確に元の場所へ誘導する
function my_mm_login_redirect( $infoObj ) {
if ( @$_COOKIE['detected_forum_referal'] != '' ) { // ユーザーが Discourse を経由して到着した場合、この一時クッキーを設定する必要があります
$current_user = $infoObj->user;
$user_id = $current_user->ID;
// ペイロードと署名
$payload = @$_COOKIE['mm_cookie_sso'];
$sig = @$_COOKIE['mm_cookie_sig'];
// %0B を %0A に戻す
$payload = rawurldecode( str_replace( '%0B', '%0A', rawurlencode( $payload ) ) );
// 署名を検証
$sso_secret = 'YOUR-SSO-SECRET';
$sso = new \WPDiscourse\SSO\SSO( $sso_secret );
if ( ! ( $sso->validate( $payload, $sig ) ) ) {
return '';
}
$nonce = $sso->get_nonce( $payload );
$params = array(
'nonce' => $nonce,
'username' => $current_user->user_login,
'email' => $current_user->user_email,
'external_id' => $user_id,
);
$params = apply_filters( 'wpdc_sso_params', $params, $current_user );
$q = $sso->build_login_string( $params );
do_action( 'wpdc_sso_provider_before_sso_redirect', $user_id, $current_user );
// Discourse へリダイレクト
return('YOUR-FORUM-BASE-URL' . '/session/sso_login?' . $q);
}
return('');
}
add_filter( 'mm_login_redirect', 'my_mm_login_redirect', 10, 1 );
