Перевірте, чи wp-вхід є поточною сторінкою


48

Як я можу перевірити, чи є поточна сторінка wp-login.phpчи wp-signup.php?

Чи є більш елегантні рішення, ніж використання $_SERVER['REQUEST_URI']?


1
Для довідки є пов’язана дискусія про trac тут 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();


3
Чи працює це, якщо користувач змінить свою URL-адресу wp-login.php?
Лукас Бустаманте

Хороший запитання від @LucasBustamante, і я вважаю, що це легко перевірити. Просто дуже важливо вказати і заощадити комусь час.
Райан Байне

1
@ T.Todua надав більш безпечну та надійну відповідь нижче .
мопсид

Для мене навіть 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-адреси ЛОГІН & АДМІН .
2) $pagenowдасть вам неправильне значення і в цьому випадку!

Примітки:

  • У деяких випадках це може не працювати, якщо ви вводите форму входу (тобто з коротким кодом чи ін.) Вручну на інші файли / сторінки шаблонів.

2
Це фантастично. Використання включених файлів для визначення місця розташування відвідувачів не є сценарієм, який я коли-небудь виявляв, але в цьому випадку має сенс.
Райан Бейн

@RyanBayne thnx, так, це рідкісний випадок, коли get_included_files()здається найточнішим рішенням (принаймні для мене).
Т.Тодуа

Для мене він повертає помилкове, як ніби це не сторінка входу в систему ... Також навіть $ 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){
    /* ... */
}

1
Я збирався це запропонувати. Можливо, ОП потребує аналізу результатів wp_login_url () та порівняння веб-шляху.
Светослав Маринов

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для заміни елементів масиву.


1

Я реалізував це за допомогою власного методу wp_login_url () WordPress таким чином:

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;
матвататар

0

Мене цікавить лише сторінка реєстрації, а не сторінка входу. Тож цього можуть не хотіти всі.

$ GLOBALS ['pagenow'] повертає index.php для мене. Можливо через приятельку чи мою тему.

Так я і використовував

is_page('register')

Якщо ви оглядаєте тіло сторінки реєстрації, у нього також є ідентифікатор, тому якщо він пише page-id-4906 , ви можете використовувати його таким чином, якщо він працює краще:

is_page('4906')

2
Це справедливо лише в тому випадку, якщо плагін змінює вхід за замовчуванням.
Майкл Еклунд

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" в будь-якому місці ваших власних шаблонів сторінок або плагінів, ні? :)
траїноз

Справді. Це може спрацювати для простої перевірки під час збирання файлів або виконання простих функцій шаблону на сторінці входу, але є безпечніші способи досягти цього точно.
Адріано Монеччі

-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;
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.