我想以三种不同的形式使用一个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?
最合适的回答,由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\' );