WooCommerce订单追加写入CSV时无法换行,内容合并问题求助
WooCommerce订单追加写入CSV时无法换行,内容合并问题求助
问题分析与解决方案
你遇到的换行失效、内容合并问题,核心原因是**fputcsv本身会自动添加适配系统的换行符**,但你额外手动写入PHP_EOL的操作,加上文件打开模式的细分处理,导致换行逻辑混乱,甚至出现内容拼接的情况。另外不同系统的换行符标准不同(Windows是\r\n,Linux/macOS是\n),直接混用手动换行和fputcsv的自动换行,很容易出现错位。
下面是具体的修复步骤和优化后的代码:
1. 核心问题拆解
- 当你调用
fputcsv($file, $headers)时,函数已经自动在当前行末尾添加了系统对应的换行符,后续手动fwrite($file, PHP_EOL)会多写一个空行,甚至导致后续追加内容时的换行错位。 - 追加模式打开文件时,若文件末尾本身缺失换行符,新写入的内容会直接拼接在最后一行末尾,这就是你看到“Products12345”的原因。
2. 修复后的完整代码
add_action('woocommerce_checkout_order_processed', 'ppd_append_order_to_csv_full', 10, 1); function ppd_append_order_to_csv_full($order_id) { if (!$order_id) return; $order = wc_get_order($order_id); if (!$order) return; $folder_path = ABSPATH . 'ppd/'; $csv_path = $folder_path . 'orders.csv'; if (!file_exists($folder_path)) { mkdir($folder_path, 0755, true); } $file_exists = file_exists($csv_path); $need_headers = !$file_exists || filesize($csv_path) === 0; // 统一用a+模式打开文件,兼顾读/追加能力,简化逻辑 $file = fopen($csv_path, 'a+'); rewind($file); // 重置文件指针到开头,确保后续判断准确 if ($need_headers) { fwrite($file, "\xEF\xBB\xBF"); // UTF-8 BOM 适配Excel // 完全依赖fputcsv自动添加换行,不再手动写入 fputcsv($file, [ 'Order ID', 'Shipping Method', 'Products' ]); } else { // 检查文件末尾是否有换行符,没有则补充,避免新内容拼接 fseek($file, -1, SEEK_END); $last_char = fgetc($file); if ($last_char !== "\n" && $last_char !== "\r") { fwrite($file, PHP_EOL); } } // 整理订单商品数据 $items = []; foreach ($order->get_items('line_item') as $item_id => $item) { $product = $item->get_product(); $name = $item->get_name(); $sku = $product ? $product->get_sku() : ''; $qty = $item->get_quantity(); $unit_price = $qty > 0 ? number_format($item->get_total() / $qty, 2, '.', '') : '0.00'; $items[] = "{$name} (SKU: {$sku}) x {$qty} - £{$unit_price}"; } // 整理配送方式数据 $shipping_method_names = []; foreach ($order->get_shipping_methods() as $shipping_item) { $shipping_method_names[] = $shipping_item->get_method_title(); } // 组装最终行数据 $data = [ $order->get_id(), implode(' | ', $shipping_method_names), implode(' | ', $items) ]; // fputcsv自动处理换行和字段转义,无需额外操作 fputcsv($file, $data); fclose($file); }
3. 关键优化点
- 移除所有手动写入
PHP_EOL的操作,完全依赖fputcsv的自动换行逻辑,保证换行的一致性。 - 统一用
a+模式打开文件,避免分情况处理的复杂逻辑,同时通过fseek检查文件末尾的换行状态,确保追加新内容时一定会换行。 - 表头行的换行交给
fputcsv处理,避免表头和数据行的换行规则不一致。
4. 额外测试建议
- 可以用文本编辑器(如Notepad++)和Excel分别打开生成的CSV文件,验证换行和编码是否正常;
- 若后续遇到字段被引号包裹的情况,不用紧张,
fputcsv会自动处理包含逗号、引号的字段,不会破坏CSV的结构。
内容来源于stack exchange
相关产品推荐
相关产品推荐

