无需创建产品,用WooCommerce Subscription实现5美元日订阅的技术问询
可行方案及代码实现
要实现无需后台创建产品、通过短码传递参数的每日订阅支付,你需要基于WooCommerce Subscriptions插件(必须先安装激活)自定义短码,动态生成临时订阅商品并处理购物车逻辑。以下是完整代码和使用说明:
步骤1:添加自定义短码及相关逻辑
将以下代码添加到你的主题functions.php文件或自定义插件中:
// 注册动态订阅短码 add_shortcode('dynamic_subscription', 'generate_dynamic_subscription_shortcode'); function generate_dynamic_subscription_shortcode($atts) { // 提取短码参数,设置默认值 $atts = shortcode_atts(array( 'price' => '5', 'interval' => 'day', 'subscription_name' => '每日5美元订阅', 'interval_count' => '1' // 每次周期的数量,比如1天 ), $atts, 'dynamic_subscription'); // 清理价格参数,确保是数字 $price = floatval(str_replace('$', '', $atts['price'])); // 生成唯一的临时产品ID(避免冲突) $temp_product_id = 'temp_sub_' . md5($atts['subscription_name'] . $price . $atts['interval']); // 生成添加到购物车的URL $add_to_cart_url = wc_get_add_to_cart_url($temp_product_id); $add_to_cart_url = add_query_arg(array( 'temp_sub_price' => $price, 'temp_sub_interval' => $atts['interval'], 'temp_sub_name' => $atts['subscription_name'], 'temp_sub_interval_count' => $atts['interval_count'] ), $add_to_cart_url); // 返回订阅按钮HTML return '<a href="' . esc_url($add_to_cart_url) . '" class="button alt">' . esc_html($atts['subscription_name']) . ' - $' . esc_html($price) . '/' . esc_html($atts['interval']) . '</a>'; } // 验证临时订阅产品的添加请求 add_filter('woocommerce_add_to_cart_validation', 'validate_temp_subscription_add_to_cart', 10, 3); function validate_temp_subscription_add_to_cart($passed, $product_id, $quantity) { // 检查是否是临时订阅产品 if (strpos($product_id, 'temp_sub_') !== false && isset($_GET['temp_sub_price'])) { $passed = true; } return $passed; } // 保存临时订阅产品的数据到购物车项 add_filter('woocommerce_add_cart_item_data', 'add_temp_subscription_cart_item_data', 10, 2); function add_temp_subscription_cart_item_data($cart_item_data, $product_id) { if (strpos($product_id, 'temp_sub_') !== false && isset($_GET['temp_sub_price'])) { // 存储临时订阅的参数 $cart_item_data['temp_subscription'] = array( 'price' => floatval($_GET['temp_sub_price']), 'interval' => sanitize_text_field($_GET['temp_sub_interval']), 'name' => sanitize_text_field($_GET['temp_sub_name']), 'interval_count' => intval($_GET['temp_sub_interval_count']), 'unique_key' => md5(microtime() . rand()) // 确保每个购物车项唯一 ); // 设置自定义产品ID标识 $cart_item_data['product_id'] = $product_id; WC()->session->set('temp_subscription_data', $cart_item_data['temp_subscription']); } return $cart_item_data; } // 从会话中恢复临时订阅产品对象 add_filter('woocommerce_get_cart_item_from_session', 'get_temp_subscription_cart_item_from_session', 10, 2); function get_temp_subscription_cart_item_from_session($cart_item, $values) { if (isset($values['temp_subscription'])) { $temp_sub_data = $values['temp_subscription']; // 创建临时订阅产品对象 $product = new WC_Product_Subscription(); $product->set_name($temp_sub_data['name']); $product->set_price($temp_sub_data['price']); $product->set_regular_price($temp_sub_data['price']); $product->set_subscription_interval($temp_sub_data['interval']); $product->set_subscription_interval_count($temp_sub_data['interval_count']); $product->set_status('publish'); $product->set_virtual(true); // 设置为虚拟产品,避免配送设置 $product->set_sold_individually(true); // 替换购物车项中的产品对象 $cart_item['data'] = $product; $cart_item['temp_subscription'] = $temp_sub_data; } return $cart_item; } // 修复购物车页面的产品链接(避免指向不存在的产品) add_filter('woocommerce_cart_item_permalink', 'remove_temp_subscription_permalink', 10, 2); function remove_temp_subscription_permalink($permalink, $cart_item) { if (isset($cart_item['temp_subscription'])) { $permalink = '#'; } return $permalink; }
步骤2:使用短码
在页面或文章中插入以下短码,即可生成每日5美元的订阅按钮:
[dynamic_subscription price="5" interval="day" subscription_name="每日5美元订阅"]
点击按钮后,该订阅商品会被加入购物车,你可以继续使用现有的[woocommerce_checkout]短码完成结账流程。
关键注意事项
- 必须安装并激活WooCommerce Subscriptions插件,核心WooCommerce不支持订阅功能。
- 确保你的支付网关支持订阅支付(如Stripe、PayPal Express等)。
- 临时订阅产品仅存在于用户会话中,不会在后台产品列表中创建实体产品。
内容的提问来源于stack exchange,提问作者Elangamani
相关产品推荐
相关产品推荐

