WooCommerce特定分类添加「立即试用」按钮及定制结账页需求
我来帮你梳理并完善实现这个需求的完整方案,结合你提到的代码片段,我们分几个核心步骤来落地:
第一步:给指定分类添加「立即试用」按钮
先完善你提到的移除默认加购按钮、添加自定义试用按钮的逻辑,精准控制仅目标分类显示该按钮:
// 移除产品列表页默认加入购物车按钮(仅目标分类生效) add_action( 'woocommerce_before_shop_loop_item', 'remove_loop_add_to_cart_button', 1 ); function remove_loop_add_to_cart_button(){ // 替换成你需要设置的目标分类ID,多个分类用数组比如 array(10, 15, 20) $target_category_ids = array(10); global $product; // 检查当前产品是否属于目标分类 if( has_term( $target_category_ids, 'product_cat', $product->get_id() ) ){ remove_action( 'woocommerce_after_shop_loop_item', 'woocommerce_template_loop_add_to_cart', 10 ); // 挂载自定义「立即试用」按钮 add_action( 'woocommerce_after_shop_loop_item', 'render_trial_checkout_button', 10 ); } } // 输出「立即试用」按钮,跳转至定制结账页并携带产品ID参数 function render_trial_checkout_button(){ global $product; // 这里替换为你创建的定制结账页的slug(比如后台新建页面slug设为custom-trial-checkout) $checkout_page = get_page_by_path( 'custom-trial-checkout' ); if( $checkout_page ){ $checkout_url = add_query_arg( 'trial_product_id', $product->get_id(), get_permalink( $checkout_page->ID ) ); echo '<a href="' . esc_url( $checkout_url ) . '" class="button trial-checkout-btn">立即试用</a>'; } }
第二步:定制结账页核心逻辑(数量限制/固定总价/支付方式限制)
首先在WordPress后台新建一个页面,命名为「试用专属结账」,页面slug设置为custom-trial-checkout,页面内容插入短码[woocommerce_checkout]。然后添加以下代码处理核心规则:
// 试用结账页专属逻辑初始化 add_action( 'woocommerce_before_checkout_form', 'init_trial_checkout_rules' ); function init_trial_checkout_rules(){ if( !is_page( 'custom-trial-checkout' ) || !isset( $_GET['trial_product_id'] ) ){ return; } $trial_product_id = absint( $_GET['trial_product_id'] ); $max_trial_qty = 5; // 最多5件试用商品 $fixed_total = 500; // 固定总价 // 清空购物车,确保仅加载试用商品 WC()->cart->empty_cart(); // 默认添加1件试用商品 WC()->cart->add_to_cart( $trial_product_id, 1 ); // 挂载后续规则钩子 add_filter( 'woocommerce_quantity_input_max', 'limit_trial_product_max_qty', 10, 2 ); add_action( 'woocommerce_calculate_totals', 'force_fixed_trial_total' ); add_filter( 'woocommerce_available_payment_gateways', 'only_allow_bank_payment' ); } // 限制试用商品最大购买数量为5 function limit_trial_product_max_qty( $max_qty, $product ){ if( is_page( 'custom-trial-checkout' ) ){ return 5; } return $max_qty; } // 强制试用订单总价固定为500,清空所有额外费用 function force_fixed_trial_total( $cart ){ if( is_page( 'custom-trial-checkout' ) && !$cart->is_empty() ){ $cart->subtotal = 500; $cart->total = 500; // 移除税费、运费、服务费等所有额外项 $cart->tax_total = 0; $cart->shipping_total = 0; $cart->fee_total = 0; } } // 仅保留银行卡支付方式(默认银行转账网关ID为bacs,若用第三方支付插件需替换为对应ID) function only_allow_bank_payment( $available_gateways ){ if( is_page( 'custom-trial-checkout' ) ){ $allowed_gateway = array( 'bacs' ); foreach( $available_gateways as $gateway_id => $gateway ){ if( !in_array( $gateway_id, $allowed_gateway ) ){ unset( $available_gateways[$gateway_id] ); } } } return $available_gateways; }
第三步:可选样式优化(给「立即试用」按钮加专属样式)
如果需要区分试用按钮和默认加购按钮,可添加以下CSS到主题自定义CSS面板:
.trial-checkout-btn { background-color: #27ae60; color: #fff; margin-left: 8px; } .trial-checkout-btn:hover { background-color: #2ecc71; }
注意事项
- 请先测试完整流程:从产品列表点击「立即试用」→ 进入结账页调整数量(最多5件)→ 确认总价固定500 → 仅显示银行卡支付选项
- 若目标分类用slug而非ID,可将
has_term的第一个参数替换为分类slug,比如has_term( 'trial-products', 'product_cat', $product->get_id() ) - 建议将代码添加到子主题
functions.php或自定义代码插件中,避免主题更新丢失代码
内容的提问来源于stack exchange,提问作者abdul
相关产品推荐
相关产品推荐

