web-dev-qa-db-ja.com

Ajaxを使ったWordpressのカスタムログインフォーム

説明: カスタムログインフォームを作成したい。これは私が持っているコードです:

問題: /wp-admin/admin-ajax.php 503 ()

試したこと: 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. 何がおかしいのですか? error_logにエラーはありません。
  2. これで安全ですか?そうでない場合は、安全にするために何ができますか。

ありがとうございます。

1
odedta

いくつかの問題を確認できますが、問題を完全に解決する保証はありません-WP_DEBUGおよびWP_DEBUG_LOGwp-config.phptrueとして定義されていることを確認できますか-実行時のエラーはwp-content/debug.logに表示されます。

  1. リクエストをチェックする条件として! isset( $_POST )がありますが、これはalways be falseになります。これは$_POSTスーパーグローバルが常に設定されているためです。 POSTされたデータ。代わりに、$_SERVER['REQUEST_METHOD'] !== 'POST'を使用してください
  2. wp_setcookie呼び出しの必要性が見当たりません。この関数は非推奨であり、wp_set_auth_cookieのラッパーであり、wp_signonによって呼び出され処理されます。
  3. サーバー側にリダイレクト(PHP経由)を送信すると、AJAXクライアント(ブラウザー)はサイレントにリダイレクトを追跡し、コールバック(この場合はホームページ)に対するリダイレクトの応答を返します。 HTML)。 JSONを返送し、JavaScriptにクライアント側のリダイレクトを行うように指示することをお勧めします(例:window.location = responseData.redirectUrl
1
TheDeadMedic