2017-01-18 21 views
1

私はwordpressのログインajaxフォームを開発しようとしています。プラグインが正常に動作しているようだ。正しいユーザー名とパスワードを入力するとログインが正しく機能し、正しいメッセージが表示され、正しいページにリダイレクトされますが、ユーザー名とパスワードの値が正しくない場合、エラーメッセージは表示されません。Wordpress Ajaxログインエラーメッセージ

関数is_wp_errorがエラーをエコーし​​ないようです。

理由はありますか?私のコードの下に

ありがとうございました。

PHP

function ajax_login_init(){ 
wp_enqueue_script('ajax-login', get_template_directory_uri() . '/js/jquery.ajax.login.js', array('jquery') , $ver , true); 
wp_localize_script('ajax-login', 'loginajax', array('ajaxurl' => admin_url('admin-ajax.php'),)); 
// Enable the user with no privileges to run ajax_login() in AJAX 
add_action('wp_ajax_nopriv_met_login_member', 'met_login_member'); 
} 

if (!is_user_logged_in()) { 
add_action('init', 'ajax_login_init'); 

} 

function met_login_member() { 
    $user_login  = $_POST['met_user_login']; 
    $user_pass  = $_POST['met_user_pass']; 

    if(!check_ajax_referer('ajax-login-nonce', 'login-security', false)) { 
     echo json_encode(array('error' => true, 'message'=> '<div class="alert alert-danger">'.__('Session token has expired, please reload the page and try again', 'met').'</div>')); 
    } 

    else if(empty($user_login) || empty($user_pass)){ 
     echo json_encode(array('error' => true, 'message'=> '<div class="alert alert-danger">'.__('Please fill all form fields', 'met').'</div>')); 
    } else { // Now we can insert this account 

     $creds = array(); 
     $creds['user_login'] = $user_login; 
     $creds['user_password'] = $user_pass; 
     $creds['remember'] = true; 
     $user = wp_signon($creds, false); 

     if(is_wp_error($user)) { 
      echo json_encode(array('error' => true, 'message'=> '<div class="alert alert-danger">'.$user->get_error_message().'</div>')); 
     } else { 
      echo json_encode(array('error' => false, 'message'=> '<div class="alert alert-success">'.__('Login successful, reloading page...', 'met').'</div>')); 
     } 
    } 

    die(); 
} 

HTML

<div class="user-modal"> 

     <div class="user-modal-container"> 

      <ul class="switcher"> 

       <li><span><?php _e('Sign in', 'met'); ?></span></li> 

       <li><span><?php _e('New Account', 'met'); ?></span></li> 

      </ul> 

      <div class="modal-login"> 

       <form id="login-form" class="modal-form" action="<?php echo home_url('/'); ?>" method="post" /> 

        <p class="fieldset"> 

         <label class="image-replace email" for="signin-email"><?php _e('Username', 'met'); ?></label> 

         <input id="user-login" class="full-width has-padding has-border" type="text" name="met_user_login" placeholder="<?php _e('Username', 'met'); ?>" value="" size="20" tabindex="10" required /> 

        </p> 

        <p class="fieldset"> 

         <label class="image-replace password" for="signin-password"><?php _e('Password', 'met'); ?></label> 

         <input id="user-pass" class="full-width has-padding has-border" type="password" name="met_user_pass" placeholder="<?php _e('Password', 'met'); ?>" value="" size="20" tabindex="20" required /> 

         <span class="show-password"><?php _e('Show', 'met'); ?></span> 

        </p> 

        <p class="fieldset"> 

         <label class="checkbox" for="rememberme"> 

          <input name="rememberme" type="checkbox" id="rememberme" value="forever" tabindex="90"><?php _e('Remember me', 'met'); ?> 

         </label> 

        </p> 

        <p class="fieldset"> 

         <button id="wp-submit" class="full-width" data-loading-text="<?php _e('Loading...', 'met') ?>" type="submit"><?php _e('Sign In', 'met'); ?></button> 

         <input type="hidden" name="action" value="met_login_member" /> 

        </p> 

        <?php wp_nonce_field('ajax-login-nonce', 'login-security'); ?> 

       </form> 

       <div class="errors"></div> 

       <p class="modal-form-bottom-message"><span><?php _e('Lost your password?', 'met'); ?></span></p> 

      </div> 

    </div> 
</div> 

JS

$('button').on('click', function(e) { 

    e.preventDefault(); 

    $.post(loginajax.ajaxurl, $('#login-form').serialize(), function(data) { 

     var obj = $.parseJSON(data); 

     $('.modal-login .errors').html(obj.message); 

     if(obj.error === false) { 
      window.location.reload(true); 
     } else if(obj.error === true) { 
      $('.alert-danger').delay(2000).fadeOut('slow',function(){$(this).hide();}); 
     } 


    }); 

}); 
+0

各メッセージをエコーし​​た後にdie()関数を配置しようとしましたか? - 私はあなたの機能を少し精巧にしました。答えをチェックして、問題があれば教えてください。 –

答えて

0

