Verifică dacă wp-login este pagina curentă
Cum pot verifica dacă pagina curentă este wp-login.php
sau wp-signup.php
?
Există soluții mai elegante decât folosirea $_SERVER['REQUEST_URI']
?

Folosește variabila globală $pagenow
, care este o variabilă globală comună setată de WordPress în timpul execuției:
if ( $GLOBALS['pagenow'] === 'wp-login.php' ) {
// Suntem pe pagina de autentificare!
}
De asemenea, poți verifica și tipul paginii de autentificare, de exemplu înregistrarea:
if ( $GLOBALS['pagenow'] === 'wp-login.php' && ! empty( $_REQUEST['action'] ) && $_REQUEST['action'] === 'register' ) {
// Suntem în procesul de înregistrare
}
Următorul cod este considerat învechit și nu ar trebui utilizat (wp-register.php
a fost depreciat și ulterior eliminat de mult timp):
if ( in_array( $GLOBALS['pagenow'], array( 'wp-login.php', 'wp-register.php' ) ) )
run_my_funky_plugin();

Funcționează acest lucru dacă utilizatorul își schimbă URL-ul wp-login.php?

Bună întrebare de la @LucasBustamante și cred că poate fi testată ușor. Este foarte important să subliniez asta pentru a economisi timpul cuiva.

@T.Todua a oferit un răspuns mai sigur și mai fiabil mai jos.

Metoda mea preferată:
if( is_wplogin() ){
...
}
cod:
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');
}
De ce este cea mai sigură metodă?
- Uneori, dacă încerci să verifici pagina de login folosind
REQUEST_URI
(sauSCRIPT_PATH
), vei obține VALORI INCORECTE, deoarece multe plugin-uri modifică URL-urile pentru LOGIN & ADMIN.
2)$pagenow
va oferi, de asemenea, o valoare incorectă în acest caz!
Note:
- În unele cazuri, s-ar putea să nu funcționeze dacă afișezi formularul de login (de exemplu, prin shortcode sau altă metodă) manual în alte fișiere/șabloane de pagini.
Actualizare în Nucleu:
Începând cu WordPress Versiunea 6.1 (Noiembrie 2022), există o funcție suplimentară în nucleu - is_login
care verifică wp_login_url
.

Este fantastic. Folosirea fișierelor incluse pentru a determina locația unui vizitator nu este un scenariu pe care l-am întâlnit vreodată, dar are sens în acest caz.

@RyanBayne mulțumesc, da, aceasta este ocazia rară când get_included_files()
pare a fi cea mai precisă soluție (cel puțin pentru mine).

Pentru mine returnează false, ca și cum nu ar fi o pagină wp-login... De asemenea, chiar și $GLOBALS['pagenow'] returnează index.php...

@trainoasis probabil folosești un formular de login manual (ca un shortcode) pe pagina principală sau ceva de genul?

Nu, folosesc wp-login.php normal :) Dar utilizez Sage și WooCommerce, poate asta schimbă cumva lucrurile :)

În WordPress 6.1.0 a fost introdusă o nouă funcție numită is_login()
care face exact acest lucru.
https://developer.wordpress.org/reference/functions/is_login/

O metodă mai modernă de a face asta, care ar trebui să funcționeze chiar și atunci când URL-ul wp-login este modificat de plugin-uri sau când WordPress este într-un subdirector, etc:
if(stripos($_SERVER["SCRIPT_NAME"], strrchr(wp_login_url(), '/')) !== false){
/* ... */
}

Tocmai voiam să sugerez asta. Poate OP trebuie să parseze rezultatele din wp_login_url() și să compare doar calea web.

$GLOBALS['pagenow']
nu funcționează, folosește $_SERVER['PHP_SELF']
.
if ( in_array( $_SERVER['PHP_SELF'], array( '/wp-login.php', '/wp-register.php' ) ) ){
// fă ceva.
}
Și dacă WordPress-ul tău nu este instalat în directorul rădăcină al site-ului, ar trebui să folosești parametri precum CALE_WP/wp-login.php
pentru a înlocui elementele din array.

