如何在WooCommerce订单完成页为商品添加自定义折扣文本?
在WooCommerce订单完成页添加商品折扣文本的实现方案
嘿,这个需求完全可以搞定!WooCommerce提供了几个合适的钩子,能帮你在订单完成页(包括用户账户里的订单详情页)给每个带批量折扣的商品加上(10% discount)这样的文本。下面给你具体的实现思路和代码示例:
一、常用的钩子选项
1. 修改商品名称后添加文本:woocommerce_order_item_name
这个钩子可以直接修改订单中显示的商品名称,适合把折扣文本紧跟在商品名后面的场景。
add_filter( 'woocommerce_order_item_name', 'add_discount_text_to_order_items', 10, 3 ); function add_discount_text_to_order_items( $item_name, $item, $is_visible ) { // 只在订单完成页(order-received)和订单详情页(view-order)生效 if ( is_wc_endpoint_url( 'order-received' ) || is_wc_endpoint_url( 'view-order' ) ) { // 从订单项元数据中获取之前保存的折扣百分比(后面会说怎么保存) $discount_percent = $item->get_meta( '_bulk_discount_percentage' ); // 如果存在折扣值,就添加文本 if ( ! empty( $discount_percent ) ) { $item_name .= ' (' . $discount_percent . '% discount)'; } } return $item_name; }
2. 在商品元数据后添加文本:woocommerce_order_item_meta_end
如果不想修改商品名称,想把折扣文本放在商品规格、数量等元数据的下方,用这个钩子更合适。
add_action( 'woocommerce_order_item_meta_end', 'add_discount_text_after_item_meta', 10, 4 ); function add_discount_text_after_item_meta( $item_id, $item, $order, $plain_text ) { if ( is_wc_endpoint_url( 'order-received' ) || is_wc_endpoint_url( 'view-order' ) ) { $discount_percent = $item->get_meta( '_bulk_discount_percentage' ); if ( ! empty( $discount_percent ) ) { echo '<br><small style="color:#666;">(' . $discount_percent . '% discount)</small>'; } } }
二、关键:把折扣信息保存到订单项
要在订单页面获取到商品的折扣值,你需要在用户结账时,把批量折扣的信息保存到订单项的元数据里。可以用woocommerce_checkout_create_order_line_item钩子来实现:
add_action( 'woocommerce_checkout_create_order_line_item', 'save_bulk_discount_to_order_item', 10, 4 ); function save_bulk_discount_to_order_item( $item, $cart_item_key, $values, $order ) { // 这里替换成你实际计算批量折扣的逻辑,比如从购物车项中获取已计算好的折扣百分比 // 假设你之前在woocommerce_before_calculate_totals里已经算出了该商品的折扣率 $discount_percent = isset( $values['bulk_discount_percent'] ) ? $values['bulk_discount_percent'] : 0; if ( $discount_percent > 0 ) { // 保存元数据,第三个参数true表示不在前台默认显示(我们自己通过钩子控制显示) $item->add_meta_data( '_bulk_discount_percentage', $discount_percent, true ); } }
三、注意事项
- 调整
is_wc_endpoint_url的判断条件,可以控制文本显示的页面范围,比如只在订单完成页显示就保留is_wc_endpoint_url( 'order-received' )即可。 - 如果你之前的折扣逻辑是基于金额而非百分比,只需把代码中的百分比替换成金额文本即可,比如
$item_name .= ' ($10 discount)'。 - 代码可以添加到你的主题
functions.php文件,或者自定义插件中,避免主题更新丢失。
内容的提问来源于stack exchange,提问作者Jan Gale
相关产品推荐
相关产品推荐

