Controlla se wp-login è la pagina corrente


Risposte:


59

Usa il globale $pagenow, che è un set globale comune di WordPress in fase di esecuzione:

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

Puoi anche controllare il tipo di pagina di accesso, ad esempio la registrazione:

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

Il seguente codice è considerato legacy e non deve essere utilizzatowp-register.phpstato deprecato e successivamente rimosso un po 'di tempo fa):

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


3
Funziona se l'utente cambia il suo URL wp-login.php?
Lucas Bustamante,

Bella domanda da @LucasBustamante e suppongo che sia facilmente testato. È molto importante sottolineare e risparmiare tempo a qualcuno.
Ryan Bayne,

1
@ T.Todua ha fornito una risposta più sicura e affidabile di seguito .
mopsyd,

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

17

L'UNICO MODO AFFIDABILE:

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é è più sicuro?

1) A volte, se provi a controllare la pagina di accesso utilizzando REQUEST_URI(o SCRIPT_PATH), otterrai VALORI NON CORRETTI, poiché molti plug-in cambiano gli URL LOGIN & ADMIN .
2) $pagenowti darà anche un valore errato in quel caso!

Appunti:

  • In alcuni casi, potrebbe non funzionare se si genera manualmente il modulo di accesso (ad es. Con shortcode o ecc.) Su altri file / pagine di modello.

2
È fantastico. L'uso dei file inclusi per determinare la posizione di un visitatore non è uno scenario che mi sono mai trovato a fare, ma ha senso in questo caso.
Ryan Bayne,

@RyanBayne thnx, sì, questa è la rara occasione in cui get_included_files()sembra la soluzione più accurata (almeno per me).
T.Todua,

Per me restituisce false, come se non fosse una pagina di accesso wp ... Anche $ GLOBALS ['pagenow'] restituisce index.php ...
trainoasis,

@trainoasis probabilmente stai usando il modulo di login manuale (come shortcode) sulla homepage o in quel modo?
T.Todua,

No, normale wp-login.php :) Ma sto usando Sage e WooCommerce, forse questo cambia le cose in qualche modo :)
trainoasis,

3

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

if(stripos($_SERVER["SCRIPT_NAME"], strrchr(wp_login_url(), '/')) !== false){
    /* ... */
}

1
Lo avrei suggerito. Forse l'OP deve analizzare i risultati di wp_login_url () e oly confrontare il percorso web.
Svetoslav Marinov, il

1
Mi piace questa risposta al meglio. Per adattare le mie preferenze, ho ottimizzato leggermente per: return false !== stripos( wp_login_url(), $_SERVER['SCRIPT_NAME'] );. Mi sembra un po 'più pulito.
Ian Dunn,

2

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

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

e se il tuo wordpress non è installato nella cartella principale del web, dovresti usare alcuni parametri come YOUR_WP_PATH/wp-login.phpsostituire gli elementi nell'array.


1

L'ho implementato usando il metodo wp_login_url () di WordPress come segue:

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

Il solo confronto di entrambi i percorsi (poiché è difficile essere assolutamente sicuri sull'uso di SSL in quanto potrebbe essere terminato) dovrebbe essere sufficiente ... Significa, tuttavia, che un plug-in o uno sviluppatore di temi che modifica il modulo di accesso predefinito deve aver fatto quindi nel modo giusto ...


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

0

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

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

Quindi ho usato

is_page('register')

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

is_page('4906')

2
Questo è valido solo se un plugin sta modificando il login predefinito.
Michael Ecklund,

0

Nessuna delle risposte attuali ha funzionato per me.

Quello che ho fatto è stato verificare se l' $_GETarray ha una chiave 'page' e se il suo valore è 'accedi'.

if (isset($_GET['page']) && $_GET['page'] == 'sign-in'){
   // you're on login page
}

-1

Alcune soluzioni proposte qui hanno funzionato, quindi sono arrivato con qualcosa di veramente semplice che funziona su un normale sito WordPress (non testato su Multisito).

Semplice come:

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

Tiene conto del parametro url ?action=register, che esiste solo quando ti trovi nella pagina di registrazione.


2
Questa non è certamente una buona soluzione, potresti avere un parametro "action" ovunque nei tuoi template di pagina personalizzati o plugin, no? :)
trainoasi,

Infatti. Potrebbe funzionare per un semplice controllo mentre si accodano i file o si eseguono semplici funzioni di modello nella pagina di accesso, ma ci sono modi più sicuri per raggiungerlo di sicuro.
Adriano Monecchi,

-1

Ecco una versione PSR-2 della risposta @ T.Todua. L'ho appena formattato bene. Questo è meglio per manipolare la funzione, come l'aggiunta di un filtro a scopo di test, ecc:

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;
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.