Проверка текущей страницы wp-login

23 мар. 2011 г., 23:25:03
Просмотры: 57.3K
Голосов: 58

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

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

1
Комментарии

Для справки, здесь есть соответствующее обсуждение в trac https://core.trac.wordpress.org/ticket/19898

Stephen Harris Stephen Harris
29 авг. 2014 г. 18:38:56
Все ответы на вопрос 14
4
72

Используйте глобальную переменную $pagenow, которая является общей глобальной переменной, устанавливаемой WordPress во время выполнения:

if ( $GLOBALS['pagenow'] === 'wp-login.php' ) {
    // Мы на странице входа!
}

Вы также можете проверить тип страницы входа, например, регистрацию:

if ( $GLOBALS['pagenow'] === 'wp-login.php' && ! empty( $_REQUEST['action'] ) && $_REQUEST['action'] === 'register' ) {
    // Мы регистрируемся
}

Следующий код считается устаревшим и не должен использоваться (wp-register.php был устаревшим и впоследствии удалён довольно давно):

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

23 мар. 2011 г. 23:59:58
Комментарии

Будет ли это работать, если пользователь изменит URL wp-login.php?

Lucas Bustamante Lucas Bustamante
23 янв. 2017 г. 19:45:40

Хороший вопрос от @LucasBustamante, и я полагаю, его легко проверить. Просто очень важно отметить это, чтобы сэкономить чьё-то время.

Ryan Bayne Ryan Bayne
16 сент. 2017 г. 02:32:57

@T.Todua предоставил более безопасный и надёжный ответ ниже.

mopsyd mopsyd
23 мар. 2018 г. 00:43:04

Для меня даже pagenow показывает, что это index.php ...

trainoasis trainoasis
20 нояб. 2018 г. 06:08:56
6
24

Мой предпочтительный способ:

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-адреса логина и админки.
    2) $pagenow также выдаст некорректное значение в этом случае!

Примечания:

  • В некоторых случаях это может не работать, если вы выводите форму входа (например, через шорткод и т.д.) вручную на других шаблонах или страницах.

Обновление ядра:

Начиная с WordPress версии 6.1 (ноябрь 2022) в ядро добавлена дополнительная функция is_login, которая проверяет wp_login_url.

27 авг. 2016 г. 12:13:09
Комментарии

Это потрясающе. Использование подключаемых файлов для определения местоположения посетителя - это не тот сценарий, с которым я когда-либо сталкивался, но в данном случае это имеет смысл.

Ryan Bayne Ryan Bayne
16 сент. 2017 г. 02:35:41

@RyanBayne спасибо, да, это редкий случай, когда get_included_files() кажется наиболее точным решением (по крайней мере для меня).

T.Todua T.Todua
16 сент. 2017 г. 20:48:30

У меня возвращается false, как будто это не страница wp-login... Даже $GLOBALS['pagenow'] возвращает index.php...

trainoasis trainoasis
20 нояб. 2018 г. 06:06:41

@trainoasis возможно, ты используешь ручную форму входа (например, через шорткод) на главной странице или что-то в этом роде?

T.Todua T.Todua
20 нояб. 2018 г. 09:29:42

Нет, обычный wp-login.php :) Но я использую Sage и WooCommerce, может это как-то влияет :)

trainoasis trainoasis
21 нояб. 2018 г. 07:31:50

Это и есть ответ.

Philip Philip
14 нояб. 2023 г. 00:59:31
Показать остальные 1 комментариев
0

В WordPress 6.1.0 появилась новая функция is_login(), которая делает именно это. https://developer.wordpress.org/reference/functions/is_login/

16 нояб. 2022 г. 10:55:42
2

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

if(stripos($_SERVER["SCRIPT_NAME"], strrchr(wp_login_url(), '/')) !== false){
    /* ... */
}
1 мая 2016 г. 01:11:06
Комментарии

Я как раз собирался предложить это. Возможно, автору вопроса нужно разобрать результаты из wp_login_url() и сравнивать только веб-путь.

Svetoslav Marinov Svetoslav Marinov
19 янв. 2019 г. 01:13:36

Мне больше всего нравится этот ответ. Под свои предпочтения я немного его изменил: return false !== stripos( wp_login_url(), $_SERVER['SCRIPT_NAME'] );. Так, на мой взгляд, выглядит немного чище.

Ian Dunn Ian Dunn
25 авг. 2019 г. 04:07:09
0

$GLOBALS['pagenow'] не работает, используйте $_SERVER['PHP_SELF'].

if ( in_array( $_SERVER['PHP_SELF'], array( '/wp-login.php', '/wp-register.php' ) ) ){
    // выполнить действие.
}

И если ваш WordPress установлен не в корневой папке веб-сайта, вам следует использовать параметры вида ВАШ_ПУТЬ_К_WP/wp-login.php для замены элементов в массиве.

