ฟังก์ชั่นการเปลี่ยนเส้นทางภายในย่อ


14

ฉันกำลังพัฒนาปลั๊กอินฟรีสำหรับเชื่อมต่อระบบสนับสนุนภายนอกกับ WordPress เพื่อให้สามารถตรวจสอบสิทธิ์ผู้ใช้ใน WordPress ได้

สำหรับเรื่องนี้ในปัจจุบันจากระบบภายนอกผู้ใช้จะถูกส่งไปยังหน้าเข้าสู่ระบบของ WordPress ด้วยสิ่งนี้ในตอนท้าย

?action=freshdesk-remote-login

ปลั๊กอินของฉันจะตรวจสอบว่าผู้ใช้ลงชื่อเข้าใช้ WP หรือไม่หากไม่แสดงรูปแบบการเข้าสู่ระบบและหลังจากเข้าสู่ระบบสำเร็จให้เปลี่ยนเส้นทางกลับไปยังเว็บไซต์บุคคลที่สาม

การเปลี่ยนเส้นทางทำได้โดยใช้สิ่งนี้: wp_redirect( $sso_url );

ตอนนี้ใช้งานได้ดี แต่ฉันวางแผนที่จะเสนอรหัสย่อซึ่งสามารถเพิ่มไปยังหน้าที่ผู้ใช้เลือกได้ ตอนนี้เมื่อผู้ใช้ไปที่หน้านี้หากพวกเขาเข้าสู่ระบบพวกเขาควรจะถูกส่งต่อไปยังเว็บไซต์ของบุคคลที่สามถ้าไม่แล้วไปที่หน้าเข้าสู่ระบบ

มีวิธีที่คุณสามารถแนะนำ wp_redirect ให้ทำงานภายในรหัสย่อได้หรือไม่?

คำตอบ:


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

ใช่คุณถูก. ขออภัยที่ต้องเสียเวลา ฉันมีรหัสของคุณหลายครั้ง ผมกลับไปใช้โค้ดข้างต้นของคุณ :)
Harish Chouhan

5

wp_redirect()ดำเนินการเปลี่ยนเส้นทางผ่านส่วนหัว HTTP ดังนั้นในทางเทคนิคแล้วจะไม่ทำงาน (หรืออย่างน้อยก็ไม่ควรทำงาน) หลังจากเริ่มต้นหน้าผลลัพธ์ ดังนั้นคุณไม่สามารถใช้ฟังก์ชันนี้ในย่อได้

ซึ่งไม่ได้หมายความว่าคุณจะไม่สามารถใช้รหัสย่อในการควบคุมได้ คุณสามารถตรวจสอบเงื่อนไขการปรับ (ถ้าหน้าและหน้ามีรหัสย่อ) ก่อนที่จะเริ่มการส่งออก (บางรอบtemplate_redirectเบ็ด) และดำเนินการเปลี่ยนเส้นทางแล้ว

อีกตัวเลือกหนึ่งคือส่งออก JavaScript แบบมีเงื่อนไขซึ่งจะทำการเปลี่ยนเส้นทางหลังจากโหลดหน้าเว็บแล้ว


สวัสดีฉันพบสิ่งนี้: `function pippin_login_form_shortcode ($ atts, $ content = null) {แยก (shortcode_atts (อาร์เรย์ ('เปลี่ยนเส้นทาง' => ''), $ atts)); if (! is_user_logged_in ()) {ถ้า ($ redirect) {$ redirect_url = $ redirect; } else {$ redirect_url = get_permalink (); } $ form = wp_login_form (อาร์เรย์ ('echo' => false, 'redirect' => $ redirect_url)); } ส่งคืนฟอร์ม $; } add_shortcode ('loginform', 'pippin_login_form_shortcode'); `ที่นี่ดูเหมือนว่า wp_redirect ถูกวางไว้ในรหัสย่อ
Harish Chouhan


@HarishChouhan คุณเห็นwp_redirect()รหัสนั้นอยู่ที่ไหน
Rarst

สวัสดีฉันขอโทษคุณพูดถูก ในโค้ดตัวอย่างมันเพิ่งบันทึก URL และไม่เปลี่ยนเส้นทางจริง ดังนั้นสำหรับคุณแล้วการเปลี่ยนเส้นทางโดยใช้ JavaScript ดูเหมือนจะเป็นตัวเลือกเดียวของฉัน
Harish Chouhan
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.