Überprüfen Sie, ob es sich bei wp-login um die aktuelle Seite handelt

Antworten:

59

Verwenden Sie das globale $pagenow, ein allgemeines globales Set, das von WordPress zur Laufzeit festgelegt wird:

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

Sie können auch die Art der Anmeldeseite überprüfen , z. B. Registrierung:

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

Der folgende Code gilt als Legacy und sollte nicht verwendet werden ( wp-register.phpwurde vor einiger Zeit veraltet und anschließend entfernt):

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

TheDeadMedic
quelle
3
Funktioniert dies, wenn der Benutzer seine wp-login.php-URL ändert?
Lucas Bustamante
Gute Frage von @LucasBustamante und ich denke, es ist leicht zu testen. Es ist einfach sehr wichtig, jemanden darauf hinzuweisen und Zeit zu sparen.
Ryan Bayne
1
@ T.Todua hat unten eine sicherere und zuverlässigere Antwort geliefert .
Mopsyd
Für mich sagt sogar pagenow, es ist index.php ...
trainoasis
17

DER EINZIGE ZUVERLÄSSIGE WEG:

if( is_wplogin() ){
   ...
}

Code:

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

Warum ist es am sichersten?

1) Wenn Sie versuchen, die Anmeldeseite mit REQUEST_URI(oder SCRIPT_PATH) zu überprüfen , erhalten Sie manchmal falsche Werte, da viele Plugins die Anmelde- und Administrations- URLs ändern.
2) $pagenowgibt Ihnen in diesem Fall auch einen falschen Wert!

Anmerkungen:

  • In einigen Fällen funktioniert es möglicherweise nicht, wenn Sie das Anmeldeformular (z. B. mit Shortcode oder usw.) manuell auf anderen Vorlagendateien / -seiten ausgeben.
T.Todua
quelle
2
Das ist fantastisch. Die Verwendung von eingebundenen Dateien zur Bestimmung des Aufenthaltsorts eines Besuchers ist kein Szenario, das ich jemals erlebt habe, aber in diesem Fall ist es sinnvoll.
Ryan Bayne
@ RyanBayne Danke, ja, dies ist die seltene Gelegenheit, wenn get_included_files()die genaueste Lösung zu sein scheint (zumindest für mich).
T.Todua
Für mich gibt es false zurück, als wäre es keine wp-Login-Seite ... Auch $ GLOBALS ['pagenow'] gibt index.php zurück ...
trainoasis
@trainoasis wahrscheinlich benutzt du ein manuelles Login-Formular (wie Shortcode) auf der Homepage oder so?
T.Todua
Nein, normales wp-login.php :) Aber ich benutze Sage und WooCommerce, vielleicht ändert das die Dinge irgendwie :)
trainoasis
3

Eine modernere Möglichkeit, dies zu tun, sollte auch dann funktionieren, wenn die URL für die WP-Anmeldung durch Plugins geändert wird und sich WP in einem Unterordner befindet.

if(stripos($_SERVER["SCRIPT_NAME"], strrchr(wp_login_url(), '/')) !== false){
    /* ... */
}
Firsh - LetsWP.io
quelle
1
Das wollte ich vorschlagen. Möglicherweise muss das OP die Ergebnisse von wp_login_url () analysieren und den Webpfad vergleichen.
Svetoslav Marinov
1
Mir gefällt diese Antwort am besten. Zu meinen Vorlieben passen, ich zwickte es leicht zu: return false !== stripos( wp_login_url(), $_SERVER['SCRIPT_NAME'] );. Das fühlt sich für mich ein bisschen sauberer an.
Ian Dunn
2

$GLOBALS['pagenow']funktioniert nicht, benutze $_SERVER['PHP_SELF'].

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

und wenn dein wordpress nicht im web root ordner installiert ist, solltest du einige params verwenden YOUR_WP_PATH/wp-login.php, um die elemente im array zu ersetzen.

Dallaslu
quelle
1

Ich habe es mit der WordPress-eigenen wp_login_url () -Methode wie folgt implementiert:

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

Ein einfacher Vergleich beider Pfade (da es schwierig ist, sich über die Verwendung von SSL absolut sicher zu sein, da es möglicherweise beendet wird) sollte ausreichen ... Dies bedeutet jedoch, dass ein Plug-in- oder Designentwickler, der das Standardanmeldeformular ändert, dies getan haben muss Also der richtige Weg ...

Mavawie
quelle
Um URL-Parameter zu ignorieren, ändern Sie die letzte Zeile in: return substr (rtrim (strtolower ($ _SERVER ['REQUEST_URI']), '/'), 0, strlen ($ login_path)) == $ login_path;
Mattavatar
0

Ich interessiere mich nur für die Registrierungsseite, nicht für die Anmeldeseite. Das wird vielleicht nicht von jedem gewünscht.

$ GLOBALS ['pagenow'] gibt index.php für mich zurück. Möglicherweise wegen buddypress oder meines Themas.

Also habe ich benutzt

is_page('register')

Wenn Sie den Hauptteil der Registrierungsseite überprüfen, hat diese auch die ID. Wenn also die Seiten-ID-4906 angegeben ist , können Sie diese auf diese Weise verwenden, wenn sie besser funktioniert:

is_page('4906')
Zeta
quelle
2
Dies ist nur gültig, wenn ein Plugin die Standardanmeldung ändert.
Michael Ecklund
0

Keine der aktuellen Antworten hat für mich funktioniert.

Was ich getan habe, war zu überprüfen, ob das $_GETArray einen "Seiten" -Schlüssel hat und ob sein Wert "Anmelden" ist.

if (isset($_GET['page']) && $_GET['page'] == 'sign-in'){
   // you're on login page
}
Rafael Carneiro de Moraes
quelle
-1

Einige der hier vorgeschlagenen Lösungen haben funktioniert, daher habe ich etwas wirklich Einfaches mitgebracht, das auf einer normalen WordPress-Site funktioniert (nicht auf Multisite getestet).

So einfach wie:

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

Dabei wird der URL-Parameter berücksichtigt ?action=register, der nur vorhanden ist, wenn Sie sich auf der Registrierungsseite befinden.

Adriano Monecchi
quelle
2
Das ist sicherlich keine gute Lösung. Sie könnten irgendwo in Ihren benutzerdefinierten Seitenvorlagen oder Plugins "action" -Parameter haben, nicht wahr? :)
trainoasis
Tatsächlich. Es funktioniert möglicherweise für eine einfache Überprüfung, während Dateien in die Warteschlange gestellt werden oder einfache Vorlagenfunktionen auf der Anmeldeseite ausgeführt werden. Es gibt jedoch sicherere Möglichkeiten, dies zu erreichen.
Adriano Monecchi
-1

Hier ist eine PSR-2-Version von @ T.Todua Antwort. Ich habe es nur schön formatiert. Dies ist besser, um die Funktion zu manipulieren, wie z. B. das Hinzufügen eines Filters zu Testzwecken usw.:

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;
}
Lucas Bustamante
quelle