問題描述

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