Dezactivare sau Redirecționare WP-login.php
Există vreo metodă prin care să împiedic vizitatorii, indiferent dacă sunt autentificați sau nu, să ajungă la mysite.com/wp-login.php
?
Am un formular de login separat care este tot ce avem nevoie. Știu că pot să redesenez formularul generat de wp-login
, dar aș prefera să nu fiu nevoit să mă ocup deloc de el. Am încercat diverse filtre și hook-uri și nu reușesc să obțin o redirecționare. De asemenea, am încercat să folosesc o redirecționare prin .htaccess
și am observat că funcționează, dar atunci formularul meu personalizat de login/logout nu mai funcționează.
Idei?

După ce am găsit această întrebare și am testat câteva dintre răspunsuri, mai jos este o versiune "curățată" a ceea ce folosesc într-un mediu de producție.
Această versiune nu arată nicio notificare / eroare și permite și resetarea parolei să funcționeze:
// Conectează acțiunea corespunzătoare din WordPress
add_action('init', 'prevent_wp_login');
function prevent_wp_login() {
// WP urmărește pagina curentă - globalizează variabila pentru a o accesa
global $pagenow;
// Verifică dacă $_GET['action'] este setat și, dacă da, încarcă-l în variabila $action
$action = (isset($_GET['action'])) ? $_GET['action'] : '';
// Verifică dacă suntem pe pagina de login și asigură-te că acțiunea nu este 'logout'
if( $pagenow == 'wp-login.php' && ( ! $action || ( $action && ! in_array($action, array('logout', 'lostpassword', 'rp', 'resetpass'))))) {
// Încarcă URL-ul paginii de start
$page = get_bloginfo('url');
// Redirecționează către pagina de start
wp_redirect($page);
// Oprește execuția pentru a preveni încărcarea paginii din orice motiv
exit();
}
}

Se pare că acest lucru împiedică WP-Login (bine), dar exit() final pare să împiedice apariția efectivă a login(), ceea ce nu este ceea ce dorim. Dorim ca oamenii să se poată autentifica, dar să nu vadă niciodată ecranul WP-Login. Dacă introduc o parolă incorectă, ar trebui să fie redirecționați către pagina noastră personalizată de autentificare.

Am editat-o și acum funcționează: trebuie să verifici dacă $action este completat înainte de a face in_array()

Aceasta nu a funcționat pentru mine. Am putut să mă autentific în continuare.

@Mike - Ești sigur că hook-ul tău funcționează? Ce se întâmplă dacă pui echo "HERE";
în interiorul funcției? Se afișează?

@cale_b Da, hook-ul funcționează corect. Problema este că $_GET['action']
este gol pentru mine. Formularul este trimis către /wp-login.php
(fără variabile GET în URL) și uitându-mă în sursă, nu există nici măcar un input numit action
, așa că chiar și $_REQUEST['action']
este gol.

@cale_b Se pare că codul de mai sus este procesat după ce autentificarea a avut loc deja. Dacă fac un exit;
(înainte de wp_redirect
) și reîmprospătez pagina, nu primesc o avertizare că retrimit variabilele post către server, ceea ce înseamnă că serverul a efectuat deja o redirecționare. Și dacă reîmprospătez pagina după aceea, sunt deja autentificat.

@Mike - două lucruri: 1) acest lucru nu are intenția de a împiedica autentificarea, ci are scopul de a împiedica accesul la wp-login.php (pagina implicită de autentificare WordPress), și 2) am editat răspunsul și am modificat ușor logica, ceea ce ar trebui să rezolve problema descrisă mai sus.

Sunt nou în PHP și WordPress. Întrebarea mea este, în codul tău, unde introduc link-ul către pagina mea personalizată de autentificare/profil?

Aceasta pur și simplu împiedică oricine să se autentifice pentru mine, atunci când folosesc wp_login_form pe o pagină personalizată. Nu va permite niciodată autentificarea, indiferent dacă credentialele sunt valide sau nu.

