我最初设置 WordPress 的 SSO 时,用户访问论坛网址后会被重定向到 WordPress 登录页,登录成功后再被重定向回论坛。
但不知从何时起,这一流程发生了变化,而我完全不清楚原因。现在,用户在 WordPress 登录后会被重定向到 WordPress 仪表盘。
此外,还有一个奇怪的现象:当我从 Discourse 登出时,会看到“您已登出”的提示,但点击“刷新”按钮后,实际上并未真正登出。我仍然可以发帖、回复等。有时我需要登出两到三次才能真正登出。虽然功能可用,但表现并不稳定。
有什么建议可以帮助我排查这些问题吗?
michaeld
(Michael - Communiteq)
2
可能是某个 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 选项中设置了用户被重定向到的页面?如果是,您为此设置了哪个选项?
omerk
12
有意思!我需要保留那个设置,以便会员前往 WordPress 站点并点击登录时使用。
您是否知道是否有任何 PHP 代码可以添加到我的 functions.php 文件中,从而覆盖 Discourse 登录的默认行为?
simon
13
问题出在 track_and_override_login_redirect_mepr 函数中。该函数通过 MemberPress 的 mepr-process-login-redirect-url 过滤器进行挂钩。可以通过检查已设置的查询参数来挂钩此函数并对其进行覆盖。这可以使用 wp_get_referer() 函数来实现。
我想我今天没有时间解决这个问题,但我会在今后的几天内再仔细查看一下。
simon
14
我趁记忆犹新时又仔细查看了一遍。将以下函数添加到我的主题的 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。
我有点犹豫是否建议将此代码添加到您的生产站点。如果您尝试使用,请确保在代码导致站点故障时能够从服务器上将其移除。务必尽可能多地针对不同用户/会员级别进行测试。
omerk
15
太棒了,Simon!你真是个摇滚明星!
我也很犹豫是否要立即将此添加到我的生产网站。我想我可能需要为此专门搭建一个测试站点。