Periksa apakah wp-login adalah halaman saat ini

Jawaban:

59

Gunakan global $pagenow, yang merupakan set global yang umum oleh WordPress saat runtime:

if ( $GLOBALS['pagenow'] === 'wp-login.php' ) {
    // We're on the login page!
}

Anda juga dapat memeriksa jenis halaman login, misalnya pendaftaran:

if ( $GLOBALS['pagenow'] === 'wp-login.php' && ! empty( $_REQUEST['action'] ) && $_REQUEST['action'] === 'register' ) {
    // We're registering
}

Kode berikut dianggap sebagai warisan dan tidak boleh digunakan ( wp-register.phpsudah usang & kemudian dihapus beberapa waktu lalu):

if ( in_array( $GLOBALS['pagenow'], array( 'wp-login.php', 'wp-register.php' ) ) )
    run_my_funky_plugin();

TheDeadMedic
sumber
3
Apakah ini berfungsi jika pengguna mengubah url wp-login.php?
Lucas Bustamante
Pertanyaan bagus dari @LucasBustamante dan saya kira itu mudah diuji. Sangat penting untuk menunjukkan dan menghemat waktu seseorang.
Ryan Bayne
1
@ T.Todua telah memberikan jawaban yang lebih aman dan lebih dapat diandalkan di bawah ini .
mopsyd
Bagi saya, bahkan pagenow mengatakan itu index.php ...
trainoasis
17

CARA HANYA YANG DAPAT DIANDALKAN:

if( is_wplogin() ){
   ...
}

kode:

function is_wplogin(){
    $ABSPATH_MY = str_replace(array('\\','/'), DIRECTORY_SEPARATOR, ABSPATH);
    return ((in_array($ABSPATH_MY.'wp-login.php', get_included_files()) || in_array($ABSPATH_MY.'wp-register.php', get_included_files()) ) || (isset($_GLOBALS['pagenow']) && $GLOBALS['pagenow'] === 'wp-login.php') || $_SERVER['PHP_SELF']== '/wp-login.php');
}

Mengapa ini paling aman?

1) Kadang-kadang, jika Anda mencoba untuk memeriksa halaman login menggunakan REQUEST_URI(atau SCRIPT_PATH), Anda akan mendapatkan NILAI TIDAK TEPAT, karena banyak plugin mengubah url LOGIN & ADMIN .
2) $pagenowakan memberi Anda nilai yang salah juga dalam kasus itu!

Catatan:

  • Dalam beberapa kasus, ini mungkin tidak berfungsi jika Anda mengeluarkan formulir masuk (yaitu dengan kode pendek atau dll) secara manual pada file / halaman templat lainnya.
T.Todua
sumber
2
Ini fantastis. Menggunakan file yang disertakan untuk menentukan lokasi pengunjung bukanlah skenario yang pernah saya lakukan tetapi masuk akal dalam hal ini.
Ryan Bayne
@RyanBayne thnx, ya, ini adalah kesempatan langka ketika get_included_files()tampaknya solusi yang paling akurat (jangan sampai bagi saya).
T.Todua
Bagi saya itu mengembalikan false, seolah-olah itu bukan halaman wp-login ... Juga $ GLOBALS ['pagenow'] mengembalikan index.php ...
trainoasis
@trainoasis mungkin Anda menggunakan formulir masuk manual (seperti kode pendek) di beranda atau seperti itu?
T.Todua
Tidak, normal wp-login.php :) Tapi saya menggunakan Sage dan WooCommerce, mungkin itu mengubah segalanya entah bagaimana :)
trainoasis
3

Cara yang lebih modern untuk melakukannya, itu harus bekerja bahkan ketika URL wp-login diubah oleh plugins dan ketika WP berada dalam subfolder, dll:

if(stripos($_SERVER["SCRIPT_NAME"], strrchr(wp_login_url(), '/')) !== false){
    /* ... */
}
Firsh - LetsWP.io
sumber
1
Saya akan menyarankan itu. Mungkin OP perlu mem-parsing hasil dari wp_login_url () dan membandingkan jalur web.
Svetoslav Marinov
1
Saya suka jawaban ini yang terbaik. Untuk menyesuaikan preferensi saya, saya tweak sedikit untuk: return false !== stripos( wp_login_url(), $_SERVER['SCRIPT_NAME'] );. Rasanya agak lebih bersih bagi saya.
Ian Dunn
2

$GLOBALS['pagenow']tidak berfungsi, gunakan $_SERVER['PHP_SELF'].