funcționează pentru mine, dar am probleme cu delogarea și nu pot înțelege de ce

Da, acest lucru blochează formularul meu personalizat de autentificare. Dar dacă ar exista o modalitate de a verifica în mod fiabil variabila de cerere sau poate refererul? Altfel spus: acesta ar putea fi un punct de plecare. Mai e cineva? TIA ---JC

Ah da, wp-login se ocupă și de delogare. Haha. E logic. Poate că acest cod cu un plugin va fi suficient. Să vedem ce altceva putem folosi pentru că urăsc să folosesc wp-login.

Tot ce cred că este necesar ar fi să monitorizez variabilele de cerere când wp-login este încărcat. Doar că acum nu am un calculator care să facă asta.

Folosesc un plugin Buddypress care redirecționează de la wp-login către o pagină personalizată de logare. Ai putea să te uiți la cod să vezi cum se face. Se numește Branded Login for Buddypress, dezvoltat de Brajesh Singh pe (buddydev.com)

Folosesc plugin-ul WordPress Rename wp-login.php de ceva vreme.
Acesta îți permite să schimbi calea wp-login.php
în oricare altă cale. Aveam probleme cu roboții care atacau pagina de login, iar acum nu mai am niciun acces nedorit.

WP-login gestionează autentificarea, deconectarea, înregistrarea, resetarea și recuperarea parolei. Presupunând că doriți să modificați pagina de autentificare din partea frontală, puteți folosi în siguranță următorul cod:
function custom_login_page() {
$new_login_page_url = home_url( '/login/' ); // noua pagină de autentificare
global $pagenow;
if( $pagenow == "wp-login.php" && $_SERVER['REQUEST_METHOD'] == 'GET') {
wp_redirect($new_login_page_url);
exit;
}
}
if(!is_user_logged_in()){
add_action('init','custom_login_page');
}
Acest fragment de cod va:
- Redirecționa toți vizitatorii site-ului către noua pagină de autentificare.
- Deconectarea va funcționa fără nicio problemă.
- Pe noua pagină de autentificare personalizată, va trebui să creați formulare personalizate pentru autentificare, înregistrare și resetare parolă. Totuși, formularele personalizate pot trimite date în siguranță către wp-login.php, deoarece cererile POST nu sunt redirecționate.

home_url()
deja adaugă o bară oblică inițială, deci nu este nevoie de aceasta. De asemenea, $pagenow
este (a) o variabilă globală care este prezentă doar în administrare (și poate pe pagina de autentificare) și (b) ar trebui înlocuită cu verificări ale proprietății get_current_screen()
.

// https://codex.wordpress.org/Plugin_API/Filter_Reference/login_url#Examples
add_filter('login_url', 'custom_login_url', 10, 3);
function custom_login_url($login_url, $redirect, $force_reauth) {
return home_url('/login/?redirect_to=' . $redirect);
}
Acest lucru va redirecționa către /login în locul formularului urât wp-login.

Dacă intenția ta este să protejezi wp-login.php
astfel încât străinii să nu poată nici măcar să-l vadă, cea mai simplă și eficientă metodă este să ceri autorizare (autentificare de bază) pentru a accesa wp-login.php
.
În Apache, autentificarea este implementată prin combinația dintre htaccess și un fișier de parole. Prima dată, într-o sesiune de browser, când cineva încearcă să acceseze wp-login.php
, i se va cere să introducă un nume de utilizator și o parolă (înainte de autentificarea WordPress).
Pentru a simplifica lucrurile, acest nume de utilizator și parolă pot fi aceleași pentru fiecare persoană căreia dorești să-i permiți accesul la wp-login.php
, deoarece ei vor trebui totuși să introducă datele de autentificare WordPress după ce au trecut cu succes de prima casetă de dialog de autentificare.

