WooCommerce新订单额外邮件无法获取指定详情问题求助
WooCommerce 自定义额外新订单邮件(正确获取订单详情)
你的核心问题是原代码使用的woocommerce_new_order钩子触发时机过早,部分订单数据尚未完全写入数据库,导致无法正确获取所需详情。以下是修正后的代码,确保能稳定获取不含价格的商品明细、客户备注、订单编号和订单日期,同时保留默认新订单邮件功能:
add_action( 'woocommerce_checkout_order_processed', 'send_custom_order_email', 10, 3 ); function send_custom_order_email( $order_id, $posted_data, $order ) { // 直接使用钩子传递的order对象,避免重复查询 if ( ! $order ) { $order = wc_get_order( $order_id ); } // 构建商品明细(不含价格) $order_details = ''; foreach ( $order->get_items() as $item ) { $product_name = $item->get_name(); $item_quantity = $item->get_quantity(); $order_details .= "商品:{$product_name} - 数量:{$item_quantity}\n"; } // 处理订单日期(兼容空值情况) $order_date = $order->get_date_created() ? $order->get_date_created()->format( 'Y年m月d日 H:i:s' ) : date( 'Y年m月d日 H:i:s' ); // 处理客户备注(空值时显示“无”) $customer_note = $order->get_customer_note() ?: '无'; // 组装邮件内容 $email_content = "订单日期:{$order_date}\n" . "订单编号:{$order->get_order_number()}\n\n" . "商品明细:\n{$order_details}\n" . "客户备注:{$customer_note}"; // 邮件主题与收件人 $email_subject = "新订单通知:{$order->get_order_number()}"; $desired_email = 'your-target-email@example.com'; // 替换为目标邮箱 // 发送邮件 wp_mail( $desired_email, $email_subject, $email_content ); }
关键修改说明:
- 钩子替换:改用
woocommerce_checkout_order_processed,该钩子在订单数据完全写入数据库后触发,确保能获取完整的订单信息 - 数据获取优化:使用WooCommerce官方推荐的方法(如
$item->get_name()、$item->get_quantity())替代直接访问数组属性,兼容高版本WooCommerce - 空值处理:对订单日期、客户备注增加空值判断,避免邮件内容出现异常
- 直接使用订单对象:利用钩子传递的
$order参数,减少数据库查询,提升效率
将上述代码添加到你的WordPress主题functions.php文件或自定义插件中即可生效,默认新订单邮件功能不受任何影响。
内容的提问来源于stack exchange,提问作者Sharid Kayes
相关产品推荐
相关产品推荐

