
本文详解如何在用户访问 woocommerce 结账页面且购物车非空时,安全、可靠地触发一次个性化邮件通知,避免重复发送,并提供与 woocommerce 原生邮件风格一致的进阶实现方案。
在 WooCommerce 开发中,为提升转化率或增强用户引导,常需在用户进入结账流程时主动发送提醒邮件(例如:“您的订单即将完成!”)。但若钩子选择不当或条件校验缺失,极易导致邮件被重复发送——正如原始代码中误用 woocommerce_after_shop_loop_item(该钩子仅在商品列表页执行),造成逻辑错位与用户体验受损。
✅ 正确的钩子与执行时机
应使用专属于结账页的生命周期钩子:woocommerce_before_checkout_form。它在结账表单渲染前触发,确保页面上下文准确,且仅在 /checkout/ 路由下执行,天然规避了其他页面的误触风险。
✅ 关键安全校验(必做)
- 检查用户是否已登录(is_user_logged_in());
- 确保 WooCommerce 购物车对象已初始化(WC()->cart 存在);
- 验证购物车非空(! WC()->cart->is_empty());
- 校验用户邮箱与姓名字段非空(防止 wp_mail() 因无效参数报错或静默失败)。
以下为推荐的生产级实现代码,已整合全部校验并采用国际化(i18n)支持:
function send_checkout_entry_notification() {
// 仅对已登录用户执行
if ( ! is_user_logged_in() ) {
return;
}
// 确保 WooCommerce 购物车可用(避免未初始化错误)
if ( ! WC()->cart || WC()->cart->is_empty() ) {
return;
}
$current_user = wp_get_current_user();
$email = $current_user->user_email;
$name = $current_user->user_firstname;
// 邮箱与姓名必须有效
if ( empty( $email ) || empty( $name ) ) {
return;
}
$to = $email;
$subject = sprintf( __( 'Hello %s, your purchase is almost ready!', 'woocommerce' ), esc_html( $name ) );
$body = sprintf(
__( 'Hi %s,<br><br>Your cart contains %d item(s). Proceed to checkout to complete your order!', 'woocommerce' ),
esc_html( $name ),
WC()->cart->get_cart_contents_count()
);
$headers = array( 'Content-Type: text/html; charset=UTF-8' );
// 发送邮件(基础方式)
wp_mail( $to, $subject, $body, $headers );
}
add_action( 'woocommerce_before_checkout_form', 'send_checkout_entry_notification' );⚙️ 进阶:复用 WooCommerce 邮件模板样式
若希望通知邮件与订单确认、发货通知等保持统一视觉风格(含 WooCommerce 主题头部、底部、品牌色与响应式布局),请改用 WooCommerce 内置邮件系统:
// 替换上述 wp_mail() 区块为以下代码:
if ( ! empty( $email ) && ! empty( $name ) ) {
$mailer = WC()->mailer();
$to = $email;
$subject = __( 'Your Checkout Reminder', 'woocommerce' );
$message = __( 'Your cart is ready — time to complete your purchase!', 'woocommerce' );
// 使用 WooCommerce 封装器生成标准邮件结构(含 header/footer)
$email_content = $mailer->wrap_message(
sprintf( __( 'Hello %s', 'woocommerce' ), esc_html( $name ) ),
$message
);
$headers = "Content-Type: text/html\r\n";
$mailer->send( $to, $subject, $email_content, $headers );
}? 注意事项 禁止在 AJAX 或表单提交钩子(如 woocommerce_checkout_process)中重复发送:本方案仅在页面加载时触发一次,符合“进入结账页即提醒”的设计意图; 测试务必启用 WordPress 调试模式(WP_DEBUG_LOG),检查是否有 WC()->cart 未定义警告; 若使用缓存插件(如 WP Rocket),需排除 /checkout/ 页面缓存,否则钩子可能不执行; 建议搭配 WP Mail Logging 插件验证邮件实际发送状态。
通过以上结构化实现,您将获得一个稳定、可维护、符合 WooCommerce 最佳实践的结账页邮件通知功能,既保障用户体验,又为后续扩展(如添加优惠券提示、库存预警等)预留清晰接口。










