如何通过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
相关产品推荐
相关产品推荐

