You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 07:53:33