WordPress插件PHP+AJAX生成CSV后下载文件为空问题求助
问题分析与解决方案
核心问题
你的代码存在两个关键问题:
- PHP文件操作路径错误:用
fopen('https://sitename.com/export-import/' . $filename, 'w')尝试写入远程URL,不符合服务器文件操作逻辑,且后续readfile($filename)找不到本地文件,导致AJAX接收的内容为空。 - 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('请求出错,请重试'); } });
关键说明
- 路径处理:用
ABSPATH获取WordPress根目录的绝对路径,确保文件写入到服务器本地的export-import文件夹,而非远程URL。 - 安全校验:增加了用户ID的有效性验证,避免恶意请求。
- 乱码处理:导出时将UTF-8转为GBK,兼容Excel打开CSV时的中文显示问题。
- 返回逻辑:PHP通过
wp_send_json_success返回文件的可访问URL,JS直接通过该URL创建下载链接,无需处理Blob,逻辑更简洁。 - 目录权限:确保服务器上的
export-import目录有755权限,PHP能正常写入文件。
内容的提问来源于stack exchange,提问作者Web Design
相关产品推荐
相关产品推荐