あなたが正しい方向に向かっているようです。いくつかのギャップを埋めるためにコードにいくつか変更を加えました。機密データをWordPressに送信する際には、$POSTから収集したすべてのデータをサニタイズすることを強くお勧めします。

また、ユーザー名または電子メールの存在を簡単に確認して、収集した認証情報を検証しています。確認が正常であれば、ログイン成功時にユーザーを認証するために必要なユーザーデータを定義します/wp-admin/に直接アクセスする場合は、管理ダッシュボードにもログインする必要があります。これは、古い認証クッキーをすべて消去して、現在のユーザーに新しいクッキーを設定することで行います。

ここでは何も新しいことはありませんが、WordPressでAjaxを使用してユーザーを認証する際に、これらの手順が最も一般的な問題を軽減することが証明されています。

私はこの関数をテストしましたが、それはis_wp_error()によってスローされたエラーメッセージに問題はないようです。さらに、最も一般的なエラーメッセージをキャッチしてそれらをカスタマイズするためのオプションの簡単な方法を追加しました。私はそれがあなたと一緒に前進することを願っています!

function met_login_member() { 

// First check the nonce, if it fails the function will break 
if(!check_ajax_referer('ajax-login-nonce', 'login-security')) { 

    echo json_encode(array('error' => true, 'message'=> '<div class="alert alert-danger">'.__('Session token has expired, please reload the page and try again', 'met').'</div>')); 

    die(); 

} 

// Nonce is checked, get the POST data and sign the user on 
$creds = array(); 
$creds['user_login'] = !empty($_POST['met_user_login']) ? sanitize_user(trim($_POST['met_user_login'])) : NULL; 
$creds['user_password'] = !empty($_POST['met_user_pass']) ? sanitize_text_field(trim($_POST['met_user_pass'])) : NULL; 
$creds['remember'] = true; 

// Pass login details through wp_signon() 
// wp_signon() accepts an optional boolean parameter false OR true, whether to use a secure cookie in case of running a website over SSL. 
$user_creds = wp_signon($creds, false); 

$user_login  = (string) sanitize_user($_POST['met_user_login']); 
$user_pass  = (string) sanitize_text_field(trim($_POST['met_user_pass'])); 

// ---- CHECK IF USERNAME OR EMAIL EXISTS ---- // 
if (username_exists($user_login)) { 

    $user_exists = (bool) true; 
    $user  = (object) get_user_by('login', $user_login); 

} elseif (email_exists($user_login)) { 

    $user_exists = (bool) true; 
    $user  = (object) get_user_by('email', $user_login); 

} else { 

    $error = new WP_Error('no_user_found', 'Username or Email was not found, please try again', 'Page Data'); 

    //echo json_encode(array('error' => true, 'message'=> '<div class="alert alert-danger">'.__('Username or Email was not found, please try again', 'met').'</div>')); 
    //die(); 

} // end else 

if ($user_exists === (bool) true) { 

    // Define user data 

    $user_id = $user->ID; 
    $user_data = get_userdata($user_id); 

    $username = $user_data->user_login; 
    $userpass = $user_data->user_pass; 

} 

// ---- CHECK FOR EMPTY/INCORRECT DATA ---- // 
if(empty($user_login) && empty($user_pass)){ 

    echo json_encode(array('error' => true, 'message'=> '<div class="alert alert-danger">'.__('The username and password cannot be empty', 'met').'</div>')); 
    die(); 

} elseif (is_wp_error($user_signon)) { 

    echo json_encode(array('error' => true, 'message'=> '<div class="alert alert-danger">'.$user_signon->get_error_message().'</div>')); 
    die(); 

    // Optionally catch & customize error messages 

    // $signon_errors = $user_creds->get_error_codes(); 

    // if (in_array('invalid_username', $signon_errors)) { 
    //  echo json_encode(array('error' => true, 'message'=> '<div class="alert alert-danger">'.__('Wrong username or email', 'met').'</div>')); 
    //  die();  

    // } elseif (in_array('empty_username', $signon_errors)) { 
    //  echo json_encode(array('error' => true, 'message'=> '<div class="alert alert-danger">'.__('The username or email cannot be empty', 'met').'</div>')); 
    //  die(); 

    // } elseif (in_array('empty_password', $signon_errors)) { 
    //  echo json_encode(array('error' => true, 'message'=> '<div class="alert alert-danger">'.__('The password field cannot be empty', 'met').'</div>')); 
    //  die(); 

    // } elseif (in_array('incorrect_password', $signon_errors)) { 
    //  echo json_encode(array('error' => true, 'message'=> '<div class="alert alert-danger">'.__('Wrong password', 'met').'</div>')); 
    //  die(); 

    // } else { 
    //  echo json_encode(array('error' => true, 'message'=> '<div class="alert alert-danger">'.__('Wrong username or password', 'met').'</div>')); 
    //  die(); 

    // } 

} else { 

    wp_clear_auth_cookie(); 
    wp_set_current_user($user_id, $username); 
    wp_set_auth_cookie($user_id); 

    echo json_encode(array('error' => false, 'message'=> '<div class="alert alert-success">'.__('Login successful, reloading page...', 'met').'</div>')); 

    die(); 

} 

    die(); 

}