如何在WooCommerce购物车/迷你购物车/结账/订单页隐藏指定产品
WooCommerce 跨场景隐藏指定产品实现代码
以下代码可同时覆盖多场景的指定产品隐藏需求,完美兼容分组产品关联子产品的隐藏逻辑:
- Cart 购物车页面
- Mini Cart 迷你购物车组件
- Checkout 结账页面
- 前端个人中心订单模块、订单通知邮件
- 后台订单管理页默认保留完整产品记录,方便商家核对,不会向普通用户展示隐藏产品
代码实现
首先配置需要隐藏的产品ID,后续所有场景的判断都会复用该配置,不需要重复修改:
// 配置需要隐藏的产品ID列表 function custom_get_hidden_product_ids() { // 替换括号内的数字为你实际需要隐藏的产品ID即可 return array(123, 456, 789); }
购物车类场景隐藏逻辑
覆盖购物车页、迷你购物车、结账页的产品行展示过滤,同时修正金额统计,避免隐藏产品仍被计入总价:
// 过滤购物车、迷你购物车、结账页的隐藏产品展示 add_filter( 'woocommerce_cart_get_cart_item_visible', 'custom_filter_hidden_cart_items', 10, 2 ); add_filter( 'woocommerce_widget_cart_item_visible', 'custom_filter_hidden_cart_items', 10, 2 ); add_filter( 'woocommerce_checkout_cart_item_visible', 'custom_filter_hidden_cart_items', 10, 2 ); function custom_filter_hidden_cart_items( $is_visible, $cart_item ) { $hidden_ids = custom_get_hidden_product_ids(); if ( in_array( $cart_item['product_id'], $hidden_ids ) || in_array( $cart_item['variation_id'], $hidden_ids ) ) { $is_visible = false; } return $is_visible; } // 购物车、结账页总价计算排除隐藏产品 add_filter( 'woocommerce_cart_get_subtotal', 'custom_exclude_hidden_items_from_cart_total', 10, 2 ); add_filter( 'woocommerce_cart_get_total', 'custom_exclude_hidden_items_from_cart_total', 10, 2 ); function custom_exclude_hidden_items_from_cart_total( $amount, $cart ) { $hidden_ids = custom_get_hidden_product_ids(); $deduct_amount = 0; foreach ( $cart->get_cart() as $item ) { if ( in_array( $item['product_id'], $hidden_ids ) || in_array( $item['variation_id'], $hidden_ids ) ) { $deduct_amount += $item['line_total'] + $item['line_tax']; } } return $amount - $deduct_amount; }
订单类场景隐藏逻辑
覆盖前端订单详情、订单列表、系统邮件的产品展示,同时修正订单显示金额,后台管理端保留完整数据供商家核对:
// 过滤前端订单、邮件通知中的隐藏产品展示 add_filter( 'woocommerce_order_item_visible', 'custom_filter_hidden_order_items', 10, 2 ); function custom_filter_hidden_order_items( $is_visible, $order_item ) { $hidden_ids = custom_get_hidden_product_ids(); $product_id = $order_item->get_product_id(); $variation_id = $order_item->get_variation_id(); if ( in_array( $product_id, $hidden_ids ) || in_array( $variation_id, $hidden_ids ) ) { $is_visible = false; } return $is_visible; } // 前端订单金额计算排除隐藏产品 add_action( 'woocommerce_order_get_items', 'custom_adjust_order_total_for_hidden', 10, 2 ); function custom_adjust_order_total_for_hidden( $items, $order ) { // 后台管理页不做金额调整,保留完整订单数据 if ( is_admin() && !wp_doing_ajax() ) { return $items; } $hidden_ids = custom_get_hidden_product_ids(); $deduct_amount = 0; foreach ( $items as $item ) { $product_id = $item->get_product_id(); $variation_id = $item->get_variation_id(); if ( in_array( $product_id, $hidden_ids ) || in_array( $variation_id, $hidden_ids ) ) { $deduct_amount += $item->get_total() + $item->get_total_tax(); } } if ( $deduct_amount > 0 ) { $order->set_total( $order->get_total() - $deduct_amount ); } return $items; }
使用注意事项
- 将上述全部代码添加到当前主题目录下的
functions.php文件,或者使用代码片段类插件插入即可生效 - 仅需要修改
custom_get_hidden_product_ids函数内的ID数组,填入需要隐藏的产品ID即可,不需要改动其他逻辑 - 代码兼容简单产品、可变产品、分组产品子产品的隐藏需求
内容的提问来源于stack exchange,提问作者ddrewuk
相关产品推荐
相关产品推荐

