DiscourseのログインがWordPressダッシュボードにリダイレクトされます

当初、WordPress と SSO を設定したときは、ユーザーがフォーラムの URL にアクセスすると WordPress のログインページにリダイレクトされ、ログイン後に再びフォーラムに戻るように設定されていました。

しかし、ある時点で何らかの理由でこの動作が変更され、現在は WordPress でログインすると、ユーザーは WordPress のダッシュボードにリダイレクトされてしまいます。

また、奇妙なことに、Discourse からログアウトすると「ログアウトしました」というメッセージが表示されますが、「更新」ボタンをクリックしても実際にはログアウトされておらず、まだ投稿や返信などができてしまいます。実際に完全にログアウトするには、2〜3 回ログアウト操作を繰り返さなければならないこともあります。機能はしているものの、一貫性がありません。

この問題をトラブルシューティングする方法について、何かご存知でしょうか?

おそらく、WordPressのプラグインがルーティングに干渉していたり、ログイン関数にフックしていたりします。WordPressのプラグインを半分無効化して、どの半分が問題を引き起こしているかを確認し、そのグループ内のプラグインをさらに半分ずつ無効化していくことをお勧めします。

まずは認証、メンバーシップ、ログインに関連するプラグインから始めてください。

マイケルの回答はおそらく正しいでしょう。また、あなたのサイトに WooCommerce プラグインはインストールされていますか?もしそうであれば、問題を解決するためにサイトに追加できるコードがあります。

ログアウトの問題は、ログインのリダイレクト問題に関連している可能性があります。プラグインを無効にしても問題が解決しない場合は、お知らせください。

すべてのユーザーに対してプラグインを無効にしたくない場合は、WordPress Health Check プラグインを使用して、自分のセッションのみで無効にできます: Health Check & Troubleshooting – WordPress plugin | WordPress.org English (Canada)

マイケルとサイモン、ありがとうございます!

ログインの問題は、MemberPress プラグインとの競合のようです。そのため、彼らと解決策を検討する必要があります。

ログアウトの問題は、リダイレクトプラグインが原因でした。ホームページへのリダイレクトが、Discourse のログアウトに問題を引き起こしていました。

マイケル – ご協力と、問題のある可能性のあるプラグインに関するアドバイスに心から感謝します。それらが最初に確認した 2 つのプラグインだったので、非常に時間を節約できました。

サイモン – WordPress のヘルスチェックプラグインについて教えていただき、ありがとうございます。以前は聞いたことがありませんでしたが、今すぐインストールして、今後のトラブルシューティングに活用します。

プラグインの設定で、ログインリダイレクトを作成しているものがないか確認してください。どうやら、WP DiscourseプラグインがユーザーをDiscourseにリダイレクトする前に、ユーザーをプロフィールページにリダイレクトしているようです。解決策が見つかった場合は、ここに投稿してください。見つからない場合は、お知らせください。私のローカルサイトにMemberPressをインストールして試してみます。

はい、Health Checkプラグインは、このような問題のデバッグに非常に役立ちます。

こんにちは、@simon さん

MemberPress ではこの問題の解決に手がかりが得られていません。MemberPress が唯一、特定のリダイレクト URL(つまり /jump)を設定しているプラグインであるため、これは間違いなく MemberPress との競合です。

次にどう進めばよいか確信が持てません。WordPress サイトからログインする際、ログイン後にそのユーザーを /jump にリダイレクトしたいと考えています。この点では MemberPress は正常に機能しています。

しかし、community.mydomain.com などの Discourse サイトにアクセスすると、ユーザーは WordPress のログインページにリダイレクトされます。ログイン後、フォーラムに戻すのではなく、やはり /jump に送られてしまいます。

他に試せることがあれば、ご教示いただけませんでしょうか?

よろしくお願いいたします。
Omer

MemberPressでリダイレクトを作成するために有効化されている設定をご存知でしょうか?開発用サイトには最新のMemberPressをインストールしていますが、ログインの問題や、Discourseからユーザーがログアウトされない問題の再現には至っていません。

あなたのWordPressサイトはマルチサイト構成でしょうか、それとも通常の単一サイト構成でしょうか?

