Как я могу проверить, является ли текущая страница wp-login.php
или wp-signup.php
?
Есть ли более элегантные решения, чем использование $_SERVER['REQUEST_URI']
?
Как я могу проверить, является ли текущая страница 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-адреса LOGIN & ADMIN .
2) $pagenow
в этом случае тоже даст неверное значение!
get_included_files()
кажется , наиболее точное решение (по крайней чтобы для меня).
Более современный способ сделать это, он должен работать, даже если URL-адрес wp-login изменен плагинами и когда WP находится в подпапке и т.д .:
if(stripos($_SERVER["SCRIPT_NAME"], strrchr(wp_login_url(), '/')) !== false){
/* ... */
}
return false !== stripos( wp_login_url(), $_SERVER['SCRIPT_NAME'] );
. Это кажется мне чище.
$GLOBALS['pagenow']
не работает, используйте $_SERVER['PHP_SELF']
.
if ( in_array( $_SERVER['PHP_SELF'], array( '/wp-login.php', '/wp-register.php' ) ) ){
// do something.
}
и если ваш wordpress не установлен в корневой веб-папке, вы должны использовать некоторые параметры, например, 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 для меня. Возможно из-за приятеля или моей темы.
Так что я использовал
is_page('register')
Если вы проверяете тело страницы регистрации, она также имеет идентификатор, поэтому, если там написано page-id-4906 , вы можете использовать его следующим образом, если он работает лучше:
is_page('4906')
Ни один из текущих ответов не сработал для меня.
Что я сделал, так это проверил, есть ли в $_GET
массиве ключ «page» и имеет ли он значение «sign-in».
if (isset($_GET['page']) && $_GET['page'] == 'sign-in'){
// you're on login page
}
Несколько предложенных здесь решений сработали, поэтому я пришел с чем-то действительно простым, которое работает на обычном сайте WordPress (не тестировалось на Multisite).
Так просто как:
if( !isset($_GET['action']) ){
echo 'This is the Login Page.';
} else {
echo 'This is the Register Page.';
}
Он учитывает параметр url ?action=register
, который существует только тогда, когда вы находитесь на странице регистрации.
Вот PSR-2 версия ответа @ T.Todua. Я просто отформатировал это красиво. Это лучше для манипулирования функцией, такой как добавление фильтра для тестирования и т. Д.
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;
}