Discourse 登录重定向至 WordPress 仪表板

我最初设置 WordPress 的 SSO 时,用户访问论坛网址后会被重定向到 WordPress 登录页,登录成功后再被重定向回论坛。

但不知从何时起,这一流程发生了变化,而我完全不清楚原因。现在,用户在 WordPress 登录后会被重定向到 WordPress 仪表盘。

此外,还有一个奇怪的现象:当我从 Discourse 登出时,会看到“您已登出”的提示,但点击“刷新”按钮后,实际上并未真正登出。我仍然可以发帖、回复等。有时我需要登出两到三次才能真正登出。虽然功能可用,但表现并不稳定。

有什么建议可以帮助我排查这些问题吗?

可能是某个 WordPress 插件干扰了您的路由和/或挂钩了您的登录功能。请尝试禁用一半的 WordPress 插件,查看是哪一半导致了问题,然后继续在该组中禁用一半的插件,以此类推。

建议先从与身份验证、会员管理、登录相关的插件开始排查。

Michael 的回答很可能是正确的。另外,您的网站上是否安装了 WooCommerce 插件?如果是,您可以添加一些代码来解决问题。

登出问题可能与登录重定向问题有关。如果禁用插件无法解决问题,请告诉我们。

如果您不想为所有用户禁用插件,可以使用 WordPress 健康检查插件在您的独立会话中禁用它们:Health Check & Troubleshooting – WordPress plugin | WordPress.org English (Canada)

感谢 Michael 和 Simon!

登录问题似乎与 MemberPress 插件存在冲突。因此,我想我需要与他们一起深入探讨可能的解决方案。

登出问题是由一个重定向插件引起的。主页重定向导致了 Discourse 登出功能出现问题。

Michael —— 非常感谢您的帮助以及关于可能问题插件的建议。这为我节省了大量时间,因为那两个插件正是我首先检查的对象。

Simon —— 谢谢您告诉我 WordPress 健康检查插件。我之前从未听说过它,但我现在就要安装它,并在将来用于故障排查。

请检查该插件的设置,查看其是否创建了任何登录重定向。看起来它会在 WP Discourse 插件将用户重定向回 Discourse 之前,先将用户重定向到其个人资料页面。如果您找到了解决方案,请在此发布。如果未能找到,也请告知我们。我可以在本地站点尝试安装 MemberPress 插件。

是的,Health Check 插件对于调试此类问题非常有用。

你好 @simon

我在解决 MemberPress 的问题上一直毫无进展。这肯定与 MemberPress 有关,因为这是我唯一设置了特定重定向 URL(即 /jump)的插件。

我现在不太清楚下一步该怎么做。当有人从我的 WordPress 站点登录时,我希望在登录后将他们重定向到 /jump。在这方面,MemberPress 确实发挥了作用。

但是,当人们访问我的 Discourse 站点(例如 community.mydomain.com)时,他们会被重定向到 WordPress 登录页面,但登录后也会被发送到 /jump,而不是重定向回论坛。

您有什么其他建议可以尝试吗?

谢谢 - Omer

您知道在 MemberPress 中启用了哪些设置来创建重定向吗?我在开发站点上安装了最新版本的 MemberPress,但一直无法复现登录问题,也无法复现用户无法从 Discourse 登出的问题。

您的 WordPress 站点是多站点安装,还是普通的单站点安装?

用户无法从 Discourse 登出的问题,可能是由于您的 Discourse 站点设置为必须登录后才能查看内容。在这种情况下,刷新 Discourse 页面会触发 SSO 登录。要让用户完全从 Discourse 登出,还需要让他们从 WordPress 登出。这可以通过在 Discourse 的“登出重定向”站点设置中输入 https://example.com/?request=logout 来实现。请将 example.com 替换为您 WordPress 站点的域名。如果您已执行此操作但问题仍未解决,请告知我。

你好,Simon

这是一个标准的 WordPress 安装(非多站点)。登出问题已修复。

问题出在登录后的重定向上,即用户在 WordPress 登录后没有被重定向回 Discourse 站点。相反,看起来 MemberPress 将他们发送到了 WordPress 上的默认页面。

–Omer

您是否知道在 MemberPress 选项中设置了用户被重定向到的页面?如果是,您为此设置了哪个选项?

是的,我设置了。我在两个地方配置了页面重定向:

  1. MemberPress > 设置 > 账户 > “登录后会员跳转的 URL”

  2. MemberPress > 会员计划 > [会员计划名称] > 高级 > “默认登录重定向 URL”

谢谢!正是这个选项导致了问题。

有意思!我需要保留那个设置,以便会员前往 WordPress 站点并点击登录时使用。

您是否知道是否有任何 PHP 代码可以添加到我的 functions.php 文件中,从而覆盖 Discourse 登录的默认行为?

问题出在 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

我有点犹豫是否建议将此代码添加到您的生产站点。如果您尝试使用,请确保在代码导致站点故障时能够从服务器上将其移除。务必尽可能多地针对不同用户/会员级别进行测试。

太棒了,Simon!你真是个摇滚明星!

我也很犹豫是否要立即将此添加到我的生产网站。我想我可能需要为此专门搭建一个测试站点。