【问题标题】:WooCommerce Subscriptions - Only Allow user one active subscriptionWooCommerce 订阅 - 仅允许用户一个有效订阅
【发布时间】:2018-07-04 08:23:38
【问题描述】:

我正在为我的客户建立一个基于会员/订阅的网站,我们正在使用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  );

【问题讨论】:

  • 如果将订阅状态设置为过期怎么办?究竟是什么不工作?
  • @AndrewSchultz - 该代码不会取消任何其他订阅,因此用户最终会获得多个订阅。也不会抛出任何错误
  • 这个函数附在什么钩子上?
  • @AndrewSchultz - woocommerce_thankyou
  • @JohanRheeder 是的,在您的代码中使用动作挂钩会更好。

标签: wordpress woocommerce woocommerce-subscriptions


【解决方案1】:

这是我从 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, 功能($prod_args){返回($prod_args!== 0); }); $query_args['post__in'] = wcs_get_subscriptions_for_product( $prod_args ); }

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

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

谢谢,伯纳特

【讨论】:

    猜你喜欢
    • 2019-01-03
    • 2019-04-09
    • 2017-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-19
    • 2011-12-01
    相关资源
    最近更新 更多