如何在WooCommerce订单邮件中用自定义元数据替换带HTML的长产品标题
解决WooCommerce订单邮件中替换产品名称为自定义元数据的问题
我完全懂你现在的困扰——为了适配Essential Grid的灯箱展示需求,不得不给产品设置带HTML标签的长标题,结果这个标题跑到订单邮件里打乱了排版,而且你已经搞定了迷你购物车的修复,就差邮件这最后一步了。
下面是针对性的解决方案,用WooCommerce的钩子精准替换邮件中的产品名称:
核心代码实现
这段代码会拦截订单邮件里的产品名称,用你自定义的simple_title元数据来替换:
add_filter( 'woocommerce_order_item_name', 'replace_order_item_name_with_custom_meta', 10, 3 ); function replace_order_item_name_with_custom_meta( $item_name, $item, $is_visible ) { // 仅在WooCommerce邮件场景下执行替换,避免影响其他页面 if ( did_action( 'woocommerce_email_before_order_table' ) || did_action( 'woocommerce_email_order_items' ) ) { // 获取当前订单关联的产品对象 $product = $item->get_product(); if ( $product ) { // 获取你自定义的simple_title元数据 $custom_title = $product->get_meta( 'simple_title' ); // 如果自定义标题存在,就替换掉原标题,同时做安全处理 if ( ! empty( $custom_title ) ) { $item_name = wp_kses_post( $custom_title ); } } } return $item_name; }
代码细节说明
- 钩子选择:用
woocommerce_order_item_name这个核心钩子,它负责输出订单中每个商品的名称,覆盖邮件、前端订单页等场景。 - 场景限制:通过
did_action()判断当前是否处于邮件模板渲染流程,确保只修改邮件内容,不会干扰你已经修复好的迷你购物车或其他页面展示。 - 安全处理:用
wp_kses_post()过滤自定义标题,防止潜在的HTML注入风险,保证邮件内容的安全性和整洁性。
使用步骤
- 把这段代码添加到当前主题的
functions.php文件末尾,或者创建一个简单的自定义插件来存放代码(更推荐后者,避免主题更新导致代码丢失)。 - 确认你的自定义元数据键名是
simple_title,如果不是,把代码里的'simple_title'替换成你实际使用的键名。 - 测试验证:下一个测试订单,查看收到的订单邮件,产品名称应该已经替换成你设置的简洁标题了。
如果某些邮件模板没生效,可以检查一下是否使用了自定义邮件模板——如果是,需要确保模板里调用了apply_filters( 'woocommerce_order_item_name', ... )钩子,默认WooCommerce邮件模板都是支持这个钩子的。
内容的提问来源于stack exchange,提问作者daveisthemusic
相关产品推荐
相关产品推荐

