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

WordPress前端AJAX发布文章报400错误排查求助

WordPress前端AJAX发布文章400 Bad Request错误排查修复

核心问题

WordPress的AJAX请求必须携带action参数,用来匹配wp_ajax_{action}和wp_ajax_nopriv_{action}钩子对应的处理函数,你的请求里缺失这个关键参数,这是触发400错误的主要原因。

分步修复

1. 修正AJAX代码

  • 给FormData添加action参数,值对应PHP钩子的后缀名my_ajax_handler
  • 用本地化的my_ajax_object.ajax_url替代硬编码的地址,适配不同部署环境
  • 补充错误回调,方便调试排查

修改后的AJAX代码:

jQuery(document).ready(function($) {
    $('#submit').on('click', function(e){
        e.preventDefault();
        let title = $('#title').val();
        let content = $('#content').val();
        var formData = new FormData();
        formData.append('image', document.getElementById('image-input').files[0]);
        formData.append('var1', title);
        formData.append('var2', content);
        // 必须添加的action参数,和PHP钩子对应
        formData.append('action', 'my_ajax_handler');

        $.ajax({
            // 使用本地化的AJAX地址
            url: my_ajax_object.ajax_url,
            type: 'POST',
            data: formData,
            processData: false,
            contentType: false,
            success: function(response) {
                console.log(response);
            },
            // 新增错误回调,便于调试
            error: function(xhr, status, error) {
                console.log('请求出错:', xhr.status, error);
            }
        });
    })
});

2. 修正PHP代码

  • AJAX处理函数末尾必须调用wp_die(),终止输出,避免返回多余内容导致请求异常
  • 修正wp_insert_post的post_name参数:该字段是文章别名(slug),不要设置为pending(这是文章状态值)
  • 补充参数校验和错误反馈逻辑,让前端能明确知道问题所在
  • 对用户输入做安全过滤,避免XSS等风险

修改后的PHP处理函数:

function my_ajax_handler() {
    // 先校验必要参数是否存在
    if (!isset($_POST['var1']) || !isset($_POST['var2']) || !isset($_FILES['image'])) {
        wp_send_json_error('缺少必要参数');
    }

    // 安全过滤用户输入
    $post_title = sanitize_text_field($_POST['var1']);
    $post_content = wp_kses_post($_POST['var2']);
    $image = $_FILES['image'];

    $new_post = array(
        'post_title'    => $post_title,
        'post_content'  => $post_content,
        'post_status'   => 'publish',
        // 自动生成文章别名,替代错误的pending值
        'post_name'     => sanitize_title($post_title)
    );

    $pid = wp_insert_post($new_post);
    // 检查文章创建是否成功
    if (is_wp_error($pid)) {
        wp_send_json_error('文章创建失败: ' . $pid->get_error_message());
    }
    add_post_meta($pid, 'meta_key', true);

    if (!function_exists('wp_generate_attachment_metadata')) {
        require_once(ABSPATH . "wp-admin" . '/includes/image.php');
        require_once(ABSPATH . "wp-admin" . '/includes/file.php');
        require_once(ABSPATH . "wp-admin" . '/includes/media.php');
    }

    $attach_id = 0;
    if ($_FILES) {
        foreach ($_FILES as $file => $array) {
            if ($_FILES[$file]['error'] !== UPLOAD_ERR_OK) {
                wp_send_json_error('上传错误: ' . $_FILES[$file]['error']);
            }
            $attach_id = media_handle_upload($file, $pid);
            if (is_wp_error($attach_id)) {
                wp_send_json_error('图片处理失败: ' . $attach_id->get_error_message());
            }
        }
    }

    if ($attach_id > 0) {
        update_post_meta($pid, '_thumbnail_id', $attach_id);
    }

    wp_send_json_success('文章发布成功,ID: ' . $pid);
    // 必须调用wp_die终止输出,避免返回多余内容
    wp_die();
}
add_action("wp_ajax_my_ajax_handler", "my_ajax_handler");
add_action("wp_ajax_nopriv_my_ajax_handler", "my_ajax_handler");

3. 额外优化建议

  • 权限控制:如果允许未登录用户发布文章,建议将文章默认状态设为pending待审核,避免垃圾内容直接发布
  • 文件校验:添加图片类型、大小的验证逻辑,防止非法文件上传
  • 表单验证:前端增加输入字段非空校验,减少无效请求

内容的提问来源于stack exchange,提问作者Amir Sandila

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 11:15:40