Comprobar si wp-login es la página actual

23 mar 2011, 23:25:03
Vistas: 57.3K
Votos: 58

¿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']?

1
Comentarios

Como referencia, hay una discusión relacionada en trac aquí https://core.trac.wordpress.org/ticket/19898

Stephen Harris Stephen Harris
29 ago 2014 18:38:56
Todas las respuestas a la pregunta 14
4
72

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

23 mar 2011 23:59:58
Comentarios

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

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

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

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

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

mopsyd mopsyd
23 mar 2018 00:43:04

Para mí, incluso pagenow dice que es index.php...

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

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?

  1. A veces, si intentas verificar la página de inicio de sesión usando REQUEST_URI(o SCRIPT_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.

27 ago 2016 12:13:09
Comentarios

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.

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

@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í).

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

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

trainoasis trainoasis
20 nov 2018 06:06:41

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

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

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

trainoasis trainoasis
21 nov 2018 07:31:50

Esta es la respuesta.

Philip Philip
14 nov 2023 00:59:31
Mostrar los 1 comentarios restantes
0

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/

16 nov 2022 10:55:42
2

Una forma más moderna de hacerlo, debería funcionar incluso cuando la URL de wp-login es cambiada por plugins y cuando WP está en un subdirectorio, etc:

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

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

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

Esta respuesta me gusta más. Para ajustarla a mis preferencias, la modifiqué ligeramente a: return false !== stripos( wp_login_url(), $_SERVER['SCRIPT_NAME'] );. Me parece un poco más limpio.

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

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

25 nov 2014 10:21:54
0

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');
}
18 ene 2019 21:25:02
1

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

7 abr 2019 01:26:45
Comentarios

Para ignorar los parámetros de URL, cambia la última línea a: return substr(rtrim( strtolower( $_SERVER[ 'REQUEST_URI' ] ), '/' ), 0, strlen($login_path)) == $login_path ;

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

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
}
7 oct 2019 21:50:59
0

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
    } ?>
12 abr 2020 09:53:20
0

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
9 nov 2021 14:34:17
0

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.

28 dic 2021 14:50:27
0

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
}
18 nov 2022 03:08:47
1

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')
16 sept 2015 23:30:44
Comentarios

Esto solo es válido si un plugin está modificando el inicio de sesión predeterminado.

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

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

2 ene 2023 14:20:32
Comentarios

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.

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