简码内的重定向功能


14

我正在开发一个免费插件,用于将外部支持系统连接到WordPress,以便能够在WordPress上对用户进行身份验证。

为此,当前从外部系统将用户发送到WordPress的登录页面,并在此结尾

?action=freshdesk-remote-login

然后,我的插件检查用户是否已登录WP,如果未登录,则显示登录表单,并在成功登录后将其重定向回第三方站点。

重定向是使用类似以下的方法完成的: wp_redirect( $sso_url );

现在这可以正常工作,但是我打算提供一个短代码,可以将其添加到用户选择的页面中。现在,一旦用户进入该页面,如果他们已登录,则应将其转发到第三方站点;如果未登录,则应转发到登录页面。

有什么方法可以建议wp_redirect在简码中工作?

Answers:


21

正如@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);

那就是“概念证明”。您需要的特定条件可能会有所不同。请注意,这是相当“繁重”的处理过程。我会确保它只在绝对必要的地方运行。


谢谢一吨。这是完美的,而且正是我想要的。
Harish Chouhan

您好,我添加了一些检查以确保该代码仅在特定页面上运行,但是我注意到,将wp_redirect放在短代码内也可以正常工作。我尝试使用javascript,也可以使用wp_redirect( $sso_url );,它也可以正常工作。
Harish Chouhan

1
wp_redirect在正常情况下不能以简码工作。我刚刚检查。如果它对您有用,则您的主题或插件正在执行与我建议的使其类似的工作。
s_ha_dum 2013年

你是对的。抱歉浪费您的时间。我有您的代码的多个实例。我将使用您的上述代码:)
Harish Chouhan

5

wp_redirect()通过HTTP标头执行重定向,因此从技术上讲,页面输出开始后将不会(或至少不应该)正常工作。因此,您不能只在简码中使用此功能。

但这并不意味着您不能使用简码来控制它。您可以在输出开始之前(在template_redirect挂钩附近)检查适合条件(如果页面和页面包含短代码),然后执行重定向。

另一个选择是有条件地输出JavaScript,该JavaScript将在页面加载后执行重定向。


你好我发现了:`函数pippin_login_form_shortcode($ atts,$ content = null){ if(!is_user_logged_in()){if($ redirect){$ redirect_url = $ redirect; } else {$ redirect_url = get_permalink(); } $ form = wp_login_form(array('echo'=> false,'redirect'=> $ redirect_url)); }返回$ form; } add_shortcode('loginform','pippin_login_form_shortcode');`在这里,似乎wp_redirect放在了简码中。
Harish Chouhan


@HarishChouhan您wp_redirect()在代码中的哪里看到?
2013年

您好,很抱歉您是对的。在示例代码中,它仅保存URL而不实际重定向。因此,对您而言,基于JavaScript的重定向似乎是我唯一的选择?
Harish Chouhan
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.