25 нояб. 2014 г. 10:21:54
0

Вот более читаемая версия ответа @T.Todua. Я просто красиво отформатировал код, добавил самые дешевые проверки в начале и ранний возврат:

function isLoginPage()
{
    // $_SERVER['PHP_SELF'] равен "/wp-login.php"?
    if ($_SERVER['PHP_SELF'] == '/wp-login.php') {
        return true;
    }

    // $GLOBALS['pagenow'] равен "wp-login.php"?
    if (isset($GLOBALS['pagenow']) && $GLOBALS['pagenow'] === 'wp-login.php') {
        return true;
    }

    $ABSPATH_MY = str_replace(array('\\', '/'), DIRECTORY_SEPARATOR, ABSPATH);

    // Был ли wp-login.php или wp-register.php включен во время выполнения?
    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');
}
18 янв. 2019 г. 21:25:02
1

Я реализовал это с использованием встроенного метода WordPress wp_login_url() следующим образом:

public static function is_wp_login() {
  // Получаем путь к странице входа, удаляем закрывающий слэш и приводим к нижнему регистру
  $login_path = rtrim( strtolower( parse_url( wp_login_url( '', true ), PHP_URL_PATH ) ), '/' );
  // Сравниваем с текущим URL запроса (также обработанным)
  return ( rtrim( strtolower( $_SERVER[ 'REQUEST_URI' ] ), '/' ) == $login_path );
}

Простое сравнение обоих путей (поскольку трудно быть абсолютно уверенным в использовании SSL, так как он может быть завершен на балансировщике нагрузки) должно быть достаточным... Однако это означает, что разработчик плагина или темы, изменяющий стандартную форму входа, должен был сделать это правильным способом...

7 апр. 2019 г. 01:26:45
Комментарии

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

Design.Garden Design.Garden
17 сент. 2019 г. 18:04:37
0

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

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

if (isset($_GET['page']) && $_GET['page'] == 'sign-in'){
   // вы находитесь на странице входа
}
7 окт. 2019 г. 21:50:59
0

Если вам нужно добавить код для страницы входа, вы можете использовать хук для этого

<?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
    } ?>
12 апр. 2020 г. 09:53:20
0

В этом файле так много хуков действий. Спасибо разработчикам WordPress!

Вот список наиболее распространённых хуков в порядке их выполнения:

  • login_enqueue_scripts
  • login_head
  • login_header
  • login_init
  • login_form_{$action}
    • confirm_admin_email
    • postpass
    • logout
    • lostpassword
    • retrievepassword
    • resetpass
    • rp
    • register
    • login
    • confirmaction
  • login_form
  • login_footer
9 нояб. 2021 г. 14:34:17
0

Альтернативный метод:

/**
 * Определяет, является ли текущая страница страницей входа.
 * @return bool Возвращает true, если текущая страница - страница входа.
 */
final public static function isLoginPage(): bool
{
    return function_exists('login_header');
}

Функция login_header определена в файле wp-login.php. Мы предполагаем, что страница входа не включена, так как это отдельная страница WP, которая должна вызываться напрямую. Вероятно, одно из самых надежных решений.

28 дек. 2021 г. 14:50:27
0

Это мой предпочтительный метод, который работает с любым слагом, выбранным для страницы входа. Он также обрабатывает пользовательские формы входа, если вы решите не использовать стандартную форму входа WordPress, поскольку is_login() не будет работать, если вы не включите скрипт входа. Использует глобальную переменную $wp вместо массива $_SERVER.

global $wp;

if( trailingslashit( trailingslashit( site_url() ) . $wp->request ) !== wp_login_url() ) {
    // Вы находитесь на странице входа
}
18 нояб. 2022 г. 03:08:47
1

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

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

Поэтому я использовал:

is_page('register')

Если проверить body страницы регистрации, там также есть ID. Например, если указано page-id-4906, можно использовать так, если это работает лучше:

is_page('4906')
16 сент. 2015 г. 23:30:44
Комментарии

Это действительно только в том случае, если плагин изменяет стандартный процесс входа в систему.

Michael Ecklund Michael Ecklund
2 мар. 2016 г. 01:04:35
1

Всегда хорошая идея использовать нативную функцию WordPress is_login(). Она была добавлена, начиная с версии 6.1.

Подробности можно найти здесь

2 янв. 2023 г. 14:20:32
Комментарии

Это уже упоминалось в https://wordpress.stackexchange.com/a/411320/3898 и https://wordpress.stackexchange.com/a/237285/3898. Избыточные ответы затрудняют использование сайта, поэтому я бы рекомендовал удалить этот.

Ian Dunn Ian Dunn
7 февр. 2023 г. 19:14:18