2015-09-11 4 views
0

У меня всегда была политика «, тем меньше плагинов лучше», поэтому, пожалуйста, не предлагайте плагин Login Tryempt, особенно если он не обновлялся в течение нескольких лет.WP вход в систему

Это, как говорится, я нашел этот фрагмент кода & добавила его 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 фильтр/действие, не так ли?
  • Это первый раз, когда я услышал о переходных процессах & Я читал, что это значение может быть не сохранено в базе данных. Проверено все равно - не там. не
  • Нет ошибок

Почему он не работает? Немного советов о том, как отлаживать это сам, было бы также потрясающе.

+0

Лучший способ сделать это - установить ограничение в среде Apache. – rnevius

+0

Спасибо за комментарий. Знаете ли вы какие-либо хорошие ссылки или ссылки? (Я тоже пытаюсь найти его, не волнуйся.: P) Кроме того, он хорошо работает с WordPress? Я не очень разбираюсь в Apache или серверах в целом. – AWA

ответ

0

Определить как переменную класса:

var $error = null; 

Добавьте его в конструктор:

$this->error = new WP_Error(); 

В вас codition, если у вас есть какие-либо ошибки, добавьте его

$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() 
}