如何检查当前页面是wp-login.php还是wp-signup.php

是否有比使用$_SERVER['REQUEST_URI']更好的解决方案?

评论

作为参考,这里有相关的trac讨论core.trac.wordpress.org/ticket/19898

#1 楼

使用全局$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();




评论


如果用户更改其wp-login.php网址,这行得通吗?

–卢卡斯·布斯塔曼特(Lucas Bustamante)
17年1月23日在17:45

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

– Ryan Bayne
17 Sep 15 '23:32



@ T.Todua在下面提供了一个更安全,更可靠的答案。

– mopsyd
18年3月22日在22:43

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

–火车头病
18年11月20日在4:08

#2 楼

我的首选方式:
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');
}
为什么最安全?
REQUEST_URI(或SCRIPT_PATH)检查登录页面),由于许多插件会更改LOGIN和ADMIN网址,您将获得错误的值。
2)在这种情况下,$pagenow也会为您提供不正确的值!

注意:

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


评论


这是太棒了。使用包含的文件来确定访问者的位置并不是我发现的情况,但在这种情况下,这是有意义的。

– Ryan Bayne
17年9月15日在23:35

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

–T.Todua
17 Sep 16 '17:48



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

–火车头病
18-11-20在4:06



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

–T.Todua
18年11月20日在7:29

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

–火车头病
18年11月21日在5:31

#3 楼

更现代的方式可以做到,即使插件更改了wp-login URL,并且WP位于子文件夹中时,它也应能工作:

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


评论


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

– Svetoslav Marinov
19年1月18日在23:13

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

–伊恩·邓恩
19年8月25日在1:07

#4 楼

$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之类的参数来替换元素在数组中。

#5 楼

我已经使用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;

–马塔瓦塔尔
19-09-17在15:04

#6 楼

当前答案对我都不起作用。

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

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


#7 楼

如果您需要为登录页面添加一些代码,则可以使用钩子

<?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
    } ?>


#8 楼

我只对注册页面感兴趣,而不对登录页面感兴趣。因此,每个人可能都不希望这样做。

$ GLOBALS ['pagenow']为我返回index.php。也许是因为buddypress或我的主题。 ID也是如此,因此,如果它说的是page-id-4906,则可以用它来更好地工作:

is_page('register')


评论


仅当插件正在修改默认登录名时才有效。

–迈克尔·埃克伦德(Michael Ecklund)
16 Mar 1 '16 at 23:04

#9 楼

这是@ 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;
}


#10 楼

好的,我正在更改答案,以提供检测URL的wp-login部分的替代解决方案,如果您的主题使用自定义登录页面模板或您通过插件修改了登录页面,这将非常方便。这里提出的几种解决方案都行得通,所以我在一个普通的WordPress网站上提供了对我有用的东西(未经多站点测试)。

很简单:

评论


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

–火车头病
18年11月20日在3:45

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

–阿德里亚诺·蒙尼奇(Adriano Monecchi)
18/12/1在17:20