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