在三个不同的随机数字段中使用单个随机数

时间:2019-06-17 作者:Zahid Hossain

我想以三种不同的形式使用一个nonce(登录、注册、丢失密码)。但我不知道如何在wp\\u localize\\u脚本($handle,$object\\u name,array())中使用nonce。在这里$handle参数中,我将使用外部js文件处理程序,在该文件中,我将为三个不同的表单(登录、注册、丢失密码)编写代码,并为每个表单使用三个不同的nonce。

这是我的代码:

1 - three separate html file (login-form.php, register-form.php and lostpassword-form.php)

<form id="login" action="login" method="post">
    <?php wp_nonce_field( \'ajax-login-nonce\', \'login_nonce_token\' ); ?>
</form>
<form id="register" action="register" method="post">
    <?php wp_nonce_field( \'ajax-login-nonce\', \'register_nonce_token\' ); ?>
</form>
<form id="lostpassword" action="lostpassword" method="post">
    <?php wp_nonce_field( \'ajax-login-nonce\', \'lostpassword_nonce_token\' ); ?>
</form>

2 - in my scripts.js file

jQuery(document).ready(function($){
    // login
    $(\'form#login\').on(\'submit\', function(e){
        $.ajax({
            type: \'POST\',
            dataType: \'json\',
            url: ajax_login_object.ajax_url,
            data: {
                \'action\': \'ajaxlogin\', // wp_ajax_nopriv_ajaxlogin
                \'login_nonce_token\': ajax_login_object.nonce, // wp_localize_script()
        });
    });

// register
$(\'form#register\').on(\'submit\', function(e){
    $.ajax({
        type: \'POST\',
        dataType: \'json\',
        url: ajax_login_object.ajax_url,
        data: {
            \'action\': \'ajaxregister\', // wp_ajax_nopriv_ajaxregister
            \'register_nonce_token\': ajax_login_object.nonce, // wp_localize_script()
    });
});

// register
$(\'form#register\').on(\'submit\', function(e){
    $.ajax({
        type: \'POST\',
        dataType: \'json\',
        url: ajax_login_object.ajax_url,
        data: {
            \'action\': \'ajaxlostpassword\', // wp_ajax_nopriv_ajaxlostpassword
            \'lostpassword_nonce_token\': ajax_login_object.nonce, // wp_localize_script()
    });
});
});

3 - and my class-wp-ajax-popup files code

public function __construct() {
    add_action( \'init\', array( $this, \'ajax_login_modal_init\' ) );
}

public function ajax_login_modal_init() {
    if ( ! is_admin() || is_customize_preview() ) {
        wp_register_script( \'ajax-login-script\', get_parent_theme_file_uri( \'admin/assets/js/scripts.js\' ), array( \'jquery\' ), filemtime( get_parent_theme_file_path( \'admin/assets/js/scripts.js\' ) ) );
        wp_enqueue_script( \'ajax-login-script\' );
    }

    wp_localize_script( \'ajax-login-script\', \'ajax_login_object\', array(
        \'ajax_url\' => admin_url( \'admin-ajax.php\' ),
        // HOW TO USE NONCE HERE. I write this way, is it right?
        \'nonce\'    => wp_create_nonce(\'ajax_new_none\')
    ) );

    add_action( \'wp_ajax_nopriv_ajaxlogin\', array( $this, \'ajax_login_jquery_callback\' ) );
    add_action( \'wp_ajax_nopriv_ajaxregister\', array( $this, \'ajax_register_jquery_callback\' ) );
    add_action( \'wp_ajax_nopriv_ajaxlostpassword\', array( $this, \'ajax_lost_password_jquery_callback\' ) );
}

public function ajax_login_jquery_callback() {
    check_ajax_referer( \'ajax_new_none\', \'login_nonce_token\' );
}

public function ajax_register_jquery_callback() {
    check_ajax_referer( \'ajax_new_none\', \'register_nonce_token\' );
}

public function ajax_lost_password_jquery_callback() {
    check_ajax_referer( \'ajax_new_none\', \'lostpassword_nonce_token\' );
}
我根据codex和其他在线文档编写此代码。

我的问题是-how i\'ll use nonce in wp_localize_script and in scripts.js file? Is all my code correct?

1 个回复
最合适的回答,由SO网友:Jacob Peattie 整理而成

可以使用传递多个noncewp_localize_script() 将它们作为单独的属性包含在ajax_login_object 对象

wp_localize_script( \'ajax-login-script\', \'ajax_login_object\', array(
        \'ajax_url\'                 => admin_url( \'admin-ajax.php\' ),
        \'login_nonce_token\'        => wp_create_nonce( \'login_nonce\' ),
        \'register_nonce_token\'     => wp_create_nonce( \'register_nonce\' ),
        \'lostpassword_nonce_token\' => wp_create_nonce( \'lostpassword_nonce\' ),
) );
然后在JS中,使用localize对象中的正确值作为每个请求的值,并使用相同的值_ajax_nonce 字段名称的名称。

data: {
    \'action\': \'ajaxlogin\',
    \'_ajax_nonce\': ajax_login_object.login_nonce_token,
}

data: {
    \'action\': \'ajaxregister\',
    \'_ajax_nonce\': ajax_login_object.register_nonce_token,
}

data: {
    \'action\': \'ajaxlostpassword\',
    \'_ajax_nonce\': ajax_login_object.lostpassword_nonce_token,
}
然后在AJAX处理程序中,使用创建它们时给它们的名称wp_create_nonce() 对于第一个参数,字段名作为第二个参数:

check_ajax_referer( \'login_nonce\', \'_ajax_nonce\' );

check_ajax_referer( \'register_nonce\', \'_ajax_nonce\' );

check_ajax_referer( \'lostpassword_nonce\', \'_ajax_nonce\' );
第二个参数需要是我们在JavaScript中使用的字段名,即_ajax_nonce, 但这是默认值(这就是我们使用它的原因),因此如果需要,我们可以省略它:

check_ajax_referer( \'login_nonce\' );

check_ajax_referer( \'register_nonce\' );

check_ajax_referer( \'lostpassword_nonce\' );