使用handle_bulk_actions-edit-shop_order导出订单时CSV格式异常
WooCommerce批量导出CSV解决字段含逗号格式错乱问题
CSV格式有明确规范:当字段包含逗号、双引号或换行符时,必须用双引号将字段包裹,字段内的双引号要替换成两个双引号。你当前的代码直接用逗号拼接字段,导致含逗号的字段被错误识别为多列,进而格式错乱。
解决办法是实现一个CSV字段处理函数,对每个字段进行转义处理,再统一拼接成CSV行。同时注意多产品的场景,要把多个产品的信息合并到同一个字段中(比如用换行分隔),避免列错位。
修改后的完整代码如下:
add_filter( 'bulk_actions-edit-shop_order', 'custom_bulk_actions' ); function custom_bulk_actions( $actions ) { $actions['export_orders_csv'] = __( 'Export Orders to CSV', 'text_domain' ); return $actions; } add_action( 'handle_bulk_actions-edit-shop_order', 'custom_bulk_action_handler', 10, 3 ); function custom_bulk_action_handler( $redirect_to, $doaction, $post_ids ) { if ( $doaction !== 'export_orders_csv' ) { return $redirect_to; } // 定义CSV字段处理函数 function format_csv_field($value) { // 处理字段内的双引号,替换为两个双引号 $value = str_replace('"', '""', $value); // 如果字段包含逗号、双引号或换行,用双引号包裹 if (strpos($value, ',') !== false || strpos($value, '"') !== false || strpos($value, "\n") !== false) { $value = '"' . $value . '"'; } return $value; } // 准备CSV表头 $headers = [ 'Order ID', 'Name', 'Phone Number', 'Address', 'City', 'Product Name', 'Product URL', 'Quantity', 'Total' ]; // 处理表头字段 $csv_data = implode(',', array_map('format_csv_field', $headers)) . "\n"; // 遍历订单 foreach ( $post_ids as $post_id ) { $order = wc_get_order( $post_id ); if (!$order) continue; // 收集订单数据 $order_data = [ $order->get_id(), $order->get_billing_first_name(), $order->get_billing_phone(), $order->get_billing_address_1(), $order->get_billing_city() ]; // 处理产品数据:多个产品用换行分隔 $items = $order->get_items(); $product_names = []; $product_urls = []; $quantities = []; foreach ( $items as $item ) { $product = $item->get_product(); if ($product) { $product_names[] = $product->get_name(); $product_urls[] = $product->get_permalink(); } $quantities[] = $item->get_quantity(); } // 合并产品信息为单个字段 $order_data[] = implode("\n", $product_names); $order_data[] = implode("\n", $product_urls); $order_data[] = implode("\n", $quantities); $order_data[] = $order->get_total(); // 处理所有字段并拼接成行 $csv_data .= implode(',', array_map('format_csv_field', $order_data)) . "\n"; } // 发送CSV下载响应 header( 'Content-Type: text/csv; charset=utf-8' ); header( 'Content-Disposition: attachment; filename=orders.csv' ); // 处理UTF-8 BOM,避免Excel乱码 echo "\xEF\xBB\xBF"; echo $csv_data; exit; }
代码说明:
- 新增
format_csv_field函数,严格按照CSV规范处理字段,自动处理含特殊字符的情况 - 改用数组收集每行数据,再统一用
array_map处理后拼接,避免手动拼接的错误 - 多产品信息用换行符分隔合并到单个字段,确保CSV列数和表头一致
- 添加UTF-8 BOM头,解决Excel打开CSV时的中文乱码问题
内容的提问来源于stack exchange,提问作者Ahsan Khan
相关产品推荐
相关产品推荐

