web-dev-qa-db-fra.com

Formulaire de connexion personnalisé Wordpress avec Ajax

Description: Je voudrais créer un formulaire de connexion personnalisé: nom d'utilisateur, mot de passe et champ de rappel. C'est le code que j'ai:

Problème: /wp-admin/admin-ajax.php 503 ()

Ce que j'ai essayé: PHP:

function normal_login() {
    if( !isset( $_POST ) ) {
        return ;
    }

    $username =  $_POST[ 'username' ];
    $password =  $_POST[ 'pass' ];
    $remember_me = 'on' == $_POST[ 'remember_me' ] ? true : false;

    $credentials = array(
        'user_login'    => $username,
        'user_password' => $password,
        'remember'      => $remember_me
    );

    $user = wp_signon( $credentials, false );

    if ( is_wp_error($user) ) {
        echo $user->get_error_message();
    }
    else {
        if ( !$remember_me ) {
            wp_setcookie( $username, $password, false, '', '', $remember_me );
        }
        wp_redirect( '/' );
    }
    wp_die();
}
add_action( 'wp_ajax_normal_login','normal_login' );
add_action( 'wp_ajax_nopriv_normal_login','normal_login' );

JS:

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

    $( '#login-form button[type="submit"]' ).on( 'click', function( e ) {
        e.preventDefault();
        var username = $( '#form-field-email-login' ).val();
        var pass = $( '#form-field-password' ).val();
        var remember_me = $( '#form-field-remember_me' ).is( ':checked' );
        $.ajax( {
            url: MY_AJAX_OBJ.MY_AJAX_URL,
            type: 'post',
            data: {
                'action': 'normal_login',
                'username': username,
                'pass': pass,
                'remember_me': remember_me,
            },
            success: function( response ) {
                console.log( response );
            },
            error: function( textStatus ) {
                console.log( textStatus );
            }
        } );
    } );

} );
  1. Qu'est-ce que je fais mal? aucune erreur dans error_log.
  2. Ce chemin est-il sécurisé? sinon, que puis-je faire pour le sécuriser?.

Merci!

1
odedta

Quelques problèmes que je vois mais que rien ne garantit que cela résoudra entièrement le (s) problème (s) - pouvez-vous vous assurer que WP_DEBUG et WP_DEBUG_LOG sont définis comme étant true dans votre wp-config.php - toutes les erreurs survenues pendant l'exécution devraient ensuite apparaître dans wp-content/debug.log.

  1. ! isset( $_POST ) est conditionnel à la vérification de la demande, mais ceci toujours sera false car le $_POST superglobal est toujours défini - il est simplement vide à moins qu'il y ait des données POST '. Utilisez plutôt $_SERVER['REQUEST_METHOD'] !== 'POST'
  2. Je ne vois aucune nécessité pour l'appel wp_setcookie. La fonction est obsolète et n’est qu’un wrapper pour wp_set_auth_cookie, qui est appelé & manipulé par wp_signon de toute façon.
  3. Si vous envoyez une redirection côté serveur (c'est-à-dire via PHP), le client AJAX (votre navigateur) suivra en silence la redirection, puis renverra la réponse de cette redirection pour votre rappel (dans votre cas, la page d'accueil HTML). Vous feriez mieux de renvoyer JSON et de demander à votre JavaScript de faire la redirection côté client (par exemple, window.location = responseData.redirectUrl).
1
TheDeadMedic