WooCommerce邮件技术问题:编辑客户详情及第三方自定义字段显示设置
1. 如何编辑WooCommerce邮件通知中的客户详情
编辑邮件里的客户详情,我通常推荐两种实用方式,一种是安全的模板覆盖,另一种是灵活的钩子定制,你可以根据需求选:
方式一:子主题覆盖邮件模板(最稳妥,适合可视化修改)
WooCommerce的所有邮件模板都在插件目录的wp-content/plugins/woocommerce/templates/emails/里,但直接修改插件文件会被版本更新冲掉,所以正确姿势是复制到子主题:
- 找到你要修改的目标邮件模板,比如客户的订单确认邮件是
customer-processing-order.php,管理员新订单邮件是admin-new-order.php - 在你的子主题文件夹里创建
woocommerce/emails/路径,把目标模板文件复制进去 - 打开复制后的模板,找到客户详情对应的代码块(一般是调用
do_action( 'woocommerce_email_customer_details', $order, $sent_to_admin, $plain_text, $email );的地方),直接编辑HTML内容——比如加个自定义标题、调整字段顺序,或者删掉不需要的信息
方式二:用钩子过滤内容(无需改模板,适合动态调整)
如果你不想碰模板代码,用woocommerce_email_customer_details钩子就能轻松添加、修改甚至移除客户详情内容。比如我要在邮件里额外显示客户ID和手机号,代码可以这么写:
add_action( 'woocommerce_email_customer_details', 'customize_my_email_customer_info', 10, 4 ); function customize_my_email_customer_info( $order, $sent_to_admin, $plain_text, $email ) { // 要是想移除默认的客户详情,就解开下面这行注释 // remove_action( 'woocommerce_email_customer_details', 'woocommerce_email_customer_details', 10 ); // 加个自定义标题 echo '<h2>' . __( '我的专属客户信息', 'woocommerce' ) . '</h2>'; // 显示客户ID echo '<p>' . __( '客户ID:', 'woocommerce' ) . ' ' . $order->get_customer_id() . '</p>'; // 显示手机号(如果有填写) if ( $order->get_billing_phone() ) { echo '<p>' . __( '联系电话:', 'woocommerce' ) . ' ' . $order->get_billing_phone() . '</p>'; } }
把这段代码贴到子主题的functions.php里,或者用代码片段插件运行就行。
2. 第三方插件自定义字段的引入位置与邮件钩子调整
首先得找到第三方插件的自定义字段存在哪里,然后再调整邮件里的显示顺序,一步步来:
第一步:找到第三方自定义字段的存储位置
第三方插件一般会把自定义字段存在订单的元数据里(也就是wp_postmeta表,因为订单是shop_order自定义文章类型)。找字段名的方法有三个:
- 数据库查看:用phpMyAdmin打开
wp_postmeta表,搜索对应订单的ID,找带插件前缀的字段(比如_xxx_plugin_custom_field) - 开发者工具:在后台订单编辑页,对着自定义字段输入框右键“检查”,看它的
name属性,那就是字段的键名 - 代码输出:如果懒得手动找,直接在订单编辑页显示所有元数据,一眼就能看到:
add_action( 'woocommerce_admin_order_data_after_billing_address', 'show_all_order_meta', 10, 1 ); function show_all_order_meta( $order ) { echo '<h3>' . __( '所有订单元数据', 'woocommerce' ) . '</h3>'; foreach ( $order->get_meta_data() as $meta ) { echo '<p><strong>' . $meta->key . ':</strong> ' . $meta->value . '</p>'; } }
这段代码会在订单的账单地址下方列出所有元数据,找到你要的字段键名就行。
第二步:调整邮件钩子顺序,让客户详情(含自定义字段)显示在订单元数据上方
你要实现和admin-new-order.php一样的效果,让woocommerce_email_customer_details在woocommerce_email_order_meta上方,有三种方案可选:
方案一:调整钩子优先级(无需改模板)
默认情况下,有些邮件模板里woocommerce_email_order_meta的优先级比客户详情高,你可以把它的优先级调低,让客户详情先显示:
// 移除默认的订单元数据钩子 remove_action( 'woocommerce_email_order_details', 'woocommerce_email_order_meta', 30 ); // 重新添加,把优先级设为40(比客户详情的10高,所以会后执行) add_action( 'woocommerce_email_order_details', 'woocommerce_email_order_meta', 40 );
方案二:把第三方自定义字段加到客户详情钩子里
这样自定义字段会和默认的客户详情一起显示在订单元数据上方,用你找到的字段键名替换下面的_third_party_field:
add_action( 'woocommerce_email_customer_details', 'add_third_party_field_to_email', 15, 4 ); function add_third_party_field_to_email( $order, $sent_to_admin, $plain_text, $email ) { $custom_value = $order->get_meta( '_third_party_field' ); if ( $custom_value ) { if ( $plain_text ) { // 纯文本邮件的格式 echo __( '自定义字段:', 'woocommerce' ) . ' ' . $custom_value . "\n"; } else { // HTML邮件的格式 echo '<p><strong>' . __( '自定义字段:', 'woocommerce' ) . '</strong> ' . $custom_value . '</p>'; } } }
方案三:直接修改模板的钩子顺序(可视化调整)
要是上面的方法都觉得麻烦,直接用子主题覆盖邮件模板,打开你要修改的模板文件(比如customer-processing-order.php),找到这两行:
do_action( 'woocommerce_email_order_meta', $order, $sent_to_admin, $plain_text, $email ); do_action( 'woocommerce_email_customer_details', $order, $sent_to_admin, $plain_text, $email );
把它们调换顺序,变成:
do_action( 'woocommerce_email_customer_details', $order, $sent_to_admin, $plain_text, $email ); do_action( 'woocommerce_email_order_meta', $order, $sent_to_admin, $plain_text, $email );
这样客户详情就会乖乖显示在订单元数据上方,包括你加的第三方自定义字段。
内容的提问来源于stack exchange,提问作者Carina