if ( in_array( $_SERVER['PHP_SELF'], array( '/wp-login.php', '/wp-register.php' ) ) ){
    // do something.
}

dan jika wordpress Anda tidak diinstal di folder root web, Anda harus menggunakan beberapa params YOUR_WP_PATH/wp-login.phpuntuk mengganti elemen dalam array.

dallaslu
sumber
1

Saya telah menerapkannya menggunakan metode WordPress own wp_login_url () sebagai berikut:

public static function is_wp_login() {
  $login_path = rtrim( strtolower( parse_url( wp_login_url( '', true ), PHP_URL_PATH ) ), '/' );
  return ( rtrim( strtolower( $_SERVER[ 'REQUEST_URI' ] ), '/' ) == $login_path );
}

Hanya membandingkan kedua jalur (karena sulit untuk benar-benar yakin tentang penggunaan SSL karena dapat diakhiri) sudah cukup ... Namun itu berarti, bahwa pengembang plugin atau tema yang mengubah formulir login default harus dilakukan jadi cara yang tepat ...

Mavawie
sumber
Untuk mengabaikan parl url, ubah baris terakhir ke: return substr (rtrim (strtolower ($ _SERVER ['REQUEST_URI']), '/'), 0, strlen ($ login_path)) == $ login_path;
matt[
0

Saya hanya tertarik pada halaman register, bukan di halaman login. Jadi ini mungkin tidak diinginkan oleh semua orang.

$ GLOBALS ['pagenow'] mengembalikan index.php untuk saya. Mungkin karena buddypress atau tema saya.

Jadi saya menggunakan

is_page('register')

Jika Anda memeriksa isi halaman registrasi, ia juga memiliki ID, jadi jika ia mengatakan page-id-4906 , Anda dapat menggunakannya dengan cara ini jika berfungsi lebih baik:

is_page('4906')
zeta
sumber
2
Ini hanya valid jika plugin memodifikasi login default.
Michael Ecklund
0

Tidak ada jawaban saat ini yang berfungsi untuk saya.

Apa yang saya lakukan adalah memeriksa apakah $_GETarray memiliki kunci 'halaman' dan apakah nilainya 'masuk'.

if (isset($_GET['page']) && $_GET['page'] == 'sign-in'){
   // you're on login page
}
Rafael Carneiro de Moraes
sumber
-1

Beberapa solusi yang diusulkan di sini berfungsi, jadi saya datang dengan sesuatu yang sangat sederhana yang berfungsi di situs WordPress biasa (tidak diuji pada Multisite).

Sesederhana:

    if( !isset($_GET['action']) ){
        echo 'This is the Login Page.';
    } else { 
        echo 'This is the Register Page.';
    }

Ini memperhitungkan parameter url ?action=register, yang hanya ada ketika Anda berada di halaman pendaftaran.

Adriano Monecchi
sumber
2
Itu tentu bukan solusi yang baik, Anda bisa memiliki parameter "aksi" di mana saja di templat atau plugin halaman khusus Anda, bukan? :)
trainoasis
Memang. Ini mungkin bekerja untuk pemeriksaan sederhana saat mengirim file atau melakukan fungsi template sederhana pada halaman login, tetapi pasti ada cara yang lebih aman untuk mencapainya.
Adriano Monecchi
-1

Inilah jawaban PST-2 versi @ T.Todua. Saya baru saja memformatnya dengan baik. Ini lebih baik untuk memanipulasi fungsi, seperti menambahkan filter untuk tujuan pengujian, dll:

function isLoginPage()
{
    $is_login_page = false;

    $ABSPATH_MY = str_replace(array('\\', '/'), DIRECTORY_SEPARATOR, ABSPATH);

    // Was wp-login.php or wp-register.php included during this execution?
    if (
        in_array($ABSPATH_MY . 'wp-login.php', get_included_files()) ||
        in_array($ABSPATH_MY . 'wp-register.php', get_included_files())
    ) {
        $is_login_page = true;
    }

    // $GLOBALS['pagenow'] is equal to "wp-login.php"?
    if (isset($GLOBALS['pagenow']) && $GLOBALS['pagenow'] === 'wp-login.php') {
        $is_login_page = true;
    }

    // $_SERVER['PHP_SELF'] is equal to "/wp-login.php"?
    if ($_SERVER['PHP_SELF'] == '/wp-login.php') {
        $is_login_page = true;
    }

    return $is_login_page;
}
Lucas Bustamante
sumber