it-swarm.com.de

Benutzerdefiniertes Wordpress-Anmeldeformular mit Ajax

Beschreibung: Ich möchte ein benutzerdefiniertes Anmeldeformular erstellen: Benutzername, Passwort und Erinnerungsfeld. Dies ist der Code, den ich habe:

Problem: /wp-admin/admin-ajax.php 503 ()

Was ich versucht habe: 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. Was mache ich falsch? Keine Fehler im error_log.
  2. Ist dieser Weg sicher? Wenn nicht, was kann ich tun, um es sicher zu machen?.

Vielen Dank!

1
odedta

Einige Probleme, die ich sehen kann, aber keine Garantie, dass sie das Problem vollständig beheben. Können Sie sicherstellen, dass WP_DEBUG und WP_DEBUG_LOG in Ihrem wp-config.php als truedefiniert sind? Alle Fehler während der Laufzeit sollten dann in wp-content/debug.log erscheinen.

  1. Sie haben ! isset( $_POST ) als Bedingung, um die Anforderung zu prüfen, aber dies wird immer falsesein, da der $_POST superglobal immer gesetzt ist - er ist nur leer, sofern keine POST-Daten vorliegen. Verwenden Sie stattdessen $_SERVER['REQUEST_METHOD'] !== 'POST'
  2. Ich kann keine Notwendigkeit für den wp_setcookie-Aufruf erkennen. Die Funktion ist veraltet und ist nur ein Wrapper für wp_set_auth_cookie, der ohnehin von wp_signon aufgerufen und gehandhabt wird.
  3. Wenn Sie eine Weiterleitung serverseitig senden (dh über PHP), folgt der Client AJAX (Ihr Browser) der Weiterleitung stillschweigend und gibt die Antwort dieser Weiterleitung für Ihren Rückruf zurück (in Ihrem Fall die Homepage) HTML). Senden Sie besser JSON zurück und weisen Sie Ihr JavaScript an, die clientseitige Weiterleitung durchzuführen (z. B. window.location = responseData.redirectUrl).
1
TheDeadMedic