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

WordPress插件PHP+AJAX生成CSV后下载文件为空问题求助

问题分析与解决方案

核心问题

你的代码存在两个关键问题:

  1. PHP文件操作路径错误:用fopen('https://sitename.com/export-import/' . $filename, 'w')尝试写入远程URL,不符合服务器文件操作逻辑,且后续readfile($filename)找不到本地文件,导致AJAX接收的内容为空。
  2. AJAX处理逻辑偏差:你试图通过Blob接收文件内容,但更高效的方式是让PHP返回生成好的CSV文件的真实URL,直接通过链接下载。

修正后的PHP代码

function _exe_export_vendor_products(){
    // 验证用户ID(增加安全校验)
    if(!isset($_POST['c_user_id']) || !is_numeric($_POST['c_user_id'])){
        wp_send_json_error(['msg' => '无效的用户ID']);
    }
    $current_user_id = intval($_POST['c_user_id']);
    
    $arg = array(
        'limit' => 20,
        'author' => $current_user_id
    );
    $product_list = wc_get_products($arg);

    $title_array[] = array('ID', 'name', 'Price', 'SalePrice');
    $data_array = [];
    foreach($product_list as $_list){
        $data_array[] = array(
            $_list->get_id(), 
            $_list->get_name(), 
            $_list->get_price(), 
            $_list->get_sale_price()
        );
    }
    $final_array = array_merge($title_array, $data_array);

    date_default_timezone_set("Asia/Tehran");
    $current_date = date('Y-m-d-H-i');
    $filename = "export-" . $current_user_id . "-" . $current_date . ".csv";
    
    // 使用服务器本地绝对路径(确保export-import目录存在且有写权限)
    $local_dir = ABSPATH . 'export-import/';
    // 检查目录是否存在,不存在则创建
    if(!file_exists($local_dir)){
        mkdir($local_dir, 0755, true);
    }
    $local_file_path = $local_dir . $filename;
    
    $f = fopen($local_file_path, 'w');
    $delimiter=";";
    foreach($final_array as $final_item){
        // 处理中文等非ASCII字符,避免乱码
        fputcsv($f, array_map(function($item){
            return mb_convert_encoding($item, 'GBK', 'UTF-8');
        }, $final_item), $delimiter);
    }
    fclose($f);

    // 生成可访问的文件URL
    $file_url = home_url('/export-import/' . $filename);
    // 返回JSON数据,包含文件URL和文件名
    wp_send_json_success([
        'file_url' => $file_url,
        'filename' => $filename
    ]);
}

修正后的JS代码

jQuery.ajax({
    type: "POST",
    url: Ajax_object_dokan.ajax_url,
    data:{
        action: '_dokan_export_vendor',
        c_user_id : current_user_id
    },
    dataType: 'json',
    success: function(response){
        if(response.success){
            var fileUrl = response.data.file_url;
            var filename = response.data.filename;
            
            // 创建a标签下载
            var a = document.createElement("a");
            a.href = fileUrl;
            a.download = filename;
            document.body.appendChild(a);
            a.click();
            document.body.removeChild(a);
            
            // 可选:一段时间后删除服务器上的文件(需要额外写清理逻辑)
        } else {
            alert('导出失败:' + response.data.msg);
        }
    },
    error: function(){
        alert('请求出错,请重试');
    }
});

关键说明

  1. 路径处理:用ABSPATH获取WordPress根目录的绝对路径,确保文件写入到服务器本地的export-import文件夹,而非远程URL。
  2. 安全校验:增加了用户ID的有效性验证,避免恶意请求。
  3. 乱码处理:导出时将UTF-8转为GBK,兼容Excel打开CSV时的中文显示问题。
  4. 返回逻辑:PHP通过wp_send_json_success返回文件的可访问URL,JS直接通过该URL创建下载链接,无需处理Blob,逻辑更简洁。
  5. 目录权限:确保服务器上的export-import目录有755权限,PHP能正常写入文件。

内容的提问来源于stack exchange,提问作者Web Design

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 09:27:22