如何通过短代码显示WooCommerce优惠券输入框并实现结算页应用
WooCommerce 自定义优惠券输入框适配方案
核心调整逻辑
原方案仅实现了短代码输出优惠券输入框的基础功能,我们主要新增3部分逻辑适配需求:
- 复用WooCommerce原生优惠券校验规则,自动核验优惠券的有效期、使用门槛、适用商品范围、剩余可用额度等所有规则
- 提交优惠券后自动写入购物车会话数据,打开结算页直接识别已应用的优惠券,无需用户重复输入
- 新增前端实时反馈,校验成功/失败都在当前页直接提示,无需跳转
完整可用代码
将以下代码添加到当前主题的functions.php文件,或自定义功能插件中即可生效:
// 注册优惠券输入框短代码 add_shortcode('custom_coupon_field', 'custom_coupon_input_shortcode'); function custom_coupon_input_shortcode() { // 购物车为空时不显示输入框,可按需删除该判断 if (is_admin() || !WC()->cart || WC()->cart->is_empty()) return ''; ob_start(); ?> <div class="custom-coupon-wrapper"> <input type="text" name="custom_coupon_code" id="custom_coupon_code" placeholder="请输入优惠券码"> <button type="button" id="custom_coupon_submit">应用优惠券</button> <div class="custom-coupon-notice" style="margin-top: 10px; display: none;"></div> <?php wp_nonce_field('custom_coupon_nonce', 'custom_coupon_nonce_field'); ?> </div> <script> jQuery(document).ready(function($){ $('#custom_coupon_submit').on('click', function(){ const couponCode = $('#custom_coupon_code').val().trim(); const $notice = $('.custom-coupon-notice'); if (!couponCode) { $notice.html('请输入优惠券码').css('color','red').show(); return; } $.ajax({ url: '<?php echo admin_url('admin-ajax.php'); ?>', type: 'POST', data: { action: 'apply_custom_coupon', coupon_code: couponCode, nonce: $('#custom_coupon_nonce_field').val() }, success: function(res) { if (res.success) { $notice.html(res.data).css('color','green').show(); setTimeout(() => $notice.fadeOut(), 3000); // 如需应用成功后刷新页面,可在此处添加 location.reload() } else { $notice.html(res.data).css('color','red').show(); } } }) }) }) </script> <?php return ob_get_clean(); } // 处理AJAX优惠券提交与校验 add_action('wp_ajax_apply_custom_coupon', 'apply_custom_coupon_handler'); add_action('wp_ajax_nopriv_apply_custom_coupon', 'apply_custom_coupon_handler'); function apply_custom_coupon_handler() { // 安全校验 if (!isset($_POST['nonce']) || !wp_verify_nonce($_POST['nonce'], 'custom_coupon_nonce')) { wp_send_json_error('请求非法,请刷新页面重试'); } if (empty($_POST['coupon_code'])) { wp_send_json_error('请输入优惠券码'); } $coupon_code = sanitize_text_field($_POST['coupon_code']); // 调用WooCommerce原生方法,自动完成所有规则校验并应用优惠券 $applied = WC()->cart->apply_coupon($coupon_code); if ($applied) { wp_send_json_success('优惠券应用成功,结算时自动抵扣'); } else { // 提取WooCommerce原生错误提示返回 $notices = wc_get_notices('error'); $error_msg = ''; if (!empty($notices)) { foreach ($notices as $notice) { $error_msg .= wp_kses_post($notice['notice']); } wc_clear_notices(); } wp_send_json_error($error_msg ?: '优惠券应用失败,请检查券码是否正确'); } wp_die(); } // 可选:结算页已应用优惠券时隐藏默认优惠券输入框,不需要可删除本段 add_action('woocommerce_before_checkout_form', 'hide_checkout_coupon_if_applied', 5); function hide_checkout_coupon_if_applied() { if (WC()->cart->has_discount()) { add_filter('woocommerce_coupons_enabled', '__return_false'); } }
使用方法
- 需要展示优惠券输入框的位置,直接插入短代码
[custom_coupon_field]即可,支持放在文章、页面、侧边栏小工具等任意位置 - 优惠券所有校验规则完全复用WooCommerce后台配置的规则,无需额外单独设置
- 优惠券应用成功后,打开WooCommerce结算页会自动显示已抵扣的金额,无需用户重复输入
内容的提问来源于stack exchange,提问作者matt
相关产品推荐
相关产品推荐

