У меня всегда была политикачем меньше плагинов, тем лучше‘, поэтому, пожалуйста, не предлагайте плагин Login Attempts, особенно если он не обновлялся в течение нескольких лет.
Как говорится, я нашел этот фрагмент & добавил это к functions.php
:
//Limit Login Attempts
if ( ! class_exists( 'limit_login_attempts' ) ) {
class limit_login_attempts {
var $failed_login_limit = 3; //Number of authentification accepted
var $lockout_duration = 1800; //Stop authentification process for 30 minutes: 60*30 = 1800
var $transient_name = 'attempted_login'; //Transient used
public function __construct() {
add_filter( 'authenticate', array( $this, 'check_attempted_login' ), 30, 3 );
add_action( 'wp_login_failed', array( $this, 'login_failed' ), 10, 1 );
}
/**
* Lock login attempts of failed login limit is reached
*/
public function check_attempted_login( $user, $username, $password ) {
if ( get_transient( $this->transient_name ) ) {
$datas = get_transient( $this->transient_name );
if ( $datas['tried'] >= $this->failed_login_limit ) {
$until = get_option( '_transient_timeout_' . $this->transient_name );
$time = $this->when( $until );
//Display error message to the user when limit is reached
return new WP_Error( 'too_many_tried', sprintf( __( '<strong>ERROR</strong>: You have reached authentification limit, you will be able to try again in %1$s.' ) , $time ) );
}
}
return $user;
}
/**
* Add transient
*/
public function login_failed( $username ) {
if ( get_transient( $this->transient_name ) ) {
$datas = get_transient( $this->transient_name );
$datas['tried']++;
if ( $datas['tried'] <= $this->failed_login_limit )
set_transient( $this->transient_name, $datas , $this->lockout_duration );
} else {
$datas = array(
'tried' => 1
);
set_transient( $this->transient_name, $datas , $this->lockout_duration );
}
}
/**
* Return difference between 2 given dates
* @param int $time Date as Unix timestamp
* @return string Return string
*/
private function when( $time ) {
if ( ! $time )
return;
$right_now = time();
$diff = abs( $right_now - $time );
$second = 1;
$minute = $second * 60;
$hour = $minute * 60;
$day = $hour * 24;
if ( $diff < $minute )
return floor( $diff / $second ) . ' secondes';
if ( $diff < $minute * 2 )
return "about 1 minute ago";
if ( $diff < $hour )
return floor( $diff / $minute ) . ' minutes';
if ( $diff < $hour * 2 )
return 'about 1 hour';
return floor( $diff / $hour ) . ' hours';
}
}
}
//Enable
new limit_login_attempts();
Он не отображает никаких сообщений, поэтому я понятия не имею, чтобы проверить, работает ли он должным образом.
Я никогда раньше не пользовался WP_Error, и документы были не очень полезны. Как или где вывести эту ошибку?
autheniticate
а также wp_login_failed
фильтр / действие, верно?Почему это не работает? Несколько советов о том, как его отладить, тоже было бы здорово.
Определить как переменную класса:
var $error = null;
Добавьте его в свой конструктор:
$this->error = new WP_Error();
В вашей кодировке, если у вас есть ошибки, добавьте ее
$error->add('login_atttempts', 'Your message!');
И вы можете проверить в конце:
$errors = $error->get_error_messages();
if( ! empty($errors)) {
wp_die($error) // You can pass the whole WP_Error object to wp_die()
}
Других решений пока нет …