Verifică dacă wp-login este pagina curentă

23 mar. 2011, 23:25:03
Vizualizări: 57.3K
Voturi: 58

Cum pot verifica dacă pagina curentă este wp-login.php sau wp-signup.php ?

Există soluții mai elegante decât folosirea $_SERVER['REQUEST_URI'] ?

1
Comentarii

Pentru referință, există o discuție relevantă pe trac aici https://core.trac.wordpress.org/ticket/19898

Stephen Harris Stephen Harris
29 aug. 2014 18:38:56
Toate răspunsurile la întrebare 14
4
72

Folosește variabila globală $pagenow, care este o variabilă globală comună setată de WordPress în timpul execuției:

if ( $GLOBALS['pagenow'] === 'wp-login.php' ) {
    // Suntem pe pagina de autentificare!
}

De asemenea, poți verifica și tipul paginii de autentificare, de exemplu înregistrarea:

if ( $GLOBALS['pagenow'] === 'wp-login.php' && ! empty( $_REQUEST['action'] ) && $_REQUEST['action'] === 'register' ) {
    // Suntem în procesul de înregistrare
}

Următorul cod este considerat învechit și nu ar trebui utilizat (wp-register.php a fost depreciat și ulterior eliminat de mult timp):

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

23 mar. 2011 23:59:58
Comentarii

Funcționează acest lucru dacă utilizatorul își schimbă URL-ul wp-login.php?

Lucas Bustamante Lucas Bustamante
23 ian. 2017 19:45:40

Bună întrebare de la @LucasBustamante și cred că poate fi testată ușor. Este foarte important să subliniez asta pentru a economisi timpul cuiva.

Ryan Bayne Ryan Bayne
16 sept. 2017 02:32:57

@T.Todua a oferit un răspuns mai sigur și mai fiabil mai jos.

mopsyd mopsyd
23 mar. 2018 00:43:04

Pentru mine chiar și pagenow spune că este index.php ...

trainoasis trainoasis
20 nov. 2018 06:08:56
6
24

Metoda mea preferată:

if( is_wplogin() ){
   ...
}

cod:

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

De ce este cea mai sigură metodă?

  1. Uneori, dacă încerci să verifici pagina de login folosind REQUEST_URI (sau SCRIPT_PATH), vei obține VALORI INCORECTE, deoarece multe plugin-uri modifică URL-urile pentru LOGIN & ADMIN.
    2) $pagenow va oferi, de asemenea, o valoare incorectă în acest caz!

Note:

  • În unele cazuri, s-ar putea să nu funcționeze dacă afișezi formularul de login (de exemplu, prin shortcode sau altă metodă) manual în alte fișiere/șabloane de pagini.

Actualizare în Nucleu:

Începând cu WordPress Versiunea 6.1 (Noiembrie 2022), există o funcție suplimentară în nucleu - is_login care verifică wp_login_url.

27 aug. 2016 12:13:09
Comentarii

Este fantastic. Folosirea fișierelor incluse pentru a determina locația unui vizitator nu este un scenariu pe care l-am întâlnit vreodată, dar are sens în acest caz.

Ryan Bayne Ryan Bayne
16 sept. 2017 02:35:41

@RyanBayne mulțumesc, da, aceasta este ocazia rară când get_included_files() pare a fi cea mai precisă soluție (cel puțin pentru mine).

T.Todua T.Todua
16 sept. 2017 20:48:30

Pentru mine returnează false, ca și cum nu ar fi o pagină wp-login... De asemenea, chiar și $GLOBALS['pagenow'] returnează index.php...

trainoasis trainoasis
20 nov. 2018 06:06:41

@trainoasis probabil folosești un formular de login manual (ca un shortcode) pe pagina principală sau ceva de genul?

T.Todua T.Todua
20 nov. 2018 09:29:42

Nu, folosesc wp-login.php normal :) Dar utilizez Sage și WooCommerce, poate asta schimbă cumva lucrurile :)

trainoasis trainoasis
21 nov. 2018 07:31:50

Acesta este răspunsul.

Philip Philip
14 nov. 2023 00:59:31
Arată celelalte 1 comentarii
0

În WordPress 6.1.0 a fost introdusă o nouă funcție numită is_login() care face exact acest lucru. https://developer.wordpress.org/reference/functions/is_login/

16 nov. 2022 10:55:42
2

O metodă mai modernă de a face asta, care ar trebui să funcționeze chiar și atunci când URL-ul wp-login este modificat de plugin-uri sau când WordPress este într-un subdirector, etc:

if(stripos($_SERVER["SCRIPT_NAME"], strrchr(wp_login_url(), '/')) !== false){
    /* ... */
}
1 mai 2016 01:11:06
Comentarii

Tocmai voiam să sugerez asta. Poate OP trebuie să parseze rezultatele din wp_login_url() și să compare doar calea web.

Svetoslav Marinov Svetoslav Marinov
19 ian. 2019 01:13:36

Îmi place cel mai mult acest răspuns. Pentru a se potrivi cu preferințele mele, l-am ajustat ușor la: return false !== stripos( wp_login_url(), $_SERVER['SCRIPT_NAME'] );. Mi se pare un pic mai curat.

Ian Dunn Ian Dunn
25 aug. 2019 04:07:09
0

$GLOBALS['pagenow'] nu funcționează, folosește $_SERVER['PHP_SELF'].

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

Și dacă WordPress-ul tău nu este instalat în directorul rădăcină al site-ului, ar trebui să folosești parametri precum CALE_WP/wp-login.php pentru a înlocui elementele din array.

25 nov. 2014 10:21:54
0

Iată o versiune mai ușor de citit a răspunsului lui @T.Todua. Am formatat-o mai frumos, am pus verificările cele mai simple la început și am returnat devreme:

function isLoginPage()
{
    // $_SERVER['PHP_SELF'] este egal cu "/wp-login.php"?
    if ($_SERVER['PHP_SELF'] == '/wp-login.php') {
        return true;
    }

    // $GLOBALS['pagenow'] este egal cu "wp-login.php"?
    if (isset($GLOBALS['pagenow']) && $GLOBALS['pagenow'] === 'wp-login.php') {
        return true;
    }


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

    // A fost inclus wp-login.php sau wp-register.php în timpul acestei execuții?
    if (
        in_array($ABSPATH_MY . 'wp-login.php', get_included_files()) ||
        in_array($ABSPATH_MY . 'wp-register.php', get_included_files())
    ) {
        return true;
    }

    return false;
}

Dacă dorești un impact minim asupra performanței, păstrează doar primele două verificări.

De asemenea, dacă rulezi această verificare după ce șablonul s-a încărcat, poți folosi simplu:

function isLogin() {
    if (!did_action('wp_loaded')) {
      return null;
    }
    return did_action('login_head');
}
18 ian. 2019 21:25:02
1

Am implementat acest lucru folosind metoda proprie a WordPress, wp_login_url(), după cum urmează:

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

Doar compararea ambelor căi (deoarece este dificil să fii absolut sigur de utilizarea SSL, deoarece aceasta poate fi terminată) ar trebui să fie suficientă... Totuși, înseamnă că un dezvoltator de plugin-uri sau teme care modifică formularul implicit de autentificare trebuie să fi făcut acest lucru în mod corespunzător...

7 apr. 2019 01:26:45
Comentarii

Pentru a ignora parametrii din URL, modifică ultima linie în: return substr(rtrim( strtolower( $_SERVER[ 'REQUEST_URI' ] ), '/' ), 0, strlen($login_path)) == $login_path ;

Design.Garden Design.Garden
17 sept. 2019 18:04:37
0

Niciunul dintre răspunsurile actuale nu a funcționat pentru mine.

Ceea ce am făcut a fost să verific dacă array-ul $_GET are o cheie 'page' și dacă valoarea sa este 'sign-in'.

if (isset($_GET['page']) && $_GET['page'] == 'sign-in'){
   // ești pe pagina de autentificare
}
7 oct. 2019 21:50:59
0

Dacă aveți nevoie să adăugați cod pentru pagina de autentificare, puteți folosi un hook pentru aceasta

<?php add_action( 'login_head', 'login_head_add_css' );
    function login_head_add_css() {
        ?>
        <style>
            body {
                background-image: url('/background.png');
            }
            .login h1 a{
                background-image: url('/logo.png');
                background-size: 300px !important;
                background-position: center top;
                background-repeat: no-repeat;
                color: #444;
                height: 120px;
                font-size: 20px;
                font-weight: 400;
                line-height: 1.3;
                margin: 0 auto 25px;
                padding: 0;
                text-decoration: none;
                width: 300px !important;
                text-indent: -9999px;
                outline: 0;
                overflow: hidden;
                display: block;
            }

        </style>
        <?php
    } ?>
12 apr. 2020 09:53:20
0

Acest fișier conține atât de multe action hooks. Mulțumesc, dezvoltatorilor WordPress!

Iată o listă cu cele mai comune action hooks, în ordinea în care sunt executate, pentru a te ajuta să începi.

  • login_enqueue_scripts
  • login_head
  • login_header
  • login_init
  • login_form_{$action}
    • confirm_admin_email
    • postpass
    • logout
    • lostpassword
    • retrievepassword
    • resetpass
    • rp
    • register
    • login
    • confirmaction
  • login_form
  • login_footer
9 nov. 2021 14:34:17
0

O metodă alternativă:

/**
 * Determină dacă pagina curentă este pagina de autentificare.
 * @return bool True dacă pagina curentă este pagina de autentificare.
 */
final public static function isLoginPage(): bool
{
    return function_exists('login_header');
}

Funcția login_header este definită în fișierul wp-login.php. Presupunem că pagina de autentificare nu este inclusă, deoarece aceasta este o pagină separată din WordPress, care ar trebui să fie apelată direct. Probabil una dintre cele mai sigure soluții.

28 dec. 2021 14:50:27
0

Aceasta este metoda mea preferată, care va gestiona orice slug pe care decideți să-l utilizați pentru pagina de autentificare. De asemenea, funcționează și cu formularele de autentificare personalizate, în cazul în care alegeți să nu folosiți formularul implicit de autentificare WordPress, deoarece is_login() nu va funcționa dacă nu includeți scriptul de autentificare. Utilizează global $wp în loc de array-ul $_SERVER.

global $wp;

if( trailingslashit( trailingslashit( site_url() ) . $wp->request ) !== wp_login_url() ) {
    // Sunteți pe pagina de autentificare
}
18 nov. 2022 03:08:47
1

Sunt interesat doar de pagina de înregistrare, nu de cea de autentificare. Prin urmare, această soluție poate să nu fie dorită de toată lumea.

$GLOBALS['pagenow'] returnează index.php în cazul meu. Poate din cauza BuddyPress sau a temei mele.

Așa că am folosit:

is_page('register')

Dacă inspectezi corpul paginii de înregistrare, acesta are și un ID, deci dacă apare page-id-4906, poți folosi această metodă dacă funcționează mai bine:

is_page('4906')
16 sept. 2015 23:30:44
Comentarii

Aceasta este valabilă doar dacă un plugin modifică autentificarea implicită.

Michael Ecklund Michael Ecklund
2 mar. 2016 01:04:35
1

Este întotdeauna o idee bună să folosești funcția nativă din WP is_login(). Aceasta a fost introdusă începând cu versiunea 6.1.

Detalii sunt disponibile aici

2 ian. 2023 14:20:32
Comentarii

Aceasta a fost deja menționată în https://wordpress.stackexchange.com/a/411320/3898 și https://wordpress.stackexchange.com/a/237285/3898. Răspunsurile redundante fac mai dificilă utilizarea site-ului, așa că aș recomanda ștergerea acestuia.

Ian Dunn Ian Dunn
7 feb. 2023 19:14:18