Crearea unui formular personalizat de login folosind AJAX

13 nov. 2013, 22:08:11
Vizualizări: 18K
Voturi: 2

Încerc să folosesc acest tutorial WordPress AJAX Login Without a Plugin – The Right Way de Natko Hasic pentru a construi formulare de login, înregistrare și resetare parolă care gestionează totul, inclusiv mesajele de eroare, prin AJAX. Diferențele între tutorial și proiectul meu sunt... Nu vreau să le fac într-un popup și implementez într-un plugin nu în folderul rădăcină al temei.

Iată ce cod am deocamdată...

Codul din template-ul paginii:

<form name="login_form" id="login_form" class="login_form" action="" method="post">
    <p class="status"></p>

    <p>
        <input type="text" name="username" id="username" placeholder="Nume utilizator" />
    </p>

    <p>
        <input type="password" name="password" id="password" placeholder="Parolă" />
    </p>

    <button name="submit" id="submit" class="btn"><?php _e("Autentificare", "shorti"); ?></button>
    <a class="lost" href="<?php echo wp_lostpassword_url(); ?>">Ți-ai uitat parola?</a>

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

</form>

Codul din fișierul principal al plugin-ului meu .php:

<?php // Scriptul PHP pe care încerc să-l rulez

    add_action( 'init', 'ajax_login_init' );
    function ajax_login_init() {

        wp_register_script( 'ajax-login-script', plugin_dir_url( __FILE__ ) . 'js/ajax-login-script.js', array('jquery') );
        wp_enqueue_script( 'ajax-login-script' );

        wp_localize_script( 'ajax-login-script', 'ajax_login_object', array(
            'ajaxurl' => admin_url( 'admin-ajax.php' ),
            'redirecturl' => home_url(),
            'loadingmessage' => __( 'Trimitere informații utilizator, te rugăm să aștepți...' )
        ));

        // Permite utilizatorilor fără privilegii să ruleze ajax_login() prin AJAX
        add_action( 'wp_ajax_nopriv_ajaxlogin', 'ajax_login' );
    }

    // Verifică dacă informațiile introduse de utilizator sunt valide
    function ajax_login() {
        // Verifică mai întâi nonce-ul, dacă eșuează funcția se oprește
        check_ajax_referer( 'ajax-login-nonce', 'security' );

    // Nonce verificat, preia datele POST și autentifică utilizatorul
    $info = array();
        $info['user_login'] = $_POST['username'];
        $info['user_password'] = $_POST['password'];
        $info['remember'] = true;

    $user_signon = wp_signon( $info, false );
    if ( is_wp_error( $user_signon )) {
        echo json_encode( array( 'loggedin'=>false, 'message'=>__( 'Nume utilizator sau parolă greșită!' )));
    } else {
        echo json_encode( array( 'loggedin'=>true, 'message'=>__('Autentificare reușită, redirecționare...' )));
    }

    die();
}

Conținutul fișierului meu ajax-login-script.js:

jQuery(document).ready(function($){

    // Execută login AJAX la trimiterea formularului
    $('form#login_form').on('#submit', function(e){
        $('form#login_form p.status').show().text(ajax_login_object.loadingmessage);
        $.ajax({
            type: 'POST',
            dataType: 'json',
            url: ajax_login_object.ajaxurl,
            data: { 
                'action': 'ajaxlogin', //apelează wp_ajax_nopriv_ajaxlogin
                'username': $('form#login_form #username').val(), 
                'password': $('form#login_form #password').val(), 
                'security': $('form#login_form #security').val() },
            success: function(data){
                $('form#login_form p.status').text(data.message);
                if (data.loggedin == true){
                    document.location.href = ajax_login_object.redirecturl;
                }
            }
        });
        e.preventDefault();
    });
});

Nu sunt deloc familiarizat cu AJAX sau JS, așa că orice lumină pe care o puteți arunca asupra acestei probleme este foarte apreciată!

6
Comentarii

Deci ce anume nu funcționează?

eskimo eskimo
13 nov. 2013 23:26:39

@eskimo: Dacă trimit formularul cu câmpuri goale sau date invalide, pagina doar se reîncarcă, iar dacă introduc date corecte, tot se reîncarcă pagina afișând în continuare formularul de login în loc de informațiile reale ale paginii. Cum am spus, aceasta este practic prima mea încercare de a lucra cu JS/AJAX... așa că nu am nici cea mai vagă idee unde să încep să caut pentru a schimba lucrurile. Mulțumesc

Designer 17 Designer 17
14 nov. 2013 00:01:41

Nu am citit întreg tutorialul, dar primul lucru pe care l-am observat este că acțiunea formularului tău este goală (action="") iar în tutorial ei definesc action="login". Mi se pare că acesta este un lucru crucial de remediat.

eskimo eskimo
14 nov. 2013 00:50:51

@eskimo: da, am pus-o acolo dar când am folosit formularul mă redirecționa către pagina curentă cu extensia /login care returna o eroare de pagină 404. Nu sunt sigur dacă asta ar putea fi considerat progres sau nu :P

Designer 17 Designer 17
14 nov. 2013 01:00:02

Eroarea 404 e normală deoarece pagina login nu există. Nu ar trebui să meargă pe acea pagină ci să trimită formularul. Am prins o altă eroare, care e crucială de asemenea. În ajax-login-script.js ai $('form#login_form').on('#submit', function(e). Elimină '#' înainte de submit. Și asigură-te că action="login" este încă setat în codul formularului.

eskimo eskimo
14 nov. 2013 11:30:15

@eskimo: M-am întors în final la această parte a proiectului și am schimbat ce ai indicat și acum funcționează perfect! Îți mulțumesc foarte mult!!! :)

Designer 17 Designer 17
15 dec. 2013 00:26:15
Arată celelalte 1 comentarii
Toate răspunsurile la întrebare 1
1

Mulțumesc lui @eskimo că am reușit să fac asta să funcționeze și am decis să împărtășesc un răspuns pentru cei care încearcă să facă același lucru!

În fișierul ajax-login-script.js tot ce a trebuit să fac a fost să schimb asta $('form#login_form').on('#submit', function(e) în asta ... $('form#login_form').on('submit', function(e) doar eliminând # înainte de a apela submit.

Sper că acest lucru ajută pe cineva!

27 ian. 2014 02:17:21
Comentarii

Aceasta informație a fost utilă, mulțumesc pentru share.

Hexodus Hexodus
13 aug. 2014 18:46:28