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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 23:31:45