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

无需创建产品,用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 10:42:47