問題描述

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 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。