Compruebe si wp-login es la página actual


Respuestas:


59

Use el global $pagenow, que es un conjunto global común de WordPress en tiempo de ejecución:

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

También puede 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' ) {
    // We're registering
}

El siguiente código se considera heredado y no se debe usar ( wp-register.phpse desaprobó y posteriormente se eliminó hace bastante tiempo):

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


3
¿Funciona esto si el usuario cambia su url wp-login.php?
Lucas Bustamante el

Buena pregunta de @LucasBustamante y supongo que se prueba fácilmente. Es muy importante señalar y ahorrarle tiempo a alguien.
Ryan Bayne

1
@ T.Todua ha proporcionado una respuesta más segura y confiable a continuación .
mopsyd

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

17

LA ÚNICA FORMA FIABLE:

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 más seguro?

1) A veces, si intenta verificar la página de inicio de sesión usando REQUEST_URI(o SCRIPT_PATH), obtendrá VALORES INCORRECTOS, porque muchos complementos cambian las URL de INICIAR SESIÓN y ADMINISTRAR .
2) ¡también $pagenowle dará un valor incorrecto en ese caso!

Notas:

  • En algunos casos, podría no funcionar si imprime el formulario de inicio de sesión (es decir, con shortcode o etc.) manualmente en otros archivos / páginas de plantilla.

2
Esto es fantástico. El uso de los archivos incluidos para determinar la ubicación de un visitante no es un escenario que me haya encontrado hacer, pero tiene sentido en este caso.
Ryan Bayne

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

Para mí, devuelve falso, como si no fuera una página de inicio de sesión de wp ... También incluso $ GLOBALS ['pagenow'] devuelve index.php ...
trainoasis

@trainoasis, ¿probablemente está utilizando el formulario de inicio de sesión manual (como shortcode) en la página de inicio o de esa manera?
T.Todua

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

3

Una forma más moderna de hacerlo, debería funcionar incluso cuando los complementos cambian la URL de inicio de sesión de wp y cuando WP está en una subcarpeta, etc.

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

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

1
Me gusta esta respuesta la mejor. Para adaptarse a mis preferencias, me pellizqué ligeramente a: return false !== stripos( wp_login_url(), $_SERVER['SCRIPT_NAME'] );. Eso me parece un poco más limpio.
Ian Dunn

2

$GLOBALS['pagenow']no funciona, usa $_SERVER['PHP_SELF'].

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

y si su wordpress no está instalado en la carpeta raíz web, debe usar algunos parámetros como YOUR_WP_PATH/wp-login.phppara reemplazar los elementos en la matriz.


1

Lo he implementado usando el método wp_login_url () propio de WordPress 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 comparar ambas rutas (porque es difícil estar absolutamente seguro sobre el uso de SSL, ya que puede terminarse) debería ser suficiente ... Sin embargo, significa que un desarrollador de plugins o temas que cambia el formulario de inicio de sesión predeterminado debe haberlo hecho. así que la forma correcta ...


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

0

Solo estoy interesado en la página de registro, no en la página de inicio de sesión. Por lo tanto, esto podría no ser querido por todos.

$ GLOBALS ['pagenow'] me devuelve index.php. Tal vez por buddypress o mi tema.

Entonces solía

is_page('register')

Si inspecciona el cuerpo de la página de registro, también tiene el ID, así que si dice page-id-4906 , puede usarlo de esta manera si funciona mejor:

is_page('4906')

2
Esto solo es válido si un complemento está modificando el inicio de sesión predeterminado.
Michael Ecklund

0

Ninguna de las respuestas actuales me funcionó.

Lo que hice fue verificar si la $_GETmatriz tiene una clave de 'página' y si su valor es 'iniciar sesión'.

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

-1

Algunas soluciones propuestas aquí funcionaron, así que he encontrado algo realmente simple que funciona en un sitio ordinario de WordPress (no probado en Multisite).

Tan simple como:

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

Tiene en cuenta el parámetro url ?action=register, que solo existe cuando estás en la página de registro.


2
Ciertamente, esa no es una buena solución, podría tener un parámetro de "acción" en cualquier parte de sus plantillas de página personalizadas o complementos, ¿no? :)
trainoasis

En efecto. Puede funcionar para una verificación simple al poner en cola archivos o realizar funciones de plantilla simples en la página de inicio de sesión, pero hay formas más seguras de lograrlo con seguridad.
Adriano Monecchi

-1

Aquí hay una versión PSR-2 de la respuesta @ T.Todua. Acabo de formatearlo bien. Es mejor manipular la función, como agregar un filtro con fines de prueba, etc.

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;
}
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.