WordPress后台自定义文章创建时Ajax POST请求失败排查
解决WordPress Admin-Ajax POST请求返回0/400且$_REQUEST为空的问题
这问题我碰到过好多次了,核心原因是你设置了contentType: "application/json",但WordPress的admin-ajax.php默认不处理JSON格式的请求——它期望的是标准的表单编码数据(application/x-www-form-urlencoded),这才是$_REQUEST能自动识别的格式。加上action参数没被正确解析到,直接触发了400错误或者返回0。
下面给你两种解决方案,优先推荐第一种,因为它完全符合WordPress的Ajax规范:
方案1:使用默认表单编码(推荐)
直接去掉contentType配置(jQuery默认就是表单编码),这样数据会被自动解析,$_REQUEST就能拿到所有参数了。
修改后的JS代码:
$.ajax({ url: ajaxUrl, type: 'POST', data: { action: "gMapsLatLong", adresse: adresse, adresse2: adresse2, code_postal: code_postal, ville: ville }, // 移除contentType,用jQuery默认的application/x-www-form-urlencoded dataType: 'json', // 根据你的需求设置,比如html或json success: function(response) { // 处理成功响应 console.log('获取经纬度成功:', response); }, error: function(xhr, status, error) { // 调试错误信息 console.error('请求失败:', xhr.responseText, status, error); } });
对应的PHP处理代码(放到主题的functions.php或自定义插件里):
// 后台用户请求的钩子 add_action('wp_ajax_gMapsLatLong', 'handle_gmaps_latlong_request'); // 如果前端未登录用户也需要调用,加上这个钩子 // add_action('wp_ajax_nopriv_gMapsLatLong', 'handle_gmaps_latlong_request'); function handle_gmaps_latlong_request() { // 安全获取并 sanitize 参数 $adresse = isset($_REQUEST['adresse']) ? sanitize_text_field($_REQUEST['adresse']) : ''; $adresse2 = isset($_REQUEST['adresse2']) ? sanitize_text_field($_REQUEST['adresse2']) : ''; $code_postal = isset($_REQUEST['code_postal']) ? sanitize_text_field($_REQUEST['code_postal']) : ''; $ville = isset($_REQUEST['ville']) ? sanitize_text_field($_REQUEST['ville']) : ''; // 这里写你的业务逻辑,比如调用谷歌地图API获取经纬度 // $latlng = get_gmaps_latlong($adresse, $adresse2, $code_postal, $ville); // 返回成功响应,wp_send_json系列函数会自动die,避免多余输出 wp_send_json_success([ 'lat' => '48.8566', // 示例纬度 'lng' => '2.3522' // 示例经度 ]); // 如果请求失败,用这个返回 // wp_send_json_error(['message' => '无法获取经纬度,请检查地址']); }
方案2:坚持使用JSON格式(不推荐,除非特殊需求)
如果你因为某些原因必须用JSON传递数据,那需要手动在PHP里解析请求体,因为$_REQUEST不会自动处理JSON数据。
修改后的JS代码:
$.ajax({ url: ajaxUrl, type: 'POST', data: JSON.stringify({ action: "gMapsLatLong", adresse: adresse, adresse2: adresse2, code_postal: code_postal, ville: ville }), contentType: "application/json; charset=utf-8", dataType: 'json', success: function(response) { console.log('获取经纬度成功:', response); }, error: function(xhr, status, error) { console.error('请求失败:', xhr.responseText, status, error); } });
对应的PHP处理代码:
add_action('wp_ajax_gMapsLatLong', 'handle_gmaps_latlong_json_request'); // add_action('wp_ajax_nopriv_gMapsLatLong', 'handle_gmaps_latlong_json_request'); function handle_gmaps_latlong_json_request() { // 手动读取JSON请求体 $raw_json = file_get_contents('php://input'); $request_data = json_decode($raw_json, true); // 检查JSON解析是否有效 if (json_last_error() !== JSON_ERROR_NONE) { wp_send_json_error(['message' => '无效的JSON数据']); } // 获取并 sanitize 参数 $adresse = isset($request_data['adresse']) ? sanitize_text_field($request_data['adresse']) : ''; $adresse2 = isset($request_data['adresse2']) ? sanitize_text_field($request_data['adresse2']) : ''; $code_postal = isset($request_data['code_postal']) ? sanitize_text_field($request_data['code_postal']) : ''; $ville = isset($request_data['ville']) ? sanitize_text_field($request_data['ville']) : ''; // 业务逻辑... wp_send_json_success([ 'lat' => '48.8566', 'lng' => '2.3522' ]); }
额外注意事项
- 确保
ajaxUrl是正确的:后台可以通过admin_url('admin-ajax.php')获取,前端需要用wp_localize_script把这个URL传递到JS里,不要硬写。 - 必须添加
wp_ajax_{action}钩子:这是admin-ajax.php识别请求的核心,没加的话肯定会返回0。 - 处理完逻辑后一定要用
wp_send_json_success或wp_send_json_error:这些函数会自动设置正确的响应头并终止脚本,避免后续输出导致响应格式错误。
内容的提问来源于stack exchange,提问作者zareb Northman
相关产品推荐
相关产品推荐

