Проверьте, является ли wp-логин текущей страницей

48

Как я могу проверить, является ли текущая страница wp-login.phpили wp-signup.php?

Есть ли более элегантные решения, чем использование $_SERVER['REQUEST_URI']?

onetrickpony
источник
1
Для справки здесь приведена соответствующая дискуссия: core.trac.wordpress.org/ticket/19898
Стивен Харрис

Ответы:

59

Используйте глобальный $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();

TheDeadMedic
источник
3
Это работает, если пользователь меняет свой wp-login.php URL?
Лукас Бустаманте
Хороший вопрос от @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), вы получите НЕПРАВИЛЬНЫЕ ЗНАЧЕНИЯ, потому что многие плагины изменяют URL-адреса LOGIN & ADMIN .
2) $pagenowв этом случае тоже даст неверное значение!

Примечания:

  • В некоторых случаях это может не работать, если вы вручную выводите форму входа (например, с помощью шорткода и т. Д.) На другие файлы / страницы шаблона.
T.Todua
источник
2
Это фантастика. Использование включенных файлов для определения местоположения посетителя - это не тот сценарий, который я когда-либо делал, но в этом случае имеет смысл.
Райан Бэйн
@RyanBayne Thnx, да, это тот редкий случай , когда get_included_files()кажется , наиболее точное решение (по крайней чтобы для меня).
Т.Тодуа
Для меня это возвращает false, как если бы это была не страница входа в wp ... Также даже $ GLOBALS ['pagenow'] возвращает index.php ...
trainoasis
@trainoasis, вероятно, вы используете форму для входа в систему (например, шорткод) на домашней странице или как?
Т.Тодуа
Нет, обычный wp-login.php :) Но я использую Sage и WooCommerce, может быть, это как-то меняет :)
trainoasis
3

Более современный способ сделать это, он должен работать, даже если URL-адрес wp-login изменен плагинами и когда WP находится в подпапке и т.д .:

if(stripos($_SERVER["SCRIPT_NAME"], strrchr(wp_login_url(), '/')) !== false){
    /* ... */
}
Фирш - LetsWP.io
источник
1
Я собирался предложить это. Возможно, OP нужно проанализировать результаты wp_login_url (), и oly сравнит веб-путь.
Святослав Маринов
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 не установлен в корневой веб-папке, вы должны использовать некоторые параметры, например, YOUR_WP_PATH/wp-login.phpчтобы заменить элементы в массиве.

dallaslu
источник
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, поскольку он может быть прекращен) ... Это означает, однако, что разработчик плагина или темы, который изменяет форму входа по умолчанию, должен был выполнить так правильно ...

Mavawie
источник
Чтобы игнорировать параметры URL, измените последнюю строку на: return substr (rtrim (strtolower ($ _SERVER ['REQUEST_URI']), '/'), 0, strlen ($ login_path)) == $ login_path;
Маттаватар
0

Меня интересует только страница регистрации, а не страница входа. Так что это может быть не всем нужно.

$ GLOBALS ['pagenow'] возвращает index.php для меня. Возможно из-за приятеля или моей темы.

Так что я использовал

is_page('register')

Если вы проверяете тело страницы регистрации, она также имеет идентификатор, поэтому, если там написано page-id-4906 , вы можете использовать его следующим образом, если он работает лучше:

is_page('4906')
зета
источник
2
Это действительно только в том случае, если плагин изменяет логин по умолчанию.
Майкл Эклунд
0

Ни один из текущих ответов не сработал для меня.

Что я сделал, так это проверил, есть ли в $_GETмассиве ключ «page» и имеет ли он значение «sign-in».

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
На самом деле. Это может сработать для простой проверки при постановке в очередь файлов или выполнении простых шаблонных функций на странице входа в систему, но наверняка есть более безопасные способы достижения этого.
Адриано Монекки
-1

Вот PSR-2 версия ответа @ T.Todua. Я просто отформатировал это красиво. Это лучше для манипулирования функцией, такой как добавление фильтра для тестирования и т. Д.

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;
}
Лукас Бустаманте
источник