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
相关产品推荐
相关产品推荐