Interesant. Presupun că 'prompt' se referă la fereastra modală a browserului pentru introducerea credențialelor. Cred că asta ar putea crea confuzie. În mod ideal, aș dori ca acel URL să nu facă nimic... sau poate doar să redirecționeze către pagina principală. Dar mulțumesc pentru informație. Învăț ceva nou în fiecare zi!

Ceea ce credeți că faceți este "securitate prin obscuritate". Dar în realitate, faceți doar obscuritate, iar asta este groaznic. Nu folosiți această abordare. Autentificarea este securitate. Ascunderea punctului de intrare este obscuritate. http://security.stackexchange.com/questions/32064/at-what-point-does-something-count-as-security-through-obscurity

Cu alte cuvinte, chiar DACĂ schimbați locația wp-login, tot trebuie să folosiți autentificarea: "Ar trebui să mă bazez pe schimbarea portului serverului de la 22 la 2222 pentru a menține conexiunea sigură? Absolut nu. Este rău să schimb portul serverului SSH la 2222 în timp ce folosesc și o parolă? Nu, dacă ceva, aceasta este cea mai bună soluție. Schimbarea ("Obscurarea") portului va reduce pur și simplu numărul de scanere automate de exploatare care caută pe porturile obișnuite. Obținem un avantaj de securitate prin obscuritate, ceea ce este bun, dar nu ne bazăm pe obscuritate. Dacă o găsesc, tot trebuie să spargă parola."

Înlocuiți $pageid
cu pagina la care doriți să redirecționați utilizatorii
/* Redirecționează pagina de logare */
function redirect_login_page(){
// Stochează pentru verificare dacă această pagină este egală cu wp-login.php
$page_viewed = basename( $_SERVER['REQUEST_URI'] );
// link permanent către pagina personalizată de logare
$login_page = get_permalink($pageid);
if( $page_viewed == "wp-login.php" ) {
wp_redirect( $login_page );
exit();
}
}
add_action( 'init','redirect_login_page' );