Iată o versiune mai ușor de citit a răspunsului lui @T.Todua. Am formatat-o mai frumos, am pus verificările cele mai simple la început și am returnat devreme:
function isLoginPage()
{
// $_SERVER['PHP_SELF'] este egal cu "/wp-login.php"?
if ($_SERVER['PHP_SELF'] == '/wp-login.php') {
return true;
}
// $GLOBALS['pagenow'] este egal cu "wp-login.php"?
if (isset($GLOBALS['pagenow']) && $GLOBALS['pagenow'] === 'wp-login.php') {
return true;
}
$ABSPATH_MY = str_replace(array('\\', '/'), DIRECTORY_SEPARATOR, ABSPATH);
// A fost inclus wp-login.php sau wp-register.php în timpul acestei execuții?
if (
in_array($ABSPATH_MY . 'wp-login.php', get_included_files()) ||
in_array($ABSPATH_MY . 'wp-register.php', get_included_files())
) {
return true;
}
return false;
}
Dacă dorești un impact minim asupra performanței, păstrează doar primele două verificări.
De asemenea, dacă rulezi această verificare după ce șablonul s-a încărcat, poți folosi simplu:
function isLogin() {
if (!did_action('wp_loaded')) {
return null;
}
return did_action('login_head');
}

Am implementat acest lucru folosind metoda proprie a WordPress, wp_login_url(), după cum urmează:
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 );
}
Doar compararea ambelor căi (deoarece este dificil să fii absolut sigur de utilizarea SSL, deoarece aceasta poate fi terminată) ar trebui să fie suficientă... Totuși, înseamnă că un dezvoltator de plugin-uri sau teme care modifică formularul implicit de autentificare trebuie să fi făcut acest lucru în mod corespunzător...

Niciunul dintre răspunsurile actuale nu a funcționat pentru mine.
Ceea ce am făcut a fost să verific dacă array-ul $_GET
are o cheie 'page' și dacă valoarea sa este 'sign-in'.
if (isset($_GET['page']) && $_GET['page'] == 'sign-in'){
// ești pe pagina de autentificare
}

Dacă aveți nevoie să adăugați cod pentru pagina de autentificare, puteți folosi un hook pentru aceasta
<?php add_action( 'login_head', 'login_head_add_css' );
function login_head_add_css() {
?>
<style>
body {
background-image: url('/background.png');
}
.login h1 a{
background-image: url('/logo.png');
background-size: 300px !important;
background-position: center top;
background-repeat: no-repeat;
color: #444;
height: 120px;
font-size: 20px;
font-weight: 400;
line-height: 1.3;
margin: 0 auto 25px;
padding: 0;
text-decoration: none;
width: 300px !important;
text-indent: -9999px;
outline: 0;
overflow: hidden;
display: block;
}
</style>
<?php
} ?>

Acest fișier conține atât de multe action hooks. Mulțumesc, dezvoltatorilor WordPress!
Iată o listă cu cele mai comune action hooks, în ordinea în care sunt executate, pentru a te ajuta să începi.
- login_enqueue_scripts
- login_head
- login_header
- login_init
- login_form_{$action}
- confirm_admin_email
- postpass
- logout
- lostpassword
- retrievepassword
- resetpass
- rp
- register
- login
- confirmaction
- login_form
- login_footer

O metodă alternativă:
/**
* Determină dacă pagina curentă este pagina de autentificare.
* @return bool True dacă pagina curentă este pagina de autentificare.
*/
final public static function isLoginPage(): bool
{
return function_exists('login_header');
}
Funcția login_header
este definită în fișierul wp-login.php. Presupunem că pagina de autentificare nu este inclusă, deoarece aceasta este o pagină separată din WordPress, care ar trebui să fie apelată direct. Probabil una dintre cele mai sigure soluții.

Aceasta este metoda mea preferată, care va gestiona orice slug pe care decideți să-l utilizați pentru pagina de autentificare. De asemenea, funcționează și cu formularele de autentificare personalizate, în cazul în care alegeți să nu folosiți formularul implicit de autentificare WordPress, deoarece is_login()
nu va funcționa dacă nu includeți scriptul de autentificare. Utilizează global $wp
în loc de array-ul $_SERVER
.
global $wp;
if( trailingslashit( trailingslashit( site_url() ) . $wp->request ) !== wp_login_url() ) {
// Sunteți pe pagina de autentificare
}

Sunt interesat doar de pagina de înregistrare, nu de cea de autentificare. Prin urmare, această soluție poate să nu fie dorită de toată lumea.
$GLOBALS['pagenow'] returnează index.php în cazul meu. Poate din cauza BuddyPress sau a temei mele.
Așa că am folosit:
is_page('register')
Dacă inspectezi corpul paginii de înregistrare, acesta are și un ID, deci dacă apare page-id-4906, poți folosi această metodă dacă funcționează mai bine:
is_page('4906')

Este întotdeauna o idee bună să folosești funcția nativă din WP is_login()
. Aceasta a fost introdusă începând cu versiunea 6.1.
Detalii sunt disponibile aici

Aceasta a fost deja menționată în https://wordpress.stackexchange.com/a/411320/3898 și https://wordpress.stackexchange.com/a/237285/3898. Răspunsurile redundante fac mai dificilă utilizarea site-ului, așa că aș recomanda ștergerea acestuia.
