48

How can I check if the current page is wp-login.php or wp-signup.php ?

Are there more elegant solutions than using $_SERVER['REQUEST_URI'] ?

59

Use the global $pagenow, which is a common global set by WordPress at runtime:

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

You can also check the type of login page, for example registration:

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

Following code is considered legacy and should not be used (wp-register.php was deprecated & subsequently removed quite a while back):

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

  • 3
    Does this works if user change his wp-login.php url? – Lucas Bustamante Jan 23 '17 at 17:45
  • Good question from @LucasBustamante and I suppose it's easily tested. It's just very important to point out and save someone time. – Ryan Bayne Sep 15 '17 at 23:32
  • 1
    @T.Todua has provided a safer and more reliable answer below. – mopsyd Mar 22 '18 at 22:43
  • For me even pagenow says it's index.php ... – trainoasis Nov 20 '18 at 4:08
17

THE ONLY RELIABLE WAY:

if( is_wplogin() ){
   ...
}

code:

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

Why it's safest?

1) Sometimes, if you try to check login page using REQUEST_URI(or SCRIPT_PATH), you will get INCORRECT VALUES, because many plugins change LOGIN & ADMIN urls.
2) $pagenow will give you incorrect value too in that case!

Notes:

  • In some cases, it might not work if you output login-form (i.e. with shortcode or etc) manually on other template files/pages.
  • 2
    This is fantastic. Using included files to determine a visitor location isn't a scenario I've ever found myself doing but it makes sense in this case. – Ryan Bayne Sep 15 '17 at 23:35
  • @RyanBayne thnx, yes, this is the rare occasion when get_included_files() seems most accurate solution (at lest for me). – T.Todua Sep 16 '17 at 17:48
  • For me it returns false, as if it was not a wp-login page ... Also even $GLOBALS['pagenow'] returns index.php ... – trainoasis Nov 20 '18 at 4:06
  • @trainoasis probably you are using manual login-form (like shortcode) on homepage or like that? – T.Todua Nov 20 '18 at 7:29
  • No, normal wp-login.php :) But I am using Sage and WooCommerce, maybe that changes things somehow :) – trainoasis Nov 21 '18 at 5:31
3

More modern way to do that, it should work even when the wp-login URL is changed by plugins and when WP is in a subfolder, etc:

if(stripos($_SERVER["SCRIPT_NAME"], strrchr(wp_login_url(), '/')) !== false){
    /* ... */
}
  • 1
    I was going to suggest that. Maybe the OP needs parse the results from wp_login_url() and oly compare the web path. – Svetoslav Marinov Jan 18 at 23:13
  • 1
    I like this answer the best. To fit my preferences, I tweaked it slightly to: return false !== stripos( wp_login_url(), $_SERVER['SCRIPT_NAME'] );. That feels a bit cleaner to me. – Ian Dunn Aug 25 at 1:07
2

$GLOBALS['pagenow'] doesn't work, use $_SERVER['PHP_SELF'].

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

and if your wordpress is not installed in the web root folder, you should use some params like YOUR_WP_PATH/wp-login.php to replace the elements in array.

1

I have implemented it using WordPress own wp_login_url() method as follows:

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

Just comparing both paths (because it's difficult to be absolutely sure about the use of SSL as it may be terminated) should be enough ... It does mean, however, that a plugin or theme developer who changes the default login form must have done so the proper way ...

  • To ignore url params, change the last line to: return substr(rtrim( strtolower( $_SERVER[ 'REQUEST_URI' ] ), '/' ), 0, strlen($login_path)) == $login_path ; – mattavatar Sep 17 at 15:04
0

I am only interested in register page, not in login page. So this might not be wanted by everybody.

$GLOBALS['pagenow'] returns index.php for me. Maybe because of buddypress or my theme.

So I used

is_page('register')

If you inspect the body of the registration page, it also has the ID as well, so if it says page-id-4906, you can use it this way if it works better:

is_page('4906')
  • 2
    This is only valid if a plugin is modifying the default login. – Michael Ecklund Mar 1 '16 at 23:04
0

None of the current answers worked for me.

What I've done was check if $_GET array has a 'page' key and if its value is 'sign-in'.

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

A few solutions proposed here worked, so I've came with something really simple that works on an ordinary WordPress site (not tested on Multisite).

As simple as:

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

It takes into account the url parameter ?action=register, which only exists when you are on the registration page.

  • 2
    That's certainly not a good solution, you could have "action" parameter anywhere in your custom page templates or plugins, no? :) – trainoasis Nov 20 '18 at 3:45
  • Indeed. It might work for a simple check while enqueuing files or performing simple template functions on the login page, but there are safer ways of achieving that for sure. – Adriano Monecchi Dec 1 '18 at 17:20
-1

Here's a PSR-2 version of @T.Todua answer. I just formatted it nicely. This is better to manipulate the function, such as adding a filter for testing purposes, 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;
}

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.