WooCommerce订阅 - 仅允许用户进行一次有效订阅

时间:2018-01-25 06:30:32

标签: wordpress woocommerce woocommerce-subscriptions

我正在为我的客户构建基于会员/订阅的网站,我们正在使用Woocommerce SubscriptionsWoocommerce Memberships插件。

现在问题是我的客户正在构建一些促销页面,基本上允许用户购买升级。这很好,但我的客户只需要客户(及其相关联的会员资格)的一个唯一订阅。

因此,商定的解决方案是,在购买任何新订阅产品时,应取消所有其他订阅。删除/取消所有关联成员资格,并且只有最新订阅应保持活动及其附带的成员资格。

所以我试图建立这个解决方案,但它不起作用,所以任何建议/方向都是最受欢迎的。

我尝试过:

function wp56908_new_order_housekeeping ($order_id)
{
    $args = array(
        'subscriptions_per_page' => -1,
        'customer_id'            => get_current_user_id(),
    );

    $subscriptions = wcs_get_subscriptions($args);

    foreach ($subscriptions as $subscription) {
        $s_order_id = method_exists( $subscription, 'get_parent_id' ) ? $subscription->get_parent_id() : $subscription->order->id;
        if ($s_order_id != $order_id) {
            $cancel_note = 'Customer purchased new subscription in order #' . $order_id;
            $subscription->update_status( 'cancelled', $cancel_note );
        }
    }
}
add_action( 'woocommerce_thankyou', 'wp56908_new_order_housekeeping',  10, 1  );

1 个答案:

答案 0 :(得分:0)

这是我从WooCommerce获得的有关函数wcs_get_subscriptions()问题的支持电子邮件。

  

感谢您与我们联系并向我们报告此问题!

     

我已经在本地安装中尝试过,我确认这似乎是一个   错误!我已经向我们的开发团队和补丁报告过了   应该包含在下一次更新中。到现在为止,如果你真的很匆忙   并希望让它工作,你可以搜索这个代码(在   wcs-functions.php第483行:

     

//我们需要限制对包含某些内容的订阅   产品/变异if((0!= $ args [' product_id']&& is_numeric(   $ args [' product_id']))|| (0!= $ args [' variation_id']&& is_numeric(   $ args [' variation_id']))){$ query_args [' post__in'] =   wcs_get_subscriptions_for_product(array($ args [' product_id'],   $ args [' variation_id'])); }

     

并将其替换为:

     

//我们需要限制对包含某些内容的订阅   产品/变异if((0!= $ args [' product_id']&& is_numeric(   $ args [' product_id']))|| (0!= $ args [' variation_id']&& is_numeric(   $ args [' variation_id']))){$ prod_args = array($ args [' product_id'],   $ args [' variation_id']); $ prod_args = array_filter($ prod_args,   function($ prod_args){return($ prod_args!== 0); });   $ query_args [' post__in'] = wcs_get_subscriptions_for_product(   $ prod_args); }

     

请注意,这不是理想的解决方案,因为您将会这样做   直接修改我们的插件代码,这些更改可能会丢失   更新后,但如果您对代码感到满意并想要采取   作为临时解决方法的风险,直到我们添加适当的补丁   我们的插件,你可以做到。 ;)

     

如果您需要任何帮助,请告诉我们!

     

谢谢,Bernat