WP-Loginが現在のページであるかどうかを確認してください
-
16-10-2019 - |
質問
現在のページがあるかどうかを確認するにはどうすればよいですか wp-login.php
また wp-signup.php
?
使用するよりもエレガントなソリューションがありますか $_SERVER['REQUEST_URI']
?
解決
グローバルを使用します $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();
他のヒント
唯一の信頼できる方法:
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
その場合、誤った価値も与えます!
ノート:
- 場合によっては、他のテンプレートファイル/ページにログインフォーム(つまり、ショートコードなど)を手動で出力しても機能しない場合があります。
それを行うためのより現代的な方法では、WP-Login URLがプラグインによって変更され、WPがサブフォルダーなどに変更された場合でも機能するはずです。
if(stripos($_SERVER["SCRIPT_NAME"], strrchr(wp_login_url(), '/')) !== false){
/* ... */
}
$GLOBALS['pagenow']
動作しません、使用してください $_SERVER['PHP_SELF']
.
if ( in_array( $_SERVER['PHP_SELF'], array( '/wp-login.php', '/wp-register.php' ) ) ){
// do something.
}
また、WordPressがWebルートフォルダーにインストールされていない場合は、次のようなパラメーションを使用する必要があります。 YOUR_WP_PATH/wp-login.php
配列の要素を置き換えるには。
次のように、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の使用が終了する可能性があることを絶対に確信することは困難であるため)、それだけで十分である必要があります...しかし、デフォルトのログインフォームを変更したプラグインまたはテーマ開発者が実行したに違いないことを意味しますだから適切な方法...
ログインページではなく、登録ページのみに興味があります。したがって、これは誰もが望んでいないかもしれません。
$ globals ['pagenow']は私のためにindex.phpを返します。たぶん、Buddypressまたは私のテーマのためです。
だから私は使った
is_page('register')
登録ページの本文を検査する場合、IDも同様です。 Page-ID-4906, 、それがよりうまく機能する場合、この方法で使用できます:
is_page('4906')
現在の答えはどれも私のために働いていませんでした。
私がやったことはチェックすることでした $_GET
配列には「ページ」キーがあり、その値が「サインイン」の場合。
if (isset($_GET['page']) && $_GET['page'] == 'sign-in'){
// you're on login page
}
ここで提案されているいくつかのソリューションが機能したため、通常のWordPressサイト(マルチサイトでテストされていない)で機能する非常にシンプルなものがありました。
単純な:
if( !isset($_GET['action']) ){
echo 'This is the Login Page.';
} else {
echo 'This is the Register Page.';
}
URLパラメーターを考慮します ?action=register
, 、これは登録ページにあるときにのみ存在します。
@T.Todua Answerの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;
}