Chuyển hướng người dùng đến url gốc sau khi đăng nhập?


16

Tôi có một chức năng chuyển hướng người dùng đến trang đăng nhập (nhà) nếu họ đang cố truy cập bất kỳ trang nào khác mà không đăng nhập, đây là cách nó hoạt động:

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 );

Thực sự đơn giản và hoạt động tốt, vấn đề là tôi cần chuyển hướng chúng đến url mà họ đang cố gắng truy cập sau khi họ đăng nhập thành công, chính xác như phụ trợ WordPress hoạt động.

Có cách nào để làm việc này không? Cảm ơn trước!

Câu trả lời:


16

Bạn có thể làm điều đó một cách dễ dàng. Bạn chỉ cần xác định một tham số chuyển hướng. Nếu bạn đang sử dụng một liên kết đăng nhập trên trang chủ để đi đến trang đăng nhập, thì giải pháp của @ sisir là chính xác.

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

Nếu bạn đang sử dụng một biểu mẫu tùy chỉnh trên frontpage, thì bên trong <form>, hãy đảm bảo bạn điền vào một trường ẩn bằng url để chuyển hướng

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

Và nếu bạn đang sử dụng wp_login_form()để tạo biểu mẫu, hãy điền vào một tham số - 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 );
?>

Thay đổi các thông số khác theo những gì bạn có hoặc cần.


Tôi đang sử dụng biểu mẫu tùy chỉnh và tôi đang sử dụng giải pháp trường ẩn được cung cấp của bạn, nhưng trong trường hợp của tôi, tôi đang được chuyển hướng đến url như 'localhost / wordpress / localhost / wordpress / blog / someone'. có ai giúp đỡ không
rafi

tôi đã nhận được điều này, tôi đang sử dụng dấu gạch chéo kép. vì vậy giải pháp của tôi là như thế này <? php echo '//'. $ _SERVER ["HTTP_HOST"]. $ _SERVER ["REQUEST_URI"]; ?>
rafi

6

Hãy thử chuyển qua the_permalink()làm $redirectđối số:

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 );

BIÊN TẬP:

Xin lỗi, hiểu nhầm câu hỏi của bạn ban đầu. Thử đi:

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 );

Cũng lưu ý: việc sử dụng đúng cách wp_redirect()thường yêu cầu thêm exit;, mà tôi đã thêm vào ví dụ thứ hai của mình.


Điều đó không có nghĩa gì cả, việc chuyển hướng cần phải về nhà, điều đó rất tốt Tôi cần một số cách để bắt được url gốc và chuyển hướng người dùng đến đó sau khi anh ta đăng nhập.
Javier Villanueva

Xin lỗi, hiểu lầm câu hỏi của bạn ban đầu. Tôi đã thêm một chỉnh sửa hy vọng giải quyết trường hợp sử dụng của bạn.
Chip Bennett

4

Cảm ơn tất cả, tôi đã sử dụng một chút những gì mọi người khuyên dùng nên cuối cùng mã của tôi trông như thế này:

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 );

Và trên biểu mẫu đăng nhập của tôi (Tôi đang mã hóa biểu mẫu đăng nhập của mình trong ứng dụng của mình, cảm ơn @Ashfame đã cho tôi biết về wp_login_form Tôi không biết nó tồn tại) Tôi đã thêm thông tin này khi thông tin đăng nhập của người dùng vẫn ổn và họ đã sẵn sàng để đăng nhập:

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;
}

Cảm ơn rất nhiều vì sự giúp đỡ của bạn, tôi đã bình chọn cho tất cả mọi người!


Xin chào, bạn đã thêm các chức năng này vào tập tin nào? Cảm ơn.
Tyler Durden

Trongfunctions.php
Javier Villanueva

4
Bạn nên gọi exit()hoặc die()sau wp_redirect(). Nếu không, có thể mã sau đó wp_redirect()sẽ thực thi, điều này có thể dẫn đến lỗi và lỗ hổng bảo mật.
Ian Dunn

2

đây là mã của tôi mà tôi sử dụng mọi người để trực tiếp đến trang đăng nhập wp. Sau đó, khi đăng nhập, họ trở lại nơi họ đang ở. Nhưng nó không phải là trang chủ mà là trang đăng nhập wordpress nơi tôi thiết lập đăng nhập tùy chỉnh.

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

Bạn có thể muốn nghiên cứu với. Thông thường, bạn sẽ nhận được url hiện tại của người dùng bằng cách$_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"]


0

Các login_redirectmóc lọc là một giải pháp hoàn chỉnh và hiệu quả hơn ở đây. Bằng cách này, bạn có thể cung cấp các đường dẫn chuyển hướng khác nhau cho các cấp độ người dùng khác nhau hoặc duy trì URL chuyển hướng trong trường hợp có lỗi khi đăng nhập (ví dụ: Mật khẩu không chính xác).

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

Nó không làm việc với bất kỳ câu trả lời nào của bạn mà chỉ thêm một điều nhỏ, nó đã hoạt động! Đây là mã của tôi:

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 );

Chỉ có tôi thêm /wp-login.phpvào so với phản hồi của @ Matt, nhưng đối với tôi là chìa khóa. Mong rằng sẽ giúp! :)

**BIÊN TẬP:

Tôi đã phát hiện một LRI khi bạn là FORCE wordpress để navegate trong HTTPS. Phương pháp này không hoạt động vì chuyển hướng trong HTTP. Để khắc phục sự cố tôi đã thay đổi chức năng. Đây là kết quả:

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 );

Tôi kiểm tra giao thức và sau đó tôi đã xóa ' esc_url' và thêm giao thức chính xác : $protocol://. Ngoài ra tôi đã thay đổi "".

Tôi dựa trên trang này .


0

Tôi biết điều này là siêu muộn, nhưng tôi đã viết một bài về chính xác làm thế nào để làm điều này nếu bất kỳ người nào trong tương lai tìm thấy nó và cần nó:

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


Mặc dù liên kết này có thể trả lời câu hỏi, tốt hơn là bao gồm các phần thiết yếu của câu trả lời ở đây và cung cấp liên kết để tham khảo. Câu trả lời chỉ liên kết có thể trở nên không hợp lệ nếu trang được liên kết thay đổi. Xem cách trả lời .
Gabriel
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.