wp-loginが現在のページかどうかを確認します


48

現在のページがwp-login.phpまたはであるかwp-signup.phpどうかを確認するにはどうすればよいですか?

使用するよりもエレガントなソリューションはあり$_SERVER['REQUEST_URI']ますか?


1
参考のため、関連するtracの議論がここにあります。core.trac.wordpress.org/ticket/19898
スティーブンハリス

回答:


59

globalを使用$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
ユーザーが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)を使用してログインページをチェックしようとすると、多くのプラグインがLOGINおよびADMIN URLを変更するため、誤った値を取得することがあります。
2)$pagenowその場合も間違った値を与えます!

ノート:

  • 場合によっては、ログインフォーム(ショートコードなど)を他のテンプレートファイル/ページに手動で出力すると機能しない場合があります。

2
これは素晴らしいです。含まれているファイルを使用して訪問者の場所を特定することは、私がこれまでに経験したことのないシナリオですが、この場合は理にかなっています。
ライアン・ベイン

@RyanBayne thnx、はい、これはget_included_files()(私にとっては)最も正確な解決策と思われるまれな機会です。
T.Todua

私にとっては、wp-loginページではないかのようにfalseを返します... $ GLOBALS ['pagenow']でもindex.phpを返します...
trainoasis

@trainoasisは、おそらくホームページで(ショートコードのような)手動のログインフォームを使っているのでしょうか?
T.Todua

いいえ、通常のwp-login.php :)しかし、私はSageとWooCommerceを使用しています。多分それは何かを変えるでしょう:)
trainoasis

3

それを行うより現代的な方法は、プラグインによってwp-login URLが変更され、WPがサブフォルダーなどにある場合でも動作するはずです。

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

1
それを提案するつもりでした。たぶん、OPはwp_login_url()からの結果を解析し、Webパスを比較する必要があります。
スヴェトスラフ・マリノフ

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.
}

また、ワードプレスがWebルートフォルダーにインストールされていない場合はYOUR_WP_PATH/wp-login.php、配列の要素を置き換えるなどのいくつかのパラメーターを使用する必要があります。


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の使用について完全に確認するのは難しいため)十分なはずです...ただし、デフォルトのログインフォームを変更するプラグインまたはテーマの開発者は、だから適切な方法...


URLパラメーターを無視するには、最後の行を次のように変更します。return substr(rtrim(strtolower($ _SERVER ['REQUEST_URI'])、 '/')、0、strlen($ login_path))== $ login_path;
mattavatar

0

ログインページではなく、登録ページにのみ興味があります。したがって、これは誰もが望んでいるわけではありません。

$ GLOBALS ['pagenow']は、index.phpを返します。たぶんバディプレスや私のテーマが原因です。

だから私は使用しました

is_page('register')

登録ページの本文を検査する場合、そのページにもIDもあるため、page-id-4906表示されている場合は、より適切に機能する場合はこのように使用できます。

is_page('4906')

2
これは、プラグインがデフォルトのログインを変更している場合にのみ有効です。
マイケルエックランド16年

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

?action=register登録ページにいる場合にのみ存在するurlパラメーターを考慮します。


2
それは確かに良い解決策ではありません。カスタムページテンプレートまたはプラグインのどこにでも「アクション」パラメーターを使用できます。:)
trainoasis

確かに。ログインページでファイルをキューに登録したり、単純なテンプレート機能を実行したりするときに簡単なチェックで機能する場合がありますが、それを確実に達成するより安全な方法があります。
アドリアーノモネッキ

-1

これは@ T.Toduaの回答のPSR-2バージョンです。うまくフォーマットしました。これは、テストなどの目的でフィルターを追加するなど、関数を操作することをお勧めします。

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;
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.