You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 07:41:48