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

如何通过JS将动态费用传递到WP User Frontend的$pay_per_cost变量

实现WP User Frontend动态付费定价的方案

步骤1:发文页表单新增字段存储计算结果

在你现有发文页的主表单DOM中插入一个隐藏输入框,用于承载JS侧计算完成的总费用:

<input type="hidden" name="custom_total_cost" id="custom_total_cost" value="" />
<!-- 建议同步新增隐藏字段存储用户选中的增值服务ID,用于后续服务端校验 -->
<input type="hidden" name="selected_addon_ids" id="selected_addon_ids" value="" />

更新你已有的jQuery计算逻辑,每次用户切换单选/复选框重新算费时,同步把总费用、选中的增值服务ID写入上述两个隐藏字段:

// 你的原有计算逻辑
let baseCost = 10; // 基础发文费
let selectedAddons = []; // 存储选中的增值服务ID
let totalCost = baseCost;
// 遍历选中的增值服务累加费用
$('.addon-item:checked').each(function(){
    totalCost += parseFloat($(this).data('price'));
    selectedAddons.push($(this).val());
});
// 写入隐藏字段
$('#custom_total_cost').val(totalCost);
$('#selected_addon_ids').val(selectedAddons.join(','));

步骤2:表单提交后存储自定义金额到服务端

将以下代码添加到WordPress主题的functions.php文件或自定义功能插件中,通过WP User Frontend提供的提交后钩子存储用户提交的金额信息,这里推荐用Transient存储(兼容性比session更好,避免部分主机禁用session的问题):

// 表单提交后存储自定义金额
add_action('wpuf_after_post_submit', 'save_custom_payment_cost', 10, 2);
function save_custom_payment_cost($post_id, $form_settings) {
    // 校验参数合法性
    if (!isset($_POST['custom_total_cost']) || !is_numeric($_POST['custom_total_cost']) || !isset($_POST['selected_addon_ids'])) {
        return;
    }
    $user_id = get_current_user_id();
    $custom_cost = floatval($_POST['custom_total_cost']);
    $selected_addons = sanitize_text_field($_POST['selected_addon_ids']);
    
    // ===== 安全校验:服务端二次计算金额,避免前端篡改价格 =====
    $base_cost = 10; // 和前端一致的基础发文费
    $addon_price_map = [ // 服务端存储所有增值服务的定价,key为服务ID,value为价格
        '1' => 5,
        '2' => 8,
        '3' => 12
    ];
    $server_calculated_cost = $base_cost;
    $addon_arr = explode(',', $selected_addons);
    foreach ($addon_arr as $addon_id) {
        if (isset($addon_price_map[$addon_id])) {
            $server_calculated_cost += $addon_price_map[$addon_id];
        }
    }
    // 前端传的金额和服务端计算结果不一致直接拦截,返回错误
    if (abs($custom_cost - $server_calculated_cost) > 0.01) {
        wp_delete_post($post_id); // 删除刚生成的待支付文章
        wp_die('价格校验失败,请返回重试');
    }
    
    // 校验通过后存储金额,设置30分钟有效期
    $transient_key = 'custom_pay_cost_' . $post_id . '_' . $user_id;
    set_transient($transient_key, $custom_cost, 30 * 60);
}

步骤3:支付页替换默认的$pay_per_cost变量

继续添加过滤钩子代码,在支付页加载时优先读取你存储的自定义金额,替换插件默认的静态定价:

add_filter('wpuf_pay_per_post_cost', 'override_default_pay_cost', 10, 3);
function override_default_pay_cost($default_cost, $post_id, $user_id) {
    $transient_key = 'custom_pay_cost_' . $post_id . '_' . $user_id;
    $custom_cost = get_transient($transient_key);
    if ($custom_cost !== false && is_numeric($custom_cost) && $custom_cost >= 0) {
        // 使用完就删除缓存,避免重复调用
        delete_transient($transient_key);
        return $custom_cost;
    }
    // 无自定义金额时回退到插件默认配置的静态价格
    return $default_cost;
}

内容的提问来源于stack exchange,提问作者Tommaso Puccioni

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 15:18:03