<?php
/* Template Name: Template Înregistrare */
if(is_user_logged_in()) { $user_id = get_current_user_id();$current_user = wp_get_current_user();$profile_url = get_author_posts_url($user_id);$edit_profile_url = get_edit_profile_url($user_id); ?>
<div class="regted">
Ești autentificat cu numele de utilizator <a href="<?php echo $profile_url ?>"><?php echo $current_user->display_name; ?></a> Dorești să <a href="<?php echo esc_url(wp_logout_url($current_url)); ?>">Ieși</a> ?
</div>
<?php } else { ?>
<div class="register">
<?php $err = ''; $success = ''; global $wpdb, $PasswordHash, $current_user, $user_ID; if(isset($_POST['task']) && $_POST['task'] == 'register' ) { $pwd1 = $wpdb->escape(trim($_POST['pwd1']));
$pwd2 = $wpdb->escape(trim($_POST['pwd2']));
$email = $wpdb->escape(trim($_POST['email']));
$username = $wpdb->escape(trim($_POST['username']));
if( $email == "" || $pwd1 == "" || $pwd2 == "" || $username == "") {
$err = 'Te rugăm să completezi parola în acest câmp';
} else if(!filter_var($email, FILTER_VALIDATE_EMAIL)) {
$err = 'Adresa de email este invalidă';
} else if(email_exists($email) ) {
$err = 'Adresa de email există deja';
} else if($pwd1 <> $pwd2 ){
$err = 'Parola nu corespunde cu confirmarea parolei';
} else {
$user_id = wp_insert_user( array ('user_pass' => apply_filters('pre_user_user_pass', $pwd1), 'user_login' => apply_filters('pre_user_user_login', $username), 'user_email' => apply_filters('pre_user_user_email', $email), 'role' => 'subscriber' ) );
if( is_wp_error($user_id) ) {
$err = 'Eroare la crearea utilizatorului.';
} else {
do_action('user_register', $user_id);
$success = 'Înregistrare efectuată cu succes';
}
}
}
?>
<link rel="stylesheet" type="text/css" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
<!--afișare mesaj eroare/succes-->
<div id="message">
<?php
if(! empty($err) ) :
echo ''.$err.'';
endif;
?>
<?php
if(! empty($success) ) :
$login_page = home_url( '/login' );
echo ''.$success. '<a href='.$login_page.'> Autentificare</a>'.'';
endif;
?>
</div>
<div class="container">
<div id="loginbox" style="margin-top:100px;" class="mainbox col-md-6 col-md-offset-3 col-sm-8 col-sm-offset-2">
<div style="padding-bottom: 50px;" class="col-md-6 col-md-offset-4 col-sm-8 col-sm-offset-2"/><img src="#url.logo" alt="Logo site" title="Logo site"></div>
<form class="form-horizontal" method="post" role="form">
<div class="form-group">
<label class="control-label col-sm-3" for="username">Nume utilizator:</label>
<div class="col-sm-9">
<input type="text" class="form-control" name="username" id="username" placeholder="Nume utilizator">
</div>
</div>
<div class="form-group">
<label class="control-label col-sm-3" for="email">Email:</label>
<div class="col-sm-9">
<input type="email" class="form-control" name="email" id="email" placeholder="Email">
</div>
</div>
<div class="form-group">
<label class="control-label col-sm-3" for="pwd1">Parolă</label>
<div class="col-sm-9">
<input type="password" class="form-control" name="pwd1" id="pwd1" placeholder="Introdu parola">
</div>
</div>
<div class="form-group">
<label class="control-label col-sm-3" for="pwd2">Reintrodu parola:</label>
<div class="col-sm-9">
<input type="password" class="form-control" name="pwd2" id="pwd2" placeholder="Reintrodu parola">
</div>
</div>
<?php wp_nonce_field( 'post_nonce', 'post_nonce_field' ); ?>
<div class="form-group">
<div class="col-sm-offset-3 col-sm-9" style="text-align:center;">
<button type="submit" class="btn btn-primary">Înregistrare</button>
<input type="hidden" name="task" value="register" /><br/>
</div>
</div>
</form>
</div>
</div>
</div>
<?php
get_footer();
?>
<div class="message">
<?php
$login = (isset($_GET['login']) ) ? $_GET['login'] : 0;
if ( $login === "failed" ) {
echo '<strong>Eroare</strong> Nume de utilizator sau parolă incorectă!';
} elseif ( $login === "empty" ) {
echo '<strong>Eroare:</strong>Câmpul nume utilizator sau parolă este gol.';
} elseif ( $login === "false" ) {
echo '<strong>EROARE:</strong> Ieșire';
}
?>
</div>
<?php } ?>
Exemplu de pagină personalizată de autentificare. Salvează login.php și adaugă codul
add_action('init','wpse_login');
function wpse_login(){
global $pagenow;
if( 'wp-login.php' == $pagenow && !is_user_logged_in()) {
wp_redirect('http://yoursite.com/login.php');
exit();
}
}
în functions.php

Poți te rog să editezi întrebarea ta și să explici de ce acest răspuns este mai bun decât răspunsurile anterioare sau exact ce faci în codul tău. Răspunsurile doar cu cod sunt de obicei dezaprobate fără o oarecare explicație.

acest cod schimbă wp-login.php în login.php cu codul meu personalizat bazat pe bootstrap. Poate preveni boturile automate sau ghicirea URL-ului implicit. Poți schimba <i>login</i> în orice frază dorești, astfel nimeni nu va știi direct URL-ul de login în afară de tine.

add_action('check_admin_referer', 'logout_without_confirm', 10, 2); function logout_without_confirm($action, $result) { /* * Permite delogarea fără confirmare / if ($action == "log-out" && !isset($_GET['_wpnonce'])) { $redirect_to = isset($_REQUEST['redirect_to']) ? $_REQUEST['redirect_to'] : 'https://yourdomain.com'; $location = str_replace('&', '&', wp_logout_url($redirect_to)); header("Location: $location"); die; } }
