如何在WooCommerce中实现购买后特定时长内免费提供同款产品
嘿,这个需求在做GPL插件/主题商城的商家中特别常见——用户买一次,就能在指定时长内免费拿到更新版本。我给你整理了两种实用方案,你可以根据自己的技术情况挑:
方案一:用现成插件快速搞定(适合非技术用户)
如果你不想折腾代码,直接用专门的许可证管理插件就能实现,推荐这两款:
Software License Manager for WooCommerce
步骤超简单:- 安装激活插件后,找到目标产品的编辑页,开启「许可证支持」
- 在许可证设置里,把有效期设为1年(或者你需要的时长),同时勾选「允许有效期内免费下载更新」
- 用户下单后,系统会自动生成带有效期的许可证,用户能在自己的账户页面查看,凭这个就能免费获取最新版本
- 还能设置过期提醒,引导用户续费
WooCommerce License Manager
逻辑差不多,它还支持批量管理许可证,适合产品多的商家,设置流程和上面类似,重点就是给产品绑定带时长的许可证权限。
方案二:自定义代码实现(适合有开发能力的用户)
如果想完全掌控功能,不想依赖第三方插件,可以用代码自定义:
第一步:给产品添加「免费获取时长」自定义字段
先在后台产品编辑页加个输入框,让你能给每个产品设置不同的免费时长:
// 在产品编辑页的常规选项里添加自定义字段 add_action('woocommerce_product_options_general_product_data', 'add_free_access_duration_field'); function add_free_access_duration_field() { woocommerce_wp_text_input(array( 'id' => '_free_access_duration', 'label' => __('免费获取时长(天)', 'woocommerce'), 'type' => 'number', 'custom_attributes' => array('min' => '1'), 'description' => '比如输入365,代表用户购买后1年内可免费获取该产品' )); } // 保存这个自定义字段的值 add_action('woocommerce_process_product_meta', 'save_free_access_duration_field'); function save_free_access_duration_field($post_id) { if (isset($_POST['_free_access_duration'])) { update_post_meta($post_id, '_free_access_duration', absint($_POST['_free_access_duration'])); } }
第二步:调整下载权限的有效期
让用户的下载权限自动匹配你设置的时长:
// 替换默认的下载有效期为自定义时长 add_filter('woocommerce_download_expiry', 'custom_download_expiry_duration', 10, 3); function custom_download_expiry_duration($expiry, $product, $order_item) { $custom_duration = get_post_meta($product->get_id(), '_free_access_duration', true); if ($custom_duration) { return $custom_duration * DAY_IN_SECONDS; // 把天数转成秒数,符合WooCommerce的时间格式 } return $expiry; // 如果没设置自定义时长,就用默认值 }
第三步:给用户显示剩余有效期
在用户账户的下载页面,加上剩余时长提示,让用户一目了然:
// 在下载链接下方显示剩余免费时长 add_action('woocommerce_available_download_after_link', 'display_download_remaining_time', 10, 1); function display_download_remaining_time($download) { if ($download['access_expires']) { $remaining_seconds = $download['access_expires'] - current_time('timestamp'); if ($remaining_seconds > 0) { $remaining_days = floor($remaining_seconds / DAY_IN_SECONDS); echo '<br><small style="color: #666;">剩余免费获取时长:' . $remaining_days . '天</small>'; } else { echo '<br><small style="color: #dc3232;">免费获取已过期</small>'; } } }
额外提示
- 如果你卖的是插件/主题,记得把新版本上传到同一个产品的「下载文件」里,这样用户在有效期内就能看到并下载最新版
- 代码要放到主题的
functions.php或者自定义插件里,别直接改核心文件,不然主题更新会丢代码 - 可以配合WooCommerce的邮件功能,给用户发购买后的时长说明,以及到期前的续费提醒
内容的提问来源于stack exchange,提问作者WP Dollar Plugins
相关产品推荐
相关产品推荐

