WooCommerce订单转Excel插件异常:下单报错且无附件
排查步骤与代码问题分析
1. 先确认PhpSpreadsheet库加载是否正常
不管是手动安装还是用CBX插件,先在代码开头加加载校验,避免库未加载导致致命错误中断订单流程:
// 手动安装的情况 require_once plugin_dir_path(__FILE__) . 'vendor/autoload.php'; if (!class_exists('PhpOffice\PhpSpreadsheet\Spreadsheet')) { error_log('PhpSpreadsheet库加载失败,检查vendor路径'); return; } // CBX插件依赖的情况 if (!function_exists('cbxphpsspreedsheet_load')) { error_log('CBX PhpSpreadsheet Library插件未激活'); return; } cbxphpsspreedsheet_load();
2. 检查钩子触发时机是否干扰订单创建
如果用了woocommerce_new_order钩子,这个钩子在订单刚创建还没完全写入数据库时触发,很容易打断提交流程。换用更晚的钩子,确保订单已经保存:
// 错误示例:过早触发导致订单数据异常 // add_action('woocommerce_new_order', 'generate_excel_order', 10, 1); // 推荐用这个,在订单确认页触发,订单已完全创建 add_action('woocommerce_thankyou', 'generate_excel_order', 20, 1);
3. Excel生成逻辑的致命错误排查
- 先校验模板文件是否存在、权限是否正常:
$template_path = plugin_dir_path(__FILE__) . 'templates/order-template-' . get_locale() . '.xlsx'; if (!file_exists($template_path)) { error_log('找不到对应语言的Excel模板:' . $template_path); return; }
- 处理Excel时容易内存不足,临时调高内存限制:
ini_set('memory_limit', '256M'); // 根据实际情况调整
4. 邮件替换逻辑是否正确
要确保默认管理员邮件被取消,同时自定义邮件的附件路径有效:
// 先关掉默认的新订单邮件 add_filter('woocommerce_email_enabled_new_order', '__return_false', 99); // 自定义发送带Excel的邮件 function send_excel_order_email($order_id) { $order = wc_get_order($order_id); if (!$order) return; $mailer = WC()->mailer(); $recipient = get_option('woocommerce_new_order_email_recipient'); $excel_file = generate_excel_file($order_id); // 确保这个函数返回正确的文件路径 // 附件为空就直接返回,避免发空邮件 if (!$excel_file || !file_exists($excel_file)) { error_log('Excel附件生成失败,路径无效'); return; } $subject = sprintf(__('New Order #%s', 'woocommerce-order-to-excel'), $order->get_order_number()); $message = $mailer->wrap_message(__('新订单通知', 'woocommerce-order-to-excel'), __('附件为订单详情Excel文件', 'woocommerce-order-to-excel')); $mailer->send($recipient, $subject, $message, array(), array($excel_file)); }
5. 开启调试模式抓具体错误
在wp-config.php里打开调试,直接看wp-content/debug.log里的报错信息,前端的报错大概率对应日志里的致命错误:
define('WP_DEBUG', true); define('WP_DEBUG_LOG', true); define('WP_DEBUG_DISPLAY', false); // 不在前端显示错误,避免影响用户
内容的提问来源于stack exchange,提问作者Elbarbu
相关产品推荐
相关产品推荐

