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

WordPress自定义插件仅移动端报400 Bad Request错误求助

移动端WordPress AJAX 400 Bad Request问题排查与修复

核心问题分析

移动端返回400 Bad Request且PHP返回值为0,通常是WordPress AJAX请求未通过权限校验、参数解析错误或请求格式不兼容导致的,以下是具体修复步骤:


1. 修复非登录用户访问权限

WordPress默认的wp_ajax_{action}钩子仅对已登录用户生效,移动端用户大概率处于未登录状态,因此必须添加wp_ajax_nopriv_{action}钩子:

add_action( 'wp_ajax_receive_api_call', 'recieveAPICall' );
add_action( 'wp_ajax_nopriv_receive_api_call', 'recieveAPICall' ); // 新增:允许非登录用户请求

2. 修正PHP参数安全处理

直接使用$_POST["distance"]和$_POST["zip"]未做存在性检查,若移动端参数传递异常会触发PHP警告,导致请求终止。优化参数获取逻辑:

function recieveAPICall() { 
    // 安全获取并格式化参数
    $dist = isset($_POST["distance"]) ? intval($_POST["distance"]) : 25;
    $dist = min($dist, 50); // 简化距离限制逻辑
    
    $zip = isset($_POST["zip"]) ? sanitize_text_field($_POST["zip"]) : '';
    if(empty($zip)){
        echo json_encode(['error' => 'Zip code is required']);
        wp_die(); // 用wp_die()替代die,符合WordPress规范
    }
    
    $api_key_text = get_option('key_text');
    // 对URL参数编码,避免特殊字符破坏请求结构
    $api_url = sprintf(
        'http://some_url_i_am_using/endpoint?zip=%s&distance=%d',
        urlencode($zip),
        $dist
    );
    
    // 改用wp_remote_post,wp_safe_remote_post可能拦截HTTP协议请求
    $response = wp_remote_post($api_url, array(
        'headers' => array('X-API-Key' => $api_key_text)
    ));

    if (is_wp_error($response)) {
        echo json_encode(['error' => $response->get_error_message()]);
    } else {
        // 直接返回API原始响应体,避免双重JSON编码
        echo $response['body'];
    }
    wp_die();
}

3. 优化JavaScript请求逻辑

移动端对请求格式更敏感,移除不必要的参数并修正数据类型:

var zip = $("#ffl_zip").val().trim();
var dist = $("#ffl_distance").val();

// 修正距离参数为数字类型,避免字符串比较异常
dist = dist ? parseInt(dist, 10) : 25;
if(dist >= 50){
    dist = 50;
    $("#ffl_distance").val(50);
}

if(!zip){
    alert("Please enter a zip code to search.");
    return;
}

// 移除enctype参数:$.post默认使用application/x-www-form-urlencoded,无需强制指定multipart
var data = {
    "action":"receive_api_call", 
    "zip":zip, 
    "distance":dist
};

// 确保ajaxurl正确加载,建议通过wp_localize_script传递
$.post(my_ajax_object.ajax_url, data).done(function(response) {
    if(response.includes("INVALID API KEY")){
        return;
    }
    // 仅需一次JSON.parse(因为PHP直接返回了API的JSON响应)
    var json = JSON.parse(response);
    FFLs.list = json;
    FFLs.dict = {};
    $.each(json, function(key,value) {
        FFLs.dict[value.ffl] = value;
    }); 
    
    $("#ffl_select").empty();
    $.each(json, function(_, ffl) {
        var text = `${ffl.licensee}${ffl.dba ? ` (${ffl.dba})` : ''}: ${ffl.premiseAddress}, ${ffl.premiseCity}, ${ffl.premiseState}, ${ffl.premiseZip}`;
        $("#ffl_select").append($("<option>").attr("value", ffl.ffl).text(text));
    });
    
    if($("#ffl_select option[value=\"xxxxxxxx\"]").length){
        $("#ffl_select").val("xxxxxxxx").change();
    } else {
        $("#ffl_select").change();
    }
}).fail(function(xhr, status, error) {
    console.error(xhr.responseText); // 优先在控制台查看详细错误
    alert(`${status} ${error}`);
});

4. 确保ajaxurl正确传递

移动端页面可能未自动加载ajaxurl变量,需通过wp_localize_script在前端注入正确路径:

add_action('wp_enqueue_scripts', 'enqueue_plugin_scripts');
function enqueue_plugin_scripts() {
    wp_enqueue_script(
        'ffl-search-script',
        plugin_dir_url(__FILE__) . '/js/your-script.js',
        array('jquery'),
        '1.0',
        true
    );
    wp_localize_script('ffl-search-script', 'my_ajax_object', array(
        'ajax_url' => admin_url('admin-ajax.php')
    ));
}

额外排查点

  • 检查安全插件(如Wordfence)是否拦截移动端请求,查看插件日志或临时关闭测试;
  • 验证移动端输入的邮编是否包含特殊字符(如空格),确保前端已做trim处理;
  • 用浏览器开发者工具(移动端模式)查看请求头和参数,确认数据是否正确传递到后端。

内容的提问来源于stack exchange,提问作者Aaron C

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 05:45:56