检查wp-login是否为当前页面


Answers:


59

使用global $pagenow,这是WordPress在运行时设置的通用全局设置:

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

您还可以检查登录页面的类型,例如注册:

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

以下代码被认为是旧代码,不应该使用wp-register.php不推荐使用,不久后删除):

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


3
如果用户更改了wp-login.php网址,这行得通吗?
卢卡斯·布斯塔曼特

@LucasBustamante的一个很好的问题,我想它很容易测试。指出并节省某人的时间非常重要。
瑞安·贝恩

1
@ T.Todua提供了更安全,更可靠的答案如下
mopsyd

对我来说,即使pagenow也说它是index.php ...
trainoasis

17

唯一可靠的方法:

if( is_wplogin() ){
   ...
}

码:

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

为什么它最安全?

1)有时,如果您尝试使用REQUEST_URI(或SCRIPT_PATH)检查登录页面,则会得到错误的值,因为许多插件会更改LOGIN和ADMIN网址。
2)$pagenow在这种情况下也会给您不正确的价值!

笔记:

  • 在某些情况下,如果您在其他模板文件/页面上手动输出登录表单(即使用简码等),则可能不起作用。

2
这是太棒了。我从来没有发现使用包含的文件来确定访问者的位置,但是在这种情况下是有意义的。
瑞安·贝恩

@RyanBayne thnx,是的,这是罕见的情况,它get_included_files()似乎是最准确的解决方案(至少对我而言)。
T.Todua

对我来说,它返回false,好像它不是wp登录页面一样。甚至$ GLOBALS ['pagenow']也返回index.php ...
trainoasis

@trainoasis可能您是在首页上使用手动登录表单(例如简码)还是那样?
T.Todua '18

不,正常的wp-login.php :)但是我使用的是Sage和WooCommerce,也许这会以某种方式改变:)
trainoasis

3

更现代的方法是,即使插件更改了wp-login URL,并且WP位于子文件夹中等,它也应该起作用:

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

1
我打算建议。也许OP需要解析wp_login_url()的结果,然后比较网络路径。
Svetoslav Marinov

1
我最喜欢这个答案。为了适应我的喜好,我将其略微调整为:return false !== stripos( wp_login_url(), $_SERVER['SCRIPT_NAME'] );。这对我来说有点干净。
伊恩·邓恩

2

$GLOBALS['pagenow']不起作用,请使用$_SERVER['PHP_SELF']

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

并且如果您的wordpress未安装在Web根文件夹中,则应使用一些参数YOUR_WP_PATH/wp-login.php来替换数组中的元素。


1

我已经使用WordPress自己的wp_login_url()方法实现了它,如下所示:

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

仅比较两个路径(因为很难绝对确定使用SSL可能会终止它)就足够了……但这确实意味着,更改默认登录表单的插件或主题开发人员必须已经完成所以正确的方法...


要忽略url参数,请将最后一行更改为:return substr(rtrim(strtolower($ _SERVER ['REQUEST_URI']),'/'),0,strlen($ login_path))== $ login_path;
mattavatar

0

我只对注册页面感兴趣,对登录页面不感兴趣。因此,这可能不是每个人都想要的。

$ GLOBALS ['pagenow']为我返回index.php。也许是因为buddypress或我的主题。

所以我用

is_page('register')

如果您检查注册页面的正文,它也具有ID,因此,如果显示为page-id-4906,则可以更好地使用它:

is_page('4906')

2
仅当插件正在修改默认登录名时才有效。
Michael Ecklund '16

0

当前的答案都没有对我有用。

我所做的是检查$_GET数组是否具有“页面”键,以及其值是否为“登录”。

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

-1

这里提出的一些解决方案可行,因此我提供了在普通的WordPress网站(未在Multisite上测试)上运行的非常简单的工具。

简单如:

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

它考虑了url参数?action=register,该参数仅在您位于注册页面时才存在。


2
那当然不是一个好的解决方案,您可以在自定义页面模板或插件的任何位置使用“ action”参数,不是吗?:)
trainoasis

确实。在将文件放入队列或在登录页面上执行简单的模板功能时,它可能适用于简单的检查,但是可以肯定有更安全的方法来实现。
Adriano Monecchi '18

-1

这是@ T.Todua答案的PSR-2版本。我只是很好地格式化了。这更好地操纵了该功能,例如添加用于测试目的的过滤器等:

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;
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.