Mengarahkan pengguna ke url asli setelah masuk?

16

Saya memiliki fungsi yang mengarahkan pengguna ke halaman login (rumah) jika mereka mencoba mengakses halaman lain tanpa login, berikut cara kerjanya:

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

Benar-benar sederhana dan berfungsi dengan baik, masalahnya adalah bahwa saya perlu mengarahkan mereka ke url yang mereka coba buka setelah mereka berhasil masuk, persis seperti karya backend WordPress.

Apakah ada cara untuk melakukan ini? Terima kasih sebelumnya!

Javier Villanueva
sumber

Jawaban:

16

Anda dapat melakukannya dengan mudah. Anda hanya perlu menentukan parameter pengalihan. Jika Anda menggunakan tautan masuk pada beranda untuk menuju ke halaman masuk, maka solusi @ sisir benar.

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

Jika Anda menggunakan formulir khusus di halaman depan, maka di dalam <form>, pastikan Anda mengisi bidang tersembunyi dengan url untuk mengalihkan

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

Dan jika Anda menggunakan wp_login_form()untuk menghasilkan formulir, maka isi parameter - 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 );
?>

Ubah parameter lain sesuai yang Anda miliki atau butuhkan.

Asfame
sumber
saya menggunakan formulir kustom, dan saya menggunakan solusi bidang tersembunyi yang Anda berikan, tetapi dalam kasus saya saya diarahkan ke url seperti ini 'localhost / wordpress / localhost / wordpress / blog / seseorang'. ada bantuan?
rafi
saya sudah mendapatkan ini, saya menggunakan double slash. jadi solusi saya seperti ini <? php echo '//'. $ _SERVER ["HTTP_HOST"]. $ _SERVER ["REQUEST_URI"]; ?>
rafi
6

Coba sampaikan the_permalink()sebagai $redirectargumen:

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

EDIT:

Maaf, salah paham pertanyaan Anda awalnya. Coba ini:

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

Catatan juga: penggunaan yang tepat dari wp_redirect()umumnya membutuhkan penambahan exit;, yang telah saya tambahkan ke contoh kedua saya.

Chip Bennett
sumber
Itu tidak masuk akal, redirect harus pergi ke rumah, itu berfungsi dengan baik Saya perlu beberapa cara untuk menangkap url asli dan mengarahkan pengguna di sana setelah dia login.
Javier Villanueva
Maaf, salah paham pertanyaan Anda awalnya. Saya telah menambahkan hasil edit yang diharapkan dapat mengatasi kasus penggunaan Anda.
Chip Bennett
4

Terima kasih semua, saya agak menggunakan sedikit apa yang direkomendasikan semua orang sehingga pada akhirnya kode saya terlihat seperti ini:

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

Dan pada formulir login saya (saya hardcoding formulir login saya di aplikasi saya, terima kasih @Ashfame karena memberi tahu saya tentang wp_login_form, saya tidak tahu itu ada). Saya menambahkan ini ketika kredensial pengguna baik-baik saja dan mereka siap untuk masuk:

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

Terima kasih banyak atas bantuan Anda, saya memilih semua orang!

Javier Villanueva
sumber
Hai Javier, di file mana Anda menambahkan fungsi-fungsi ini? Terima kasih.
Tyler Durden
Infunctions.php
Javier Villanueva
4
Anda harus menelepon exit()atau die()setelah wp_redirect(). Jika tidak, kode setelahnya wp_redirect()akan dieksekusi, yang dapat menyebabkan bug dan kerentanan keamanan.
Ian Dunn
2

ini kode saya yang saya gunakan orang untuk mengarahkan ke halaman login wp. Kemudian ketika login mereka kembali ke tempat mereka sebelumnya. Tapi itu bukan halaman rumah tetapi halaman login wordpress tempat saya mengatur login kustom.

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

Anda mungkin ingin meneliti. Biasanya Anda akan mendapatkan url pengguna saat ini$_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"]

Sisir
sumber
0

The login_redirectFilter kail adalah solusi yang lebih lengkap dan efektif di sini. Dengan cara ini, Anda dapat menawarkan jalur pengalihan yang berbeda untuk tingkat pengguna yang berbeda, atau mempertahankan URL pengalihan jika terjadi kesalahan saat masuk (yaitu Kata Sandi Salah).

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 );
Mat
sumber
0

Tidak ada jawaban Anda yang berhasil tetapi hanya menambahkan sedikit, itu berhasil! Ini kode saya:

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

Hanya saya menambahkan /wp-login.phpdibandingkan dengan tanggapan @ Matt, tetapi bagi saya telah menjadi kuncinya. Semoga itu bisa membantu! :)

** EDIT:

Saya mendeteksi KESALAHAN ketika Anda FORCE wordpress untuk navegate di HTTPS. Metode ini tidak berfungsi karena pengalihan dalam HTTP. Untuk memperbaiki masalah saya mengubah fungsi. Ini hasilnya:

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

Aku memeriksa protokol dan kemudian saya dihapus ' esc_url' dan menambahkan protokol yang benar: $protocol://. Saya juga mengubah "".

Saya berbasis pada halaman ini .

Neil
sumber
0

Saya tahu ini sangat terlambat, tetapi saya membuat posting tentang bagaimana tepatnya melakukan ini jika ada orang di masa depan yang menemukan ini dan membutuhkannya:

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

user90810
sumber
Meskipun tautan ini dapat menjawab pertanyaan, lebih baik untuk memasukkan bagian-bagian penting dari jawaban di sini dan memberikan tautan untuk referensi. Jawaban hanya tautan dapat menjadi tidak valid jika halaman tertaut berubah. Lihat Cara Menjawab .
Gabriel