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

WooCommerce后台批量下载订单至PC及管理员消息显示问题

Hey there! 我刚在WooCommerce后台的「订单列表」里实现了批量下载标准化订单信息的功能——管理员既可以通过选择日期范围批量导出,也能手动勾选特定订单后执行「下载到文件」操作。我把整个实现拆成了4个钩子函数,一步步给你拆解:

1. 渲染批量操作的HTML界面(含日期选择器)

我用woocommerce_before_order_list_table钩子,在订单列表上方插入自定义的操作区域,包含日期范围选择器、操作提示和下载按钮,还特意加了CSRF验证的nonce字段保障安全:

add_action('woocommerce_before_order_list_table', 'render_order_download_ui');
function render_order_download_ui() {
    // 仅对管理员开放该功能
    if (!current_user_can('manage_woocommerce')) return;
    ?>
    <div class="wc-order-download-ui" style="margin: 1em 0; padding: 1em; border: 1px solid #eee; border-radius: 4px;">
        <h3>批量下载订单信息</h3>
        <p>选择日期范围或勾选订单,点击下方按钮导出标准化订单数据</p>
        <form method="post" action="<?php echo admin_url('admin-post.php'); ?>">
            <?php wp_nonce_field('download_orders_nonce', 'download_orders_nonce'); ?>
            <input type="hidden" name="action" value="download_selected_orders">
            
            <div style="display: flex; gap: 1em; align-items: center; margin-bottom: 1em;">
                <label for="start_date">开始日期:</label>
                <?php wc_date_picker(array(
                    'id' => 'start_date',
                    'name' => 'start_date',
                    'placeholder' => '选择开始日期',
                )); ?>
                
                <label for="end_date">结束日期:</label>
                <?php wc_date_picker(array(
                    'id' => 'end_date',
                    'name' => 'end_date',
                    'placeholder' => '选择结束日期',
                )); ?>
            </div>
            
            <p><strong>或</strong> 勾选列表中的订单,点击按钮导出选中订单</p>
            
            <button type="submit" class="button button-primary">下载到文件</button>
        </form>
    </div>
    <?php
}

2. 处理批量操作的提交请求

接下来用admin_post_download_selected_orders钩子(对应表单里的action参数)处理提交的请求,先做权限和CSRF验证,再根据用户选择的方式获取要导出的订单ID集合:

add_action('admin_post_download_selected_orders', 'handle_order_download_request');
function handle_order_download_request() {
    // 权限与请求合法性验证
    if (!current_user_can('manage_woocommerce') || !wp_verify_nonce($_POST['download_orders_nonce'], 'download_orders_nonce')) {
        wp_die('权限不足或请求无效,点击<a href="' . wp_get_referer() . '">返回</a>');
    }

    $order_ids = array();

    // 处理日期范围筛选逻辑
    if (!empty($_POST['start_date']) && !empty($_POST['end_date'])) {
        $start_date = date('Y-m-d 00:00:00', strtotime($_POST['start_date']));
        $end_date = date('Y-m-d 23:59:59', strtotime($_POST['end_date']));
        
        $order_ids = wc_get_orders(array(
            'date_created' => $start_date . '...' . $end_date,
            'return' => 'ids',
            'limit' => -1, // 导出所有符合条件的订单
        ));
    }
    // 处理手动勾选的订单
    elseif (!empty($_POST['post'])) {
        $order_ids = array_map('absint', $_POST['post']);
    }

    // 无符合条件订单时的提示
    if (empty($order_ids)) {
        wp_die('没有找到符合条件的订单,点击<a href="' . wp_get_referer() . '">返回</a>');
    }

    // 调用生成并下载文件的核心函数
    generate_and_download_order_csv($order_ids);
}

3. 生成标准化的订单信息数据

我选择了通用性最强的CSV格式,写了一个自定义函数提取每个订单的标准化字段——你可以根据业务需求自行调整字段内容:

function generate_and_download_order_csv($order_ids) {
    // 定义CSV表头,可按需增减
    $headers = array(
        '订单号',
        '创建时间',
        '客户姓名',
        '客户邮箱',
        '订单状态',
        '总金额',
        '商品明细',
        '收货地址'
    );

    $rows = array($headers);

    // 循环处理每个订单
    foreach ($order_ids as $order_id) {
        $order = wc_get_order($order_id);
        if (!$order) continue;

        // 格式化商品明细为「商品名称×数量」的字符串
        $items_str = '';
        foreach ($order->get_items() as $item) {
            $items_str .= $item->get_name() . '×' . $item->get_quantity() . '; ';
        }
        $items_str = rtrim($items_str, '; ');

        // 拼接收货地址信息
        $shipping_address = $order->get_shipping_first_name() . ' ' . $order->get_shipping_last_name() . "\n" .
                           $order->get_shipping_address_1() . ' ' . $order->get_shipping_address_2() . "\n" .
                           $order->get_shipping_city() . ' ' . $order->get_shipping_state() . ' ' . $order->get_shipping_postcode() . "\n" .
                           $order->get_shipping_country();

        // 组装单行数据
        $rows[] = array(
            $order->get_order_number(),
            $order->get_date_created()->format('Y-m-d H:i:s'),
            $order->get_billing_first_name() . ' ' . $order->get_billing_last_name(),
            $order->get_billing_email(),
            wc_get_order_status_name($order->get_status()),
            $order->get_formatted_order_total(),
            $items_str,
            $shipping_address
        );
    }

    // 生成CSV内容,处理中文乱码问题
    ob_start();
    $file = fopen('php://output', 'w');
    foreach ($rows as $row) {
        fputcsv($file, array_map(function($item) {
            return mb_convert_encoding($item, 'GBK', 'UTF-8');
        }, $row));
    }
    fclose($file);
    $csv_content = ob_get_clean();

    // 触发浏览器下载
    header('Content-Type: text/csv; charset=GBK');
    header('Content-Disposition: attachment; filename="订单导出_' . date('YmdHis') . '.csv"');
    header('Content-Length: ' . strlen($csv_content));
    echo $csv_content;
    exit;
}

4. 兼容原生批量操作下拉菜单(可选)

如果想让功能更贴合WooCommerce后台的原生体验,可以把下载功能加到默认的批量操作下拉菜单里:

add_filter('bulk_actions-edit-shop_order', 'add_download_bulk_action');
function add_download_bulk_action($bulk_actions) {
    $bulk_actions['download_selected_orders'] = '下载选中订单信息';
    return $bulk_actions;
}

add_action('handle_bulk_actions-edit-shop_order', 'handle_bulk_download_action', 10, 3);
function handle_bulk_download_action($redirect_to, $action, $post_ids) {
    if ($action !== 'download_selected_orders') return $redirect_to;

    // 复用之前的生成下载函数
    generate_and_download_order_csv($post_ids);
    exit;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:28:14