Comprobar si wp-login es la página actual
¿Cómo puedo comprobar si la página actual es wp-login.php
o wp-signup.php
?
¿Existen soluciones más elegantes que usar $_SERVER['REQUEST_URI']
?

Usa la variable global $pagenow
, que es una variable global común establecida por WordPress durante la ejecución:
if ( $GLOBALS['pagenow'] === 'wp-login.php' ) {
// ¡Estamos en la página de inicio de sesión!
}
También puedes verificar el tipo de página de inicio de sesión, por ejemplo, el registro:
if ( $GLOBALS['pagenow'] === 'wp-login.php' && ! empty( $_REQUEST['action'] ) && $_REQUEST['action'] === 'register' ) {
// Estamos en el proceso de registro
}
El siguiente código se considera obsoleto y no debe utilizarse (wp-register.php
fue marcado como obsoleto y posteriormente eliminado hace bastante tiempo):
if ( in_array( $GLOBALS['pagenow'], array( 'wp-login.php', 'wp-register.php' ) ) )
run_my_funky_plugin();

¿Funciona esto si el usuario cambia la URL de su wp-login.php?

Buena pregunta de @LucasBustamante y supongo que es fácil de probar. Es muy importante señalarlo y ahorrarle tiempo a alguien.

@T.Todua ha proporcionado una respuesta más segura y confiable abajo.

Mi forma preferida:
if( is_wplogin() ){
...
}
código:
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');
}
¿Por qué es la más segura?
- A veces, si intentas verificar la página de inicio de sesión usando
REQUEST_URI
(oSCRIPT_PATH
), obtendrás VALORES INCORRECTOS, porque muchos plugins cambian las URLs de INICIO DE SESIÓN y ADMINISTRACIÓN.
2)$pagenow
también te dará un valor incorrecto en ese caso.
Notas:
- En algunos casos, podría no funcionar si muestras el formulario de inicio de sesión (por ejemplo, con shortcode, etc.) manualmente en otras plantillas/páginas.
Actualización del núcleo:
Desde la versión 6.1 de WordPress (Nov 2022) hay una función adicional en el núcleo - is_login
que verifica wp_login_url
.

Esto es fantástico. Usar archivos incluidos para determinar la ubicación de un visitante no es un escenario en el que me haya encontrado, pero en este caso tiene sentido.

@RyanBayne gracias, sí, esta es la rara ocasión en la que get_included_files()
parece la solución más precisa (al menos para mí).

Para mí devuelve false, como si no fuera una página wp-login... Incluso $GLOBALS['pagenow'] devuelve index.php...

@trainoasis probablemente estás usando un formulario de inicio de sesión manual (como un shortcode) en la página de inicio o algo así?

No, el wp-login.php normal :) Pero estoy usando Sage y WooCommerce, tal vez eso cambie las cosas de alguna manera :)

Se ha introducido una nueva función en WordPress 6.1.0 llamada is_login()
que hace exactamente eso.
https://developer.wordpress.org/reference/functions/is_login/

Iba a sugerir eso. Tal vez el OP necesita analizar los resultados de wp_login_url() y solo comparar la ruta web.

$GLOBALS['pagenow']
no funciona, usa $_SERVER['PHP_SELF']
.
if ( in_array( $_SERVER['PHP_SELF'], array( '/wp-login.php', '/wp-register.php' ) ) ){
// hacer algo.
}
Y si tu WordPress no está instalado en la raíz del sitio web, deberás usar parámetros como TU_RUTA_WP/wp-login.php
para reemplazar los elementos del array.

Aquí está una versión más legible de la respuesta de @T.Todua. Simplemente la he formateado correctamente, colocado las comprobaciones más económicas primero y añadido retornos tempranos:
function isLoginPage()
{
// ¿$_SERVER['PHP_SELF'] es igual a "/wp-login.php"?
if ($_SERVER['PHP_SELF'] == '/wp-login.php') {
return true;
}
// ¿$GLOBALS['pagenow'] es igual a "wp-login.php"?
if (isset($GLOBALS['pagenow']) && $GLOBALS['pagenow'] === 'wp-login.php') {
return true;
}
$ABSPATH_MY = str_replace(array('\\', '/'), DIRECTORY_SEPARATOR, ABSPATH);
// ¿Se ha incluido wp-login.php o wp-register.php durante esta ejecución?
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;
}
Si quieres el menor impacto en el rendimiento, deja solo las dos primeras comprobaciones.
Además, si estás ejecutando esta comprobación después de que el template se haya cargado, puedes simplemente usar:
function isLogin() {
if (!did_action('wp_loaded')) {
return null;
}
return did_action('login_head');
}

Lo he implementado usando el método propio de WordPress wp_login_url() de la siguiente manera:
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 );
}
Simplemente comparando ambas rutas (porque es difícil estar absolutamente seguro sobre el uso de SSL ya que puede estar terminado) debería ser suficiente... Sin embargo, significa que un desarrollador de plugins o temas que cambie el formulario de login predeterminado debe haberlo hecho de la manera correcta...

Ninguna de las respuestas actuales funcionó para mí.
Lo que hice fue verificar si el array $_GET
tiene una clave 'page' y si su valor es 'sign-in'.
if (isset($_GET['page']) && $_GET['page'] == 'sign-in'){
// estás en la página de inicio de sesión
}

Si necesitas agregar código para la página de inicio de sesión, puedes usar un hook para ello
<?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
} ?>

Este archivo tiene tantos hooks de acción. ¡Gracias desarrolladores de WordPress!
Aquí hay una lista de los más comunes para que empieces, en el orden en que se ejecutan.
- 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 método alternativo:
/**
* Determina si la página actual es la página de inicio de sesión.
* @return bool Verdadero si la página actual es la página de inicio de sesión.
*/
final public static function isLoginPage(): bool
{
return function_exists('login_header');
}
La función login_header
está definida en el archivo wp-login.php. Asumimos que la página de inicio de sesión no está incluida ya que es una página separada de WordPress, que debe ser llamada directamente. Probablemente una de las soluciones más robustas.

Este es mi método preferido, ya que manejará cualquier slug que decidas usar para la página de inicio de sesión. También funciona con formularios de inicio de sesión personalizados en caso de que decidas no usar el formulario predeterminado de WordPress, ya que is_login() no funcionará si no incluyes el script de inicio de sesión. Utiliza global $wp en lugar del array $_SERVER.
global $wp;
if( trailingslashit( trailingslashit( site_url() ) . $wp->request ) !== wp_login_url() ) {
// Estás en la página de inicio de sesión
}

Solo estoy interesado en la página de registro, no en la de inicio de sesión. Esto puede que no sea lo que todo el mundo desee.
$GLOBALS['pagenow'] me devuelve index.php. Quizás debido a buddypress o mi tema.
Así que usé
is_page('register')
Si inspeccionas el cuerpo de la página de registro, también tiene un ID, así que si aparece page-id-4906, puedes usarlo de esta manera si funciona mejor:
is_page('4906')

Siempre es una buena idea usar la función nativa de WP is_login()
. Esta fue introducida desde la versión 6.1.
Aquí están los detalles

Eso ya fue mencionado en https://wordpress.stackexchange.com/a/411320/3898 y https://wordpress.stackexchange.com/a/237285/3898. Las respuestas redundantes dificultan el uso del sitio, por lo que recomendaría eliminar esta.
