เปลี่ยนเส้นทางผู้ใช้ไปยัง URL ดั้งเดิมหลังจากเข้าสู่ระบบหรือไม่


16

ฉันมีฟังก์ชั่นที่เปลี่ยนเส้นทางผู้ใช้ไปยังหน้าเข้าสู่ระบบ (บ้าน) หากพวกเขาพยายามเข้าถึงหน้าอื่น ๆ โดยไม่ต้องเข้าสู่ระบบนี่คือวิธีการใช้งาน:

function restrict_access_if_logged_out(){
    if (!is_user_logged_in() && !is_home()){
        wp_redirect( get_option('home') );
    }
}
add_action( 'wp', 'restrict_access_if_logged_out', 3 );

ง่ายมากและใช้งานได้ดีปัญหาคือฉันต้องเปลี่ยนเส้นทางไปยัง URL ที่พวกเขาพยายามไปหลังจากที่พวกเขาประสบความสำเร็จในการเข้าสู่ระบบเช่นเดียวกับแบ็กเอนด์ WordPress ทำงาน

มีวิธีทำเช่นนี้หรือไม่? ขอบคุณล่วงหน้า!

คำตอบ:


16

คุณสามารถทำได้อย่างง่ายดาย คุณเพียงแค่ต้องระบุพารามิเตอร์การเปลี่ยนเส้นทาง หากคุณใช้ลิงค์เข้าสู่ระบบในหน้าแรกเพื่อไปที่หน้าเข้าสู่ระบบแสดงว่าโซลูชั่นของ @ sisir นั้นถูกต้อง

<?php echo wp_login_url( $_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"] ); ?>

หากคุณใช้แบบฟอร์มที่กำหนดเองในหน้าแรกจากนั้น<form>ให้ตรวจสอบให้แน่ใจว่าคุณกรอกข้อมูลในฟิลด์ที่ซ่อนไว้พร้อมกับ URL เพื่อเปลี่ยนเส้นทาง

<input type="hidden" name="redirect_to" value="<?php echo $_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"]; ?>" />

และถ้าคุณใช้wp_login_form()เพื่อสร้างแบบฟอร์มให้กรอกพารามิเตอร์ - http://codex.wordpress.org/Function_Reference/wp_login_form

<?php
$args = array(
        'echo' => true,
        'redirect' => site_url( $_SERVER['REQUEST_URI'] ), 
        'form_id' => 'loginform',
        'label_username' => __( 'Username' ),
        'label_password' => __( 'Password' ),
        'label_remember' => __( 'Remember Me' ),
        'label_log_in' => __( 'Log In' ),
        'id_username' => 'user_login',
        'id_password' => 'user_pass',
        'id_remember' => 'rememberme',
        'id_submit' => 'wp-submit',
        'remember' => true,
        'value_username' => NULL,
        'value_remember' => false );

wp_login_form( $args );
?>

เปลี่ยนพารามิเตอร์อื่น ๆ ตามที่คุณมีหรือต้องการ


ฉันใช้แบบฟอร์มที่กำหนดเองและฉันใช้โซลูชันฟิลด์ที่ซ่อนไว้ของคุณ แต่ในกรณีของฉันฉันถูกเปลี่ยนเส้นทางไปยัง URL เช่น 'localhost / wordpress / localhost / wordpress / blog / someone' ความช่วยเหลือใด ๆ
rafi

ฉันได้รับสิ่งนี้ฉันกำลังใช้เครื่องหมายทับสองครั้ง ดังนั้นทางออกของฉันเป็นเช่นนี้ <? php echo '//' $ _SERVER ["HTTP_HOST"] $ _SERVER [ "REQUEST_URI"]; ?>
rafi

6

ลองส่งthe_permalink()เป็น$redirectอาร์กิวเมนต์:

function restrict_access_if_logged_out(){
    if (!is_user_logged_in() && !is_home()){
        wp_redirect( the_permalink() );
    }
}
add_action( 'wp', 'restrict_access_if_logged_out', 3 );

