簡體   English   中英

登錄后如何將WordPress用戶重定向到上一頁

[英]How to redirect WordPress user to previous page after login

我有一個WordPress網站,任何人(未登錄)都可以查看一些/大部分頁面。 但是,用戶可以請求擁有自己的私有頁面,因此我設置了只能由該特定人員訪問的頁面,然后將URL通過電子郵件發送給他們。 他們單擊電子郵件中的URL,並向其頁面發送登錄鏈接。 登錄成功后,我希望用戶返回其私人頁面,但目前他們僅停留在其個人資料頁面。

登錄后如何將用戶重定向到其私人頁面?

我嘗試了很多不同的代碼,但是沒有一種適用於這種情況。

我當前的代碼如下。 但這只是將用戶送回到登錄頁面(即使登錄成功)。

// Function to redirect after login
add_filter('login_redirect', 'redirect_previous_page', 10, 1);

function redirect_previous_page( $redirect_to ){
    global $user;

    $request = $_SERVER["HTTP_REFERER"];

    if ( in_array( $user->roles[0], array( 'administrator') ) ) {

        return admin_url();

    } elseif ( in_array( $user->roles[0], array( 'subscriber') ) ) {

        return $request;
    } 

    return $redirect_to;
}

如果您使用首頁上的登錄鏈接轉到登錄頁面,請使用以下代碼,

echo wp_login_url( $_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"] );

如果您在首頁上使用自定義表單,請在內確保使用url填寫隱藏字段以進行重定向

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

如果您使用wp_login_form()生成表單,請遵循以下代碼,有關更多信息,請查看此頁面wp_login_form

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

如您所知,您將要重定向用戶到的頁面可以顯式執行,而不必獲取HTTP_REFERER。 同樣,使用in_array()函數檢查用戶角色更為可靠。

嘗試以下操作:(您將需要添加自己的邏輯來獲取用戶的私有頁面,該示例假定每個用戶頁面的url為yoursite.com/user/john)

function redirect_previous_page( $redirect_to, $request, $user  ) {
    if ( is_wp_error( $user ) ) { return $redirect_to; }

    if ( is_array( $user->roles ) && in_array( 'administrator', $user->roles ) ) {
        return admin_url();
    } else if ( is_array( $user->roles ) && in_array( 'subscriber', $user->roles ) ) {
        return site_url() . '/users/' . $user->user_login;  // Add your logic here      
    } else {
        return $redirect_to;        
    }
}
add_filter( 'login_redirect', 'redirect_previous_page', 10, 3 );

這是一個更深入地介紹它的教程。 https://tommcfarlin.com/redirect-non-admin/

另一個徹底討論了此問題的stackoverflow線程: 在Wordpress上登錄后重定向

到目前為止,我發現的最好的代碼如下(盡管對我來說這有1個大缺陷):

// Function to redirect after login (best so far)
function redirect_after_login(){
  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/wp-login.php?redirect_to= $protocol://" . 
$_SERVER["HTTP_HOST"] . urlencode($_SERVER["REQUEST_URI"]);
    wp_redirect( $redirect );
    exit;
  }
}
add_action( 'wp', 'redirect_after_login', 3 );

當我單擊電子郵件中的鏈接時,此代碼非常有用-在這種情況下,我將定向至登錄屏幕,然后定向至最初在電子郵件中單擊的頁面URL。 最大的問題是,任何非主頁也會將我重定向到登錄屏幕。 這意味着我的隨便的讀者只能在家里瀏覽我的網站。

當然,這應該沒那么難。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM