Verificare se la pagina corrente è wp-login

23 mar 2011, 23:25:03
Visualizzazioni: 57.3K
Voti: 58

Come posso verificare se la pagina corrente è wp-login.php o wp-signup.php?

Esistono soluzioni più eleganti rispetto all'uso di $_SERVER['REQUEST_URI']?

1
Commenti

Per riferimento, qui c'è una discussione correlata su trac https://core.trac.wordpress.org/ticket/19898

Stephen Harris Stephen Harris
29 ago 2014 18:38:56
Tutte le risposte alla domanda 14
4
72

Utilizza la variabile globale $pagenow, che è una variabile globale comune impostata da WordPress durante l'esecuzione:

if ( $GLOBALS['pagenow'] === 'wp-login.php' ) {
    // Siamo nella pagina di login!
}

Puoi anche verificare il tipo di pagina di login, ad esempio la registrazione:

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

Il seguente codice è considerato legacy e non dovrebbe essere utilizzato (wp-register.php è stato deprecato e successivamente rimosso già da tempo):

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

23 mar 2011 23:59:58
Commenti

Funziona se l'utente cambia l'URL di wp-login.php?

Lucas Bustamante Lucas Bustamante
23 gen 2017 19:45:40

Buona domanda da @LucasBustamante e suppongo sia facilmente testabile. È molto importante sottolinearlo e far risparmiare tempo a qualcuno.

Ryan Bayne Ryan Bayne
16 set 2017 02:32:57

@T.Todua ha fornito una risposta più sicura e affidabile qui sotto.

mopsyd mopsyd
23 mar 2018 00:43:04

Per me anche pagenow dice che è index.php ...

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

Il mio metodo preferito:

if( is_wplogin() ){
   ...
}

codice:

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

Perché è il più sicuro?

  1. A volte, se provi a verificare la pagina di login usando REQUEST_URI(o SCRIPT_PATH), otterrai VALORI ERRATI, perché molti plugin modificano gli URL di LOGIN & ADMIN.
    2) Anche $pagenow ti darà un valore errato in quel caso!

Note:

  • In alcuni casi, potrebbe non funzionare se generi il form di login manualmente (ad esempio con shortcode o altro) su altri template file/pagine.

Aggiornamento Core:

A partire dalla versione 6.1 di WordPress (Nov 2022) è presente una funzione aggiuntiva nel core - is_login che verifica wp_login_url.

27 ago 2016 12:13:09
Commenti

È fantastico. Utilizzare i file inclusi per determinare la posizione di un visitatore non è uno scenario in cui mi sono mai trovato, ma in questo caso ha senso.

Ryan Bayne Ryan Bayne
16 set 2017 02:35:41

@RyanBayne grazie, sì, questa è una di quelle rare occasioni in cui get_included_files() sembra essere la soluzione più accurata (almeno per me).

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

Per me restituisce false, come se non fosse una pagina wp-login... Inoltre anche $GLOBALS['pagenow'] restituisce index.php...

trainoasis trainoasis
20 nov 2018 06:06:41

@trainoasis probabilmente stai usando un modulo di login manuale (come uno shortcode) nella homepage o qualcosa del genere?

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

No, il normale wp-login.php :) Ma sto usando Sage e WooCommerce, forse questo cambia qualcosa :)

trainoasis trainoasis
21 nov 2018 07:31:50

Questa è la risposta.

Philip Philip
14 nov 2023 00:59:31
Mostra i restanti 1 commenti
0

È stata introdotta una nuova funzione in WordPress 6.1.0 chiamata is_login() che fa esattamente questo. https://developer.wordpress.org/reference/functions/is_login/

16 nov 2022 10:55:42
2

Modo più moderno per farlo, dovrebbe funzionare anche quando l'URL di wp-login viene modificato da plugin e quando WP si trova in una sottocartella, ecc:

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

Stavo per suggerirlo. Forse l'OP ha bisogno di analizzare i risultati da wp_login_url() e confrontare solo il percorso web.

Svetoslav Marinov Svetoslav Marinov
19 gen 2019 01:13:36

Questa risposta mi piace di più. Per adattarla alle mie preferenze, l'ho modificata leggermente in: return false !== stripos( wp_login_url(), $_SERVER['SCRIPT_NAME'] );. Mi sembra un po' più pulito.

Ian Dunn Ian Dunn
25 ago 2019 04:07:09
0

$GLOBALS['pagenow'] non funziona, usa $_SERVER['PHP_SELF'].

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

e se la tua installazione di WordPress non è nella cartella root del sito web, dovresti usare dei parametri come IL_TUO_PERCORSO_WP/wp-login.php per sostituire gli elementi nell'array.

25 nov 2014 10:21:54
0

Ecco una versione più leggibile della risposta di @T.Todua. Ho semplicemente formattato il codice in modo più ordinato, inserito prima i controlli meno costosi e aggiunto un return early:

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

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


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

    // wp-login.php o wp-register.php sono stati inclusi durante questa esecuzione?
    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;
}

Se vuoi il minimo impatto sulle prestazioni, lascia solo i primi due controlli.

Inoltre, se stai eseguendo questo controllo dopo che il template è stato caricato, puoi semplicemente usare:

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

Ho implementato utilizzando il metodo wp_login_url() di WordPress nel seguente modo:

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

Semplicemente confrontando entrambi i percorsi (perché è difficile essere assolutamente certi sull'uso di SSL poiché potrebbe essere terminato) dovrebbe essere sufficiente... Tuttavia, significa che uno sviluppatore di plugin o temi che modifica il modulo di login predefinito deve averlo fatto nel modo corretto...

7 apr 2019 01:26:45
Commenti

Per ignorare i parametri dell'URL, modifica l'ultima riga con: return substr(rtrim( strtolower( $_SERVER[ 'REQUEST_URI' ] ), '/'), 0, strlen($login_path)) == $login_path ;

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

Nessuna delle risposte attuali ha funzionato per me.

Quello che ho fatto è stato verificare se l'array $_GET ha una chiave 'page' e se il suo valore è 'sign-in'.

if (isset($_GET['page']) && $_GET['page'] == 'sign-in'){
   // sei nella pagina di login
}
7 ott 2019 21:50:59
0

Se hai bisogno di aggiungere del codice per la pagina di login, puoi utilizzare un hook per farlo

<?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

Questo file ha così tanti hook di azione. Grazie sviluppatori WordPress!

Ecco un elenco dei più comuni per iniziare, nell'ordine in cui vengono eseguiti.

  • 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

Un metodo alternativo:

/**
 * Determina se la pagina corrente è la pagina di login.
 * @return bool True se la pagina corrente è la pagina di login.
 */
final public static function isLoginPage(): bool
{
    return function_exists('login_header');
}

La funzione login_header è definita nel file wp-login.php. Assumiamo che la pagina di login non sia inclusa in quanto è una pagina separata di WordPress, che dovrebbe essere chiamata direttamente. Probabilmente una delle soluzioni più affidabili.

28 dic 2021 14:50:27
0

Questo è il mio metodo preferito, gestirà qualsiasi slug che decidi di utilizzare per la pagina di login. Gestisce anche i form di login personalizzati se decidi di non utilizzare il form di login predefinito di WordPress, poiché is_login() non funzionerà se non includi lo script di login. Utilizza global $wp invece dell'array $_SERVER.

global $wp;

if( trailingslashit( trailingslashit( site_url() ) . $wp->request ) !== wp_login_url() ) {
    // Sei nella pagina di login
}
18 nov 2022 03:08:47
1

Sono interessato solo alla pagina di registrazione, non a quella di accesso. Quindi questo potrebbe non essere desiderato da tutti.

$GLOBALS['pagenow'] restituisce index.php nel mio caso. Forse a causa di buddypress o del mio tema.

Quindi ho utilizzato

is_page('register')

Se ispezioni il body della pagina di registrazione, ha anche l'ID, quindi se mostra page-id-4906, puoi usarlo in questo modo se funziona meglio:

is_page('4906')
16 set 2015 23:30:44
Commenti

Questo è valido solo se un plugin sta modificando il login predefinito.

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

È sempre una buona idea utilizzare la funzione nativa di WP is_login(). Questa è stata introdotta a partire dalla versione 6.1.

Qui trovi i dettagli

2 gen 2023 14:20:32
Commenti

Questo era già stato menzionato in https://wordpress.stackexchange.com/a/411320/3898 e https://wordpress.stackexchange.com/a/237285/3898. Le risposte ridondanti rendono più difficile l'utilizzo del sito, quindi consiglierei di eliminare questa.

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