แก้ไข:

ขออภัยเข้าใจผิดคำถามเดิมของคุณ ลองสิ่งนี้:

function restrict_access_if_logged_out(){
    if (!is_user_logged_in() && !is_home()){
        $redirect = home_url() . '/wp-login.php?redirect_to=' . urlencode( $_SERVER['REQUEST_URI'] );
        wp_redirect( $redirect );
        exit;
    }
}
add_action( 'wp', 'restrict_access_if_logged_out', 3 );

หมายเหตุ: การใช้งานที่เหมาะสมwp_redirect()โดยทั่วไปจำเป็นต้องเพิ่มexit;ซึ่งฉันได้เพิ่มลงในตัวอย่างที่สองของฉัน


นั่นไม่สมเหตุสมผลเลยการเปลี่ยนทิศทางต้องกลับบ้านทำงานได้ดีฉันต้องการวิธีจับ url ดั้งเดิมและเปลี่ยนเส้นทางผู้ใช้ที่นั่นเมื่อเขาล็อกอิน
Javier Villanueva

ขออภัยเข้าใจผิดคำถามเดิมของคุณ ฉันได้เพิ่มการแก้ไขที่หวังว่าจะตอบโจทย์การใช้งานของคุณ
Chip Bennett

4

ขอบคุณทุกคนฉันใช้สิ่งที่ทุกคนแนะนำในท้ายที่สุดรหัสของฉันมีลักษณะเช่นนี้:

