WooCommerce中如何获取自定义慈善字段值并添加为购物车费用?
解决WooCommerce自定义慈善捐款字段添加购物车费用的问题
嘿,我懂你的困扰——前端加了自定义字段,但PHP里死活拿不到值对吧?这是因为结账页面的自定义字段数据得先通过AJAX传到后台,PHP才能获取并处理。下面是完整的解决方案,你直接把代码加到主题的functions.php里就行,不用自己折腾jQuery:
第一步:用AJAX把字段值传到后台
这段代码会自动注册AJAX接口,同时输出监听字段变化的脚本,把捐款金额传到后台并存进用户会话:
// 注册AJAX动作(支持登录/未登录用户) add_action('wp_ajax_save_charity_amount', 'save_charity_amount_to_session'); add_action('wp_ajax_nopriv_save_charity_amount', 'save_charity_amount_to_session'); function save_charity_amount_to_session() { if (isset($_POST['charity_amount'])) { // 验证输入是合法数字,防止恶意内容 $charity_amount = floatval($_POST['charity_amount']); // 把金额存进WooCommerce会话 WC()->session->set('charity_donation', $charity_amount); } wp_die(); // 必须结束AJAX请求,否则会返回多余内容 } // 输出监听字段的jQuery脚本 add_action('wp_footer', 'charity_field_ajax_script'); function charity_field_ajax_script() { // 只在结账页面加载脚本,避免多余请求 if (!is_checkout()) return; ?> <script> jQuery(document).ready(function($) { // 监听自定义捐款字段的输入/变化事件 $('input[name="add_for_charity_field"]').on('input change', function() { var amount = $(this).val(); // 发送AJAX请求到后台 $.ajax({ url: '<?php echo admin_url('admin-ajax.php'); ?>', type: 'POST', data: { action: 'save_charity_amount', charity_amount: amount }, success: function() { // 触发结账页面更新,让费用立即显示出来 $('body').trigger('update_checkout'); } }); }); }); </script> <?php }
第二步:从会话取金额并添加到购物车费用
用WooCommerce的钩子,在计算购物车总额时自动加上捐款费用:
add_action('woocommerce_cart_calculate_fees', 'add_charity_donation_fee'); function add_charity_donation_fee($cart) { if (is_admin() && !defined('DOING_AJAX')) return; // 从会话里取出之前存的捐款金额 $charity_amount = WC()->session->get('charity_donation'); // 只有金额大于0时才添加费用 if ($charity_amount > 0) { $cart->add_fee(__('慈善捐款', 'woocommerce'), $charity_amount); } }
第三步:清空购物车时同步清空会话(可选但推荐)
防止用户下次购物时,会话里还残留着上次的捐款金额:
add_action('woocommerce_cart_emptied', 'clear_charity_donation_session'); function clear_charity_donation_session() { WC()->session->__unset('charity_donation'); }
小提醒:
- 确保你的自定义字段
name确实是add_for_charity_field,如果不是,要把代码里的input[name="add_for_charity_field"]改成你实际的字段名。 - 代码里的
__('慈善捐款', 'woocommerce')是费用的显示名称,你可以改成自己需要的文字,比如“爱心捐款”。 - 测试的时候,在结账页面输入金额,应该能看到购物车总额里自动加上这笔费用。
内容的提问来源于stack exchange,提问作者Javad Yousefi
相关产品推荐
相关产品推荐

