2013-12-10 97 views
0

有沒有人試圖實現WordPress插件 - 「限制登錄嘗試」到自定義登錄頁面模板?WordPress的限制登錄嘗試插件在自定義登錄表格

在我的自定義模板,我插入:

<div class="msg-error""> 
<p> 
    <!--The credentials entered are incorrect. Please try again.--> 
    <?php 
     echo limit_login_get_message(); 
    ?> 
</p> 

產生的誤差:2999次嘗試剩餘。但是,當您嘗試再次輸入無效的密碼或用戶名時,錯誤保持不變並且不會更改。

如果有人這樣做,你能幫我嗎?

謝謝。

------------------------------------ UPDATE --------- --------------------------------

我嘗試這樣做:

$user = wp_signon($credentials, false); 

if (is_wp_error($user)) { // True, check for errors and display them 

    echo '<div class="msg-error">' . $user->get_error_message() . '</div>'; 
    echo '<div class="msg-error">' . limit_login_get_message() . '</div>'; // Display Limit Login Login Attempt message 
} else { 
    wp_redirect(site_url()); // Redirect them to home page 
} 

當用戶輸入不正確的憑據,WP生成錯誤,但不是限制登錄嘗試錯誤,但如果我添加 echo limit_login_get_message();,它會顯示剩餘的嘗試#(靜態的,#並不在多個不正確的憑據更改....)

這個還在回味......

-------- ---------------------- UPDATE --------------------------- ------------ 這裏是什麼,我有一個片段:

if ($user_ID) { 
// Send logged in user back to home page if they are trying to access this page 
header('Location:' . home_url()); 
} else { // If user aren't logged in, Continue log in process 
if (isset($_POST["submit-log"])) { // Check for submit button 

global $wpdb, $user; // WP Global variables 

$username = $wpdb -> escape($_POST['username']); // SQL escape & Fetch username input text 
$password = $wpdb -> escape($_POST['password']); // SQL escape & Fetch password input text 
$remember = $wpdb -> escape($_POST['rememberme']); // SQL escape & Fetch remember checkbox 

if ($remember) // True, checkbox has been checked 
    $remember = "true"; 
else // False 
    $remember = "false"; 

$credentials = array(); // Create an array to hold the user input data 
$credentials['user_login'] = $username; 
$credentials['user_password'] = $password; 
$credentials['remember'] = $remember; 

$user = wp_signon($credentials, false); 

if (is_wp_error($user)) { // True, check for errors and display them 

    echo '<div class="msg-error">' . $user->get_error_message() . '</div>'; 
    echo '<div class="msg-error">' . limit_login_get_message() . '</div>'; // Display Limit Login Login Attempt message 
} else { 
    wp_redirect(site_url()); // Redirect them to home page 
} 
} else { 
// Do nothing 
} 
} 
?> 
<div id="login-container"> 
<h3>Membership Login</h3> 
<div class="ws-plugin--s2member-pro-login-widget"> 
    <form id="login" name="form" action="<?php echo esc_html(home_url()); ?>/login/" method="post"> 
     <div class="login-username"> 
      <label for="login-username">Username:</label> 
      <input id="username" type="text" placeholder="Username" name="username"> 
     </div> 
     <div class="login-pw"> 
      <label for="login-password">Password:</label> 
      <input id="password" type="password" placeholder="Password" name="password"> 
     </div> 
     <div class="lost-pw"> 
      <a href="<?php echo esc_html(site_url('/register')); ?>">signup now</a> | <a href="<?php echo esc_html(site_url('/resetpass')); ?>">forgot password?</a> 
     </div> 
     <div class="cust-remember-me"> 
      <label for "remember-me">Remember me</label><input id="remember-me" type="checkbox" name="rememberme"> 
     </div> 
     <div class="cust-login-submit"> 
      <input id="cust-submit-log" type="hidden" name="hidden-submit-log"> 
      <input id="submit" type="submit" name="submit-log" value="Submit"> 
     </div>   
    </form> 
</div> 

回答

1

你試過嗎?

<?php 
global $error; 
$referrer = $_GET['login']; 
if ($referrer == 'false'){ 
    echo '<div id="message" class="error"><p>'; 
    echo $error; 
    echo '</p></div>'; 
} else { 
} 
?> 

如果你不想使用的插件,你可以將它放置在你的functions.php使用以下。這是從這source

<?php 
/** 
* CLASS LIMIT LOGIN ATTEMPTS 
* Prevent Mass WordPress Login Attacks by setting locking the system when login fail. 
* To be added in functions.php or as an external file. 
*/ 
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 
     * <a href="/param">@param</a> 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 it: 
new Limit_Login_Attempts(); 
?> 
+0

我寧願使用插件,以防萬一我被鎖定,我的主機可以爲我解鎖我的IP,但是謝謝,這似乎是我的其他網站的一個很好的解決方案。 – rolu

+0

@rolu我提供了另一種解決方案 –

0

我已經想出瞭解決方案。這是插件設置中的一個問題。現在所有人都在工作。

+1

@JeffreyBosboom:如果只是LQ,我不會報告這個。問題在於它沒有解釋問題是什麼,所以不可能對未來的讀者有用 - 這是關鍵指標。因此NAA(IMO)。 – halfer

+0

@halfer在重新考慮之後,我認爲你是對的。感謝您的跟蹤。我怪最近在Meta上的「不要刪除非垃圾」帖子讓我處於保持優先的心態。 –

+0

謝謝@Jeffrey,沒有probs!是的,我認爲我看到了 - 肯定存在灰色區域(如果你可以擴展這個答案,這將是最有用的 - 謝謝,我很欣賞它是相當古老的)。 – halfer