问题描述

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 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。