错误在下面
POST http://localhost/...../wp-admin/admin-ajax.php 400 (Bad Request)
send @ load-scripts.php?c=1…e,utils&ver=4.9.8:4 ajax @ load-scripts.php?c=1…e,utils&ver=4.9.8:4 (anonymous) @ my-ajax-handler.js?ver=0.1.0:24 i @ load-scripts.php?c=1…e,utils&ver=4.9.8:2 fireWith @ load-scripts.php?c=1…e,utils&ver=4.9.8:2 ready @ load-scripts.php?c=1…e,utils&ver=4.9.8:2
K @ load-scripts.php?c=1…e,utils&ver=4.9.8:2
$.ajax({
type: "POST",
url : my_ajax_handler_var.ajaxurl,
data : {
action: 'rc_generate_pa'// "wp_ajax_*" action hook
},
contentType: "application/json; charset=utf-8",
dataType: "json"
,success:function(data) {
//This outputs the result of the ajax request
var pass = JSON.parse( data );
$('#p').val(data);
alert( JSON.parse(data));
},
error: function(errorThrown){
console.log(errorThrown);
}
})
// .done( function( response ) {
// var pass = response;
// $('#p').val(pass);
// })
.fail( function() {
console.log("failed");
});
用于排队脚本和处理请求的PHP代码
add_action('admin_enqueue_scripts', 'enqueue_st_page_scripts');
function enqueue_st_page_scripts() {
wp_register_script('my-ajax-handler', $plugin_url .'js/my-ajax-handler.js', array('jquery'), '0.1.0', true );
wp_enqueue_script(array('my-ajax-handler'));
$vars = array('ajaxurl' => admin_url('admin-ajax.php'));
wp_localize_script('my-ajax-handler', 'my_ajax_handler_var', $vars);
}
add_action( 'wp_ajax_rc_generate_pa', 'rc_generate_p' );
function rc_generate_p(){
$pass = (string)wp_generate_password(8, true, false);
echo $pass;
header('Content-Type: application/json');
$results = json_encode($pass);
echo $results;
exit;
}
我在此站点上看到了类似的问题,并尝试了解决方案,但没有成功。我是WordPress插件开发的新手。
答案 0 :(得分:0)
问题出在$.ajax()
调用中,您应该不将contentType
设置为JSON:
$.ajax({
url: my_ajax_handler_var.ajaxurl,
contentType: "application/json; charset=utf-8",
...
});
因为那样(从PHP端),该操作(即rc_generate_pa
)在$_REQUEST['action']
中不可用,WordPress使用该操作来确定被调用的AJAX操作,以及该操作未知时,WordPress会引发400 Bad Request
错误。
要解决该错误,只需删除contentType
属性:(或使用JSON类型以外的其他内容)
$.ajax({
url: my_ajax_handler_var.ajaxurl,
// Don't set contentType
...
});
在$.ajax()
的{{1}}回调中,请勿使用success
;这就是为什么:
当JSON.parse( data )
为dataType
时,jQuery将自动将响应输出解析为JSON对象-或者也可以是 string ;参见下面的第二点。
在(PHP)json
函数中,rc_generate_p()
既不是$pass
也不是array
/ object
;因此,在class
的{{1}}回调中,$.ajax()
实际上是无效的JSON字符串,并且success
将引发JavaScript语法错误。 / p>
因此,您的data
的{{1}}可以重写为:
JSON.parse( data )
在您的$.ajax()
函数中,删除success
,否则会出现JavaScript语法错误-您的AJAX调用需要JSON响应,但是success: function(data){
$('#p').val(data);
console.log(typeof data); // test
})
部分使JSON。
我知道您可能已经添加了它来调试rc_generate_p()
错误;但我想我应该提醒您有关删除它的信息..:)
您可能需要考虑像这样使用wp_send_json()
,而无需致电echo $pass;
,echo
或wp_die()
:
400