web-dev-qa-db-ja.com

Wp-loginが現在のページかどうかを確認

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

$_SERVER['REQUEST_URI']を使用するよりもエレガントな解決策はありますか?

43
onetrickpony

実行時にWordPressによって設定される共通のグローバルであるグローバル$pagenowを使用してください。

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

登録ページの type を確認することもできます。

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();
56
TheDeadMedic

唯一の信頼できる方法:

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 urlsを変更するため、誤った値になることがあります。
2)$pagenowはその場合も間違った値を与えるでしょう!

ノート:

  • 場合によっては、login-formを(ショートコードなどで)手動で他のテンプレートファイル/ページに出力するとうまくいかないことがあります。
12
T.Todua

$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のようないくつかのパラメータを使って配列の要素を置き換えるべきです。

3
dallaslu

それをするためのもっと現代的な方法は、wp-login URLがプラグインによって変更されたときやWPがサブフォルダの中にあるときなどにもうまくいくはずです。

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

ここで提案されているいくつかの解決策がうまくいったので、私は普通のWordPressサイトで動作する本当に簡単なものを手に入れました(Multisiteではテストされていません)。

単純な:

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

それはあなたが登録ページにいるときだけ存在するurlパラメータ?action=registerを考慮に入れます。

0

私は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の使用について絶対に確信が持てないため)十分です。ただし、デフォルトのログインフォームを変更するプラグインまたはテーマ開発者が行ったはずです。そう正しい方法...

0
Mavawie

これが@ 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;
}
0

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

$ GLOBALS ['pagenow']は私にはindex.phpを返します。たぶん、私のテーマや私のテーマのためです。

だから私は使った

is_page('register')

あなたが登録ページの本体を調べるならば、それは同様にIDを持っています、それでそれが page-id-4906 と言うなら、あなたはそれがよりうまく機能するならあなたはそれをこのように使うことができます:

is_page('4906')
0
zeta