检查wp-登录是否为当前页面

时间:2011-03-23 作者:onetrickpony

如何检查当前页面是否wp-login.phpwp-signup.php ?

有比使用更优雅的解决方案吗$_SERVER[\'REQUEST_URI\'] ?

12 个回复
最合适的回答,由SO网友:TheDeadMedic 整理而成

使用全局$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
}
Following code is considered legacy and should not be used (wp-register.php 已弃用(&D);之后很长一段时间被删除):<罢工>

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

SO网友:T.Todua

我的首选方式:

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 URL
2)$pagenow 在这种情况下也会给你错误的值

注意:

  • 在某些情况下,如果您在其他模板文件/页面上手动输出登录表单(即带有快捷码等),则可能无法正常工作

SO网友:Firsh - justifiedgrid.com

更现代的方法是,即使wp登录URL被插件更改,或者wp位于子文件夹中,它也应该工作:

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

SO网友:dallaslu

$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 替换数组中的元素。

SO网友:Mavawie

我使用WordPress自己的wp\\u login\\u 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的使用,因为它可能会被终止)就足够了。。。然而,这确实意味着,更改默认登录表单的插件或主题开发人员必须以正确的方式完成此操作。。。

SO网友:Rafael Carneiro de Moraes

目前的答案都不适合我。

我所做的就是检查一下$_GET 数组有一个“page”键,如果其值为“sign-in”。

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

SO网友:phpred

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

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

SO网友:zeta

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

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

所以我用

is_page(\'register\')
如果您检查注册页面的主体,它也有ID,因此如果上面写着page-ID-4906,如果效果更好,可以这样使用:

is_page(\'4906\')

SO网友:Lucas Bustamante

这是@T.Todua answer的一个更具可读性的版本。我只是很好地格式化了它,先做了最便宜的支票,然后很早就回来了:

function isLoginPage()
{
    // $_SERVER[\'PHP_SELF\'] is equal to "/wp-login.php"?
    if ($_SERVER[\'PHP_SELF\'] == \'/wp-login.php\') {
        return true;
    }

    // $GLOBALS[\'pagenow\'] is equal to "wp-login.php"?
    if (isset($GLOBALS[\'pagenow\']) && $GLOBALS[\'pagenow\'] === \'wp-login.php\') {
        return true;
    }


    $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())
    ) {
        return true;
    }

    return false;
}
如果希望性能影响最小,请只保留前两项检查。

此外,如果在加载模板后运行此检查,只需使用:

function isLogin() {
    if (!did_action(\'wp_loaded\')) {
      return null;
    }
    return did_action(\'login_head\');
}

SO网友:JJS

这个文件有这么多action 挂钩。感谢WordPress开发人员!

下面列出了最常见的方法,可以让您按照它们的执行顺序开始。

登录队列脚本登录头注销丢失密码检索密码li>登录确认

SO网友:D.A.H

另一种方法:

/**
 * Determines whether current page is login page.
 * @return bool True if current page is login page.
 */
final public static function isLoginPage(): bool
{
    return function_exists(\'login_header\');
}
功能login_header 在文件中定义wp-login.php. 我们假设登录页面不包括在内,因为这是单独的WP页面,应该直接调用它。可能是最防弹的解决方案之一。

SO网友:Adriano Monecchi

好的,我正在修改我的答案,以适应另一种检测url的wp登录部分的解决方案,如果您的主题使用自定义登录页面模板,或者您的登录页面由插件修改,那么这种解决方案非常方便。。。这里提出的一些解决方案很有效,所以我在一个普通的WordPress站点上提供了一些适合我的解决方案(没有在多站点上测试)。

简单到:

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

结束

相关推荐

有没有办法重命名或隐藏wp-login.php?

任何更改wp登录的方法。php url?每个曾经使用过Wordpress的人都可以很容易地看到您的站点是否正在使用它,并直接进入登录页面,这似乎是不安全的。以前有一个名为“隐形登录”的插件,但没有更新。(因此我们不愿意依赖插件)。