function restrict_access_if_logged_out(){
    if (!is_user_logged_in() && !is_home()){
        wp_redirect( get_option('home') . '?redirect_to=' . esc_url($_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"]) );
    }
}
add_action( 'wp', 'restrict_access_if_logged_out', 3 );

และในแบบฟอร์มการเข้าสู่ระบบของฉัน (ฉัน hardcoding แบบฟอร์มการเข้าสู่ระบบของฉันในการใช้งานของฉันขอบคุณ @Affame ที่แจ้งให้ฉันทราบเกี่ยวกับ wp_login_form ฉันไม่ทราบว่ามันมีอยู่จริง) ฉันเพิ่มสิ่งนี้เมื่อข้อมูลประจำตัวผู้ใช้ถูกต้อง

if (isset($_REQUEST['redirect_to'])){
    wp_redirect($_REQUEST['redirect_to']);
    // wp_redirect() does not exit automatically, and should almost always be followed by a call to exit;
    exit;

} else {
    wp_redirect(get_bloginfo('url') . '/groups/');
    exit;
}

ขอบคุณมากสำหรับความช่วยเหลือของคุณฉันโหวตให้ทุกคน!


สวัสดี Javier คุณเพิ่มไฟล์เหล่านี้ลงในไฟล์ใด ขอบคุณ
Tyler Durden

ในfunctions.php
Javier Villanueva

4
คุณควรจะเรียกexit()หรือหลังdie() wp_redirect()มิฉะนั้นอาจเป็นไปได้ว่ารหัสหลังจากwp_redirect()จะดำเนินการซึ่งสามารถนำไปสู่ข้อบกพร่องและช่องโหว่ความปลอดภัย
เอียนดันน์

2

นี่คือรหัสของฉันที่ฉันใช้คนเพื่อนำไปสู่หน้าเข้าสู่ระบบ จากนั้นเมื่อเข้าสู่ระบบพวกเขากลับไปที่พวกเขาอยู่ แต่มันไม่ได้เป็นหน้าแรก แต่เป็นหน้าเข้าสู่ระบบ wordpress ที่ฉันตั้งค่าการเข้าสู่ระบบที่กำหนดเอง

<?php echo wp_login_url( $_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"]) ?>

คุณอาจต้องการค้นคว้าด้วย โดยทั่วไปแล้วคุณจะได้รับ URL ปัจจุบันของผู้ใช้$_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"]


0

login_redirectเบ็ดกรองเป็นโซลูชั่นที่สมบูรณ์และมีประสิทธิภาพมากขึ้นที่นี่ ด้วยวิธีนี้คุณสามารถเสนอเส้นทางการเปลี่ยนเส้นทางที่แตกต่างกันสำหรับผู้ใช้ในระดับต่างๆหรือรักษา URL การเปลี่ยนเส้นทางในกรณีที่เกิดข้อผิดพลาดเมื่อเข้าสู่ระบบ (เช่นรหัสผ่านไม่ถูกต้อง)

function login_redirect( $redirect_to, $request, $user ){
  if(isset($_REQUEST['redirect_to'])){
    return $_REQUEST['redirect_to'];
  }
  return admin_url();
}
add_filter( 'login_redirect', 'login_redirect', 10, 3 );

function restrict_access_if_logged_out(){
  if (!is_user_logged_in() && !is_home()){
    $redirect = home_url() . '?redirect_to=' . esc_url($_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"]);
    wp_redirect( $redirect );
  }
}
add_action( 'wp', 'restrict_access_if_logged_out', 3 );

0

มันไม่ได้ผลคำตอบใด ๆ ของคุณ แต่เพียงเพิ่มสิ่งเล็ก ๆ น้อย ๆ มันทำงานได้! นี่รหัสของฉัน:

function login_redirect( $redirect_to, $request, $user ){
  if(isset($_REQUEST['redirect_to'])){
    return $_REQUEST['redirect_to'];
  }
  return admin_url();
}
add_filter( 'login_redirect', 'login_redirect', 10, 3 );

function restrict_access_if_logged_out(){
  if (!is_user_logged_in() && !is_home()){
    $redirect = home_url() . '/wp-login.php?redirect_to=' . esc_url($_SERVER["HTTP_HOST"] . urlencode($_SERVER["REQUEST_URI"]));
    wp_redirect( $redirect );
    exit;
  }
}
add_action( 'wp', 'restrict_access_if_logged_out', 3 );

มีเพียงฉันที่เพิ่มเข้ามา/wp-login.phpเมื่อเทียบกับการตอบสนองของ @ Matt แต่สำหรับฉันนั้นเป็นกุญแจสำคัญ หวังว่าจะช่วย! :)

** แก้ไข:

ฉันตรวจพบข้อผิดพลาดเมื่อคุณบังคับให้ wordpress เป็น navegate ใน HTTPS วิธีนี้ใช้ไม่ได้เนื่องจากการเปลี่ยนเส้นทางอยู่ใน HTTP เพื่อแก้ไขปัญหาฉันเปลี่ยนฟังก์ชั่น นี่คือผลลัพธ์ที่ได้:

function restrict_access_if_logged_out(){
  global $wp;
  $protocol='http';
  if (isset($_SERVER['HTTPS']))
    if (strtoupper($_SERVER['HTTPS'])=='ON')
      $protocol='https';
  if (!is_user_logged_in() && !is_home() && ($wp->query_vars['pagename'] != 'downloads') ){
    $redirect = home_url() . "/wp-login.php?redirect_to= $protocol://" . $_SERVER["HTTP_HOST"] . urlencode($_SERVER["REQUEST_URI"]);
    wp_redirect( $redirect );
    exit;
  }
}
add_action( 'wp', 'restrict_access_if_logged_out', 3 );

ฉันตรวจสอบโปรโตคอลแล้วลบ ' esc_url' และเพิ่มโปรโตคอลที่ถูกต้อง: $protocol://. ""นอกจากนี้ผมเปลี่ยน

ฉันใช้หน้านี้


0

ฉันรู้ว่านี่มันสายไปแล้ว แต่ฉันได้โพสต์เกี่ยวกับวิธีการทำสิ่งนี้หากผู้คนในอนาคตพบและต้องการมัน:

http://www.ryanprejean.com/force-login-with-redirect-and-exceptions/


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