Sprawdź, czy wp-login jest bieżącą stroną


Odpowiedzi:


59

Użyj globalnego $pagenow, który jest wspólnym globalnym zestawem WordPressa w czasie wykonywania:

if ( $GLOBALS['pagenow'] === 'wp-login.php' ) {
    // We're on the login page!
}

Możesz także sprawdzić typ strony logowania, na przykład rejestracja:

if ( $GLOBALS['pagenow'] === 'wp-login.php' && ! empty( $_REQUEST['action'] ) && $_REQUEST['action'] === 'register' ) {
    // We're registering
}

Poniższy kod jest uważany za starszy i nie powinien być używany ( wp-register.phpzostał wycofany, a następnie został usunięty dość dawno temu):

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


3
Czy to działa, jeśli użytkownik zmieni swój adres wp-login.php?
Lucas Bustamante

Dobre pytanie od @LucasBustamante i przypuszczam, że łatwo je przetestować. Bardzo ważne jest, aby zwrócić uwagę i zaoszczędzić komuś czas.
Ryan Bayne

1
@ T.Todua podał poniżej bezpieczniejszą i bardziej niezawodną odpowiedź .
mopsyd

Dla mnie nawet pagenow mówi, że to index.php ...
trainoasis

17

JEDYNY NIEZAWODNY SPOSÓB:

if( is_wplogin() ){
   ...
}

kod:

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');
}

Dlaczego jest najbezpieczniejszy?

1) Czasami, jeśli spróbujesz sprawdzić stronę logowania za pomocą REQUEST_URI(lub SCRIPT_PATH), otrzymasz NIEWŁAŚCIWE WARTOŚCI, ponieważ wiele wtyczek zmienia adresy URL LOGOWANIA i ADMINISTRACJI .
2) $pagenoww tym przypadku również poda niepoprawną wartość!

Uwagi:

  • W niektórych przypadkach może nie działać, jeśli wyślesz formularz logowania (np. Z krótkim kodem itp.) Ręcznie na innych plikach / stronach szablonów.

2
To jest fantastyczne. Używanie dołączonych plików do określania lokalizacji odwiedzającego nie jest scenariuszem, z którym kiedykolwiek się spotkałem, ale w tym przypadku ma to sens.
Ryan Bayne

@RyanBayne thnx, tak, jest to rzadka okazja, kiedy get_included_files()wydaje się najdokładniejsze rozwiązanie (przynajmniej dla mnie).
T.Todua

Dla mnie zwraca false, jak gdyby nie była stroną do logowania wp ... Również $ GLOBALS ['pagenow'] zwraca index.php ...
trainoasis

@trainoasis prawdopodobnie używasz ręcznego formularza logowania (np. shortcode) na stronie głównej czy tak?
T.Todua,

Nie, normalne wp-login.php :) Ale używam Sage i WooCommerce, może to coś jakoś zmienia :)
trainoasis

3

Bardziej nowoczesny sposób na to, powinien działać nawet wtedy, gdy adres URL wp-login jest zmieniany przez wtyczki i gdy WP znajduje się w podfolderze itp .:

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

1
Chciałem to zasugerować. Może OP musi przeanalizować wyniki z wp_login_url () i oly porównać ścieżkę internetową.
Svetoslav Marinov

1
Najbardziej podoba mi się ta odpowiedź. Aby dopasować preferencje, ja manipulowane go lekko do: return false !== stripos( wp_login_url(), $_SERVER['SCRIPT_NAME'] );. To wydaje mi się trochę czystsze.
Ian Dunn

2

$GLOBALS['pagenow']nie działa, użyj $_SERVER['PHP_SELF'].

if ( in_array( $_SERVER['PHP_SELF'], array( '/wp-login.php', '/wp-register.php' ) ) ){
    // do something.
}

a jeśli twoje wordpress nie jest zainstalowane w folderze głównym, powinieneś użyć params, takich jak YOUR_WP_PATH/wp-login.phpzamiana elementów w tablicy.


1

Zaimplementowałem go za pomocą własnej metody wp_login_url () WordPress w następujący sposób:

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 );
}

Wystarczy porównanie obu ścieżek (ponieważ trudno jest mieć absolutną pewność co do użycia protokołu SSL, ponieważ może on zostać zakończony) powinno wystarczyć ... Oznacza to jednak, że programista wtyczki lub motywu, który zmienia domyślny formularz logowania, musiał to zrobić więc właściwy sposób ...


Aby zignorować parametry adresu URL, zmień ostatni wiersz na: return substr (rtrim (strtolower ($ _SERVER ['REQUEST_URI']), '/'), 0, strlen ($ login_path)) == $ login_path;
mattavatar

0

Interesuje mnie tylko strona rejestracji, a nie strona logowania. Więc nie wszyscy mogą tego chcieć.

$ GLOBALS ['pagenow]] zwraca dla mnie index.php. Może z powodu buddypress lub mojego tematu.

Więc użyłem

is_page('register')

Jeśli przejrzysz treść strony rejestracji, ma ona również identyfikator, więc jeśli wyświetla się strona-id-4906 , możesz użyć jej w ten sposób, jeśli działa lepiej:

is_page('4906')

2
Jest to ważne tylko wtedy, gdy wtyczka modyfikuje domyślny login.
Michael Ecklund

0

Żadna z obecnych odpowiedzi nie działała dla mnie.

To, co zrobiłem, to sprawdzenie, czy $_GETtablica ma klucz „page” i czy jego wartością jest „logowanie”.

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

-1

Kilka zaproponowanych tutaj rozwiązań zadziałało, więc znalazłem coś naprawdę prostego, co działa na zwykłej stronie WordPress (nie testowane na Multisite).

Tak prosty jak:

    if( !isset($_GET['action']) ){
        echo 'This is the Login Page.';
    } else { 
        echo 'This is the Register Page.';
    }

Uwzględnia parametr url ?action=register, który istnieje tylko wtedy, gdy jesteś na stronie rejestracji.


2
To z pewnością nie jest dobre rozwiązanie, możesz mieć parametr „akcji” w dowolnym miejscu w niestandardowych szablonach strony lub wtyczkach, prawda? :)
trainoasis,

W rzeczy samej. Może to sprawdzać się w prosty sposób podczas kolejkowania plików lub wykonywania prostych funkcji szablonów na stronie logowania, ale są na pewno bezpieczniejsze sposoby osiągnięcia tego.
Adriano Monecchi,

-1

Oto wersja odpowiedzi @ T.Todua na PSR-2. Właśnie ładnie go sformatowałem. Lepiej jest manipulować funkcją, na przykład dodając filtr do celów testowych itp .:

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;
}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.