问题描述
I am developing a free plugin 用于将外部支持系统连接到 WordPress,以便能够对 WordPress 上的用户进行身份验证。
为此,目前来自外部系统的用户最终将发送到 WordPress 的登录页面
?action=freshdesk-remote-login
我的插件然后检查用户是否登录到 WP,如果没有显示登录表单和成功登录后重定向到第三方站点。
重定向是通过以下方式完成的:wp_redirect( $sso_url );
现在这样做很好,但我打算提供一个可以添加到用户选择的页面的短码。现在一旦用户访问此页面,如果他们登录,他们应该被转发到第三方网站,否则转发到登录页面。
有没有办法你可以建议 wp_redirect 在一个短码中工作?
最佳解决方案
正如 @Rarst 所解释的那样,短信通常运行得太晚,无法从内部重定向。他们通常运行在 the_content
钩子,这是内容发送到浏览器后很好。如果您需要根据短码的存在进行重定向,则在任何内容离开服务器之前,您需要检查该短码。
function pre_process_shortcode() {
if (!is_singular()) return;
global $post;
if (!empty($post->post_content)) {
$regex = get_shortcode_regex();
preg_match_all('/'.$regex.'/',$post->post_content,$matches);
if (!empty($matches[2]) && in_array('yourshortcodeslug',$matches[2]) && is_user_logged_in()) {
// redirect to third party site
} else {
// login form or redirect to login page
}
}
}
add_action('template_redirect','pre_process_shortcode',1);
这就是 「概念证明」 。您需要的特定条件可能会有所不同。请注意,这是一个漂亮的”heavy” 位处理。我会确保它只运行在绝对必要的地方。
次佳解决方案
wp_redirect()
通过 HTTP 头执行重定向,因此在技术上它不会 (或至少不应该) 在页面输出开始之后工作。所以你不能在短码中使用这个功能。
这并不意味着你不能使用短码来控制它。在输出开始 (template_redirect
钩子附近的地方) 之前,您可以检查适合条件 (页面和页面是否包含短码),然后执行重定向。
另一个选项是有条件地输出将在页面加载后执行重定向的 JavaScript 。
参考文献
注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。