Discourseからユーザーがログアウトされない問題は、Discourseサイトがコンテンツ閲覧にログインを必須に設定されていることが原因である可能性があります。その場合、DiscourseページをリフレッシュするとSSOログインが開始されます。Discourseからユーザーを完全にログアウトさせるには、WordPressからもログアウトさせる必要があります。これを行うには、Discourseの「logout redirect」サイト設定に https://example.com/?request=logout を入力します。example.com をあなたのWordPressサイトのドメインに置き換えてください。この設定を行ってもまだ問題が解決しない場合は、お知らせください。

こんにちは、Simonさん

これは通常の WordPress インストール(マルチサイトではありません)です。ログアウトの問題は解決しました。

問題はログイン後のリダイレクトです。つまり、WP でログインしたユーザーが Discourse サイトに戻されません。代わりに、MemberPress が WordPress のデフォルトページにリダイレクトしているようです。

–Omer

ユーザーがリダイレクトされるページがMemberPressオプションで設定されているかご存知ですか?もし設定されている場合、どのオプションを設定しましたか?

はい、行いました。ページリダイレクトを以下の 2 か所で設定しています:

  1. MemberPress > 設定 > アカウント > 「ログイン後のメンバー向け URL」

  2. MemberPress > 会員プラン > [会員プラン名] > 詳細設定 > 「デフォルトのログインリダイレクト URL」

ありがとうございます!そのオプションが問題の原因となっています。

面白い!メンバーが WP サイトにアクセスしてログインをクリックする際に、その設定をそのまま残しておく必要があります。

Discourse ログイン用にこれを上書きする PHP コードを functions.php に追加できるか、何かご存知ですか?

問題は track_and_override_login_redirect_mepr 関数で発生しています。この関数は、MemberPress の mepr-process-login-redirect-url フィルターにフックされています。設定されたクエリを確認することで、この関数にフックして上書きすることが可能かもしれません。これは wp_get_referer() 関数を使って行うことができます。

今日はこの問題を解決する時間が取れそうにありませんが、今後数日中に再度確認します。

頭が冴えているうちに、もう一度確認してみました。テーマの functions.php ファイルに以下の関数を追加することで、私の環境では問題が解決しました。ただし、十分なテストは行われていません。

add_filter( 'mepr-process-login-redirect-url', 'wpdc_login_redirect', 12, 3);
function wpdc_login_redirect( $redirect, $user = false, $is_wp_login_page = false ) {
	$referer = wp_get_referer();
	if ( $referer ) {
		$query_params = [];
		parse_str( parse_url( $referer, PHP_URL_QUERY ), $query_params );
		$sso_referer = ! empty( $query_params['redirect_to'] ) && preg_match( '/^\/\?sso/', $query_params['redirect_to'] );
		if ( $sso_referer ) {

			return home_url( $query_params['redirect_to'] );
		}
	}

	return MeprProductsCtrl::track_and_override_login_redirect_mepr( $redirect, $user, $is_wp_login_page );
}

この関数は、MemberPress によってフックされる前に 'mepr-process-login-redirect-url' フィルターにフックします。その後、クエリパラメータの値を確認し、そのリクエストが Discourse からの SSO リクエストによって開始されたものかどうかをチェックします。もしそうであれば、ユーザーをクエリパラメータを保持したまま WordPress のホームページへリダイレクトします。これにより、WP Discourse プラグインが SSO リクエストを完了させることになります。ホームページが MemberPress によって保護されている場合でも、この方法は機能すると思われますが、確認しておくことをお勧めします。

リクエストが Discourse によって開始されたものでない場合は、フィルターに渡された引数と共に、静的メソッド MeprProductsCtrl::track_and_override_login_redirect_mepr が呼び出されます。

このコードを生環境のサイトに追加することを推奨するには、少しためらわれます。もし試す場合は、サイトが破損した場合にサーバーからコードを削除できる状態にしておくことを確認してください。できるだけ多くのユーザーや会員レベルでテストを行ってください。

これは最高ですね、サイモン!あなたはロックスターです!

私もすぐに本番サイトに追加するのはためらわれます。これを適切に行うには、テストサイトを立ち上げる必要があるかもしれません。