Verificare se la pagina corrente è wp-login
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']
?

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

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

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

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?
- A volte, se provi a verificare la pagina di login usando
REQUEST_URI
(oSCRIPT_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
.

È 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.

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

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

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

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

È 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/

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

$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.

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

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

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
}

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

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

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.

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
}

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

È 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

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.
