我编写了一个类来使用ajax。我最初使用check_admin_referer
(英寸hello()
) 没有参数,但得到以下警告:“PHP注意:check\\u admin\\u referer被调用incorrectly. 您应该使用第一个参数指定要验证的nonce操作。“”
所以我去了抄本,试着按照example. 但是,检查失败。我现在得到一个403
.
这是我的班级:
class StupidClass {
private $settings_page;
// scripts,
public function __construct(){
add_action(\'admin_menu\', array($this, \'add_menu\'));
add_action(\'admin_enqueue_scripts\', array($this, \'load_scripts\'));
add_action(\'wp_ajax_hello\', array($this, \'hello\'));
}
// setup
public function add_menu(){
$this->settings_page = add_menu_page( \'Menu item\', \'settings page\', \'edit_pages\', \'settingspage\', array($this, \'render_page\'), false, 62 );
}
public function load_scripts($hook){
if ($this->settings_page !== $hook) {
return;
}
$path = plugin_dir_url( __FILE__ ) . \'stupid.js\';
wp_enqueue_script( \'stupid_js\', $path, array(\'jquery\'));
}
// view
public function render_page(){
?>
<h1>This is the title</h1>
<form action="" id="stupid_form" method="post">
<?php wp_nonce_field(\'hello\', \'token\'); ?>
<input type="submit" value="hit me">
</form>
<div id="response"></div>
<?php
}
public function hello(){
check_admin_referer(\'hello\', \'token\');
wp_die();
}
}
我能想到的唯一原因是,操作名称不正确,因为我没有指向实例方法,但我对PHP和WP是新手,我的Google foo让我失望。
我做错了什么。我如何获得check_admin_referer()
要通过吗?
Update
以下是JS:
jQuery(document).ready(function($){
data = {
action: \'hello\'
}
$(\'#stupid_form\').submit(function(){
$.post(ajaxurl, data, function(response){
$(\'#response\').html(response);
});
return false;
});
});
最合适的回答,由SO网友:Sally CJ 整理而成
在JS脚本中,将nonce包含在data
, 如下例所示:
jQuery(document).ready(function($){
data = {
action: \'hello\',
token: $( \'#token\' ).val()
}
$(\'#stupid_form\').submit(function(){
$.post(ajaxurl, data, function(response){
$(\'#response\').html(response);
});
return false;
});
});
Additional Note
<?php wp_nonce_field(\'hello\', \'token\'); ?>
生成隐藏的
input
标记类似于:
<input type="hidden" id="token" name="token" value="d9e3867a0e" />
即,临时名称成为
name
以及
id
的
input
.
这就解释了token: $( \'#token\' ).val()
在我提供的代码中,格式为NONCE_NAME: $( \'#NONCE_NAME\' ).val()
.
但是,您也可以针对name
像这样:token: $( \'input[name="token"]\' ).val()