omerk
1
我最初设置 WordPress 的 SSO 时,用户访问论坛网址后会被重定向到 WordPress 登录页,登录成功后再被重定向回论坛。
但不知从何时起,这一流程发生了变化,而我完全不清楚原因。现在,用户在 WordPress 登录后会被重定向到 WordPress 仪表盘。
此外,还有一个奇怪的现象:当我从 Discourse 登出时,会看到“您已登出”的提示,但点击“刷新”按钮后,实际上并未真正登出。我仍然可以发帖、回复等。有时我需要登出两到三次才能真正登出。虽然功能可用,但表现并不稳定。
有什么建议可以帮助我排查这些问题吗?
michaeld
(Michael - Communiteq)
2
可能是某个 WordPress 插件干扰了您的路由和/或挂钩了您的登录功能。请尝试禁用一半的 WordPress 插件,查看是哪一半导致了问题,然后继续在该组中禁用一半的插件,以此类推。
建议先从与身份验证、会员管理、登录相关的插件开始排查。
simon
3
Michael 的回答很可能是正确的。另外,您的网站上是否安装了 WooCommerce 插件?如果是,您可以添加一些代码来解决问题。
登出问题可能与登录重定向问题有关。如果禁用插件无法解决问题,请告诉我们。
如果您不想为所有用户禁用插件,可以使用 WordPress 健康检查插件在您的独立会话中禁用它们:Health Check & Troubleshooting – WordPress plugin | WordPress.org English (Canada)
omerk
4
感谢 Michael 和 Simon!
登录问题似乎与 MemberPress 插件存在冲突。因此,我想我需要与他们一起深入探讨可能的解决方案。
登出问题是由一个重定向插件引起的。主页重定向导致了 Discourse 登出功能出现问题。
Michael —— 非常感谢您的帮助以及关于可能问题插件的建议。这为我节省了大量时间,因为那两个插件正是我首先检查的对象。
Simon —— 谢谢您告诉我 WordPress 健康检查插件。我之前从未听说过它,但我现在就要安装它,并在将来用于故障排查。
simon
5
请检查该插件的设置,查看其是否创建了任何登录重定向。看起来它会在 WP Discourse 插件将用户重定向回 Discourse 之前,先将用户重定向到其个人资料页面。如果您找到了解决方案,请在此发布。如果未能找到,也请告知我们。我可以在本地站点尝试安装 MemberPress 插件。
是的,Health Check 插件对于调试此类问题非常有用。
omerk
6
你好 @simon
我在解决 MemberPress 的问题上一直毫无进展。这肯定与 MemberPress 有关,因为这是我唯一设置了特定重定向 URL(即 /jump)的插件。
我现在不太清楚下一步该怎么做。当有人从我的 WordPress 站点登录时,我希望在登录后将他们重定向到 /jump。在这方面,MemberPress 确实发挥了作用。
但是,当人们访问我的 Discourse 站点(例如 community.mydomain.com)时,他们会被重定向到 WordPress 登录页面,但登录后也会被发送到 /jump,而不是重定向回论坛。
您有什么其他建议可以尝试吗?
谢谢 - Omer
simon
7
您知道在 MemberPress 中启用了哪些设置来创建重定向吗?我在开发站点上安装了最新版本的 MemberPress,但一直无法复现登录问题,也无法复现用户无法从 Discourse 登出的问题。
您的 WordPress 站点是多站点安装,还是普通的单站点安装?
用户无法从 Discourse 登出的问题,可能是由于您的 Discourse 站点设置为必须登录后才能查看内容。在这种情况下,刷新 Discourse 页面会触发 SSO 登录。要让用户完全从 Discourse 登出,还需要让他们从 WordPress 登出。这可以通过在 Discourse 的“登出重定向”站点设置中输入 https://example.com/?request=logout 来实现。请将 example.com 替换为您 WordPress 站点的域名。如果您已执行此操作但问题仍未解决,请告知我。
omerk
8
你好,Simon
这是一个标准的 WordPress 安装(非多站点)。登出问题已修复。
问题出在登录后的重定向上,即用户在 WordPress 登录后没有被重定向回 Discourse 站点。相反,看起来 MemberPress 将他们发送到了 WordPress 上的默认页面。
–Omer
simon
9
您是否知道在 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!你真是个摇滚明星!
我也很犹豫是否要立即将此添加到我的生产网站。我想我可能需要为此专门搭建一个测试站点。