WooCommerce订阅缺少“已完成”状态

时间:2017-01-05 18:49:15

标签: php wordpress woocommerce subscriptions

这是我的第一个问题,我无法找到解决方案:

我们正在运行电子学习平台以及销售课程的电子商务系统,可以通过两种方式购买,全价或每月订阅,所有这些都安装了WordPress(Sensei + WooCommerce - 已安装订阅插件 - )

WoordPress Ver。:4.5.2

WooCommerce Ver。:2.5.5

订阅版本:2.1.2

为了让用户进入课程,我们需要检查该用户是否有有效/已完成订阅或已完成订单。

第一个问题,订阅没有已完成状态,而系统会将其标记为已取消,我了解完整订阅是指所有付款均为完成了,所以这个功能完全没用:

wcs_user_has_subscription( $user_id, $product_id, 'cancelled' )

因为已取消订阅可能会丢失付款。

所以我创建了这个函数:

foreach ( wcs_get_users_subscriptions( $user_id ) as $subscription ) {
    $sub_wc = new WC_Subscription( $subscription->id );

    // Only for testing, we only need the first product.
    $product = reset( $sub_wc->get_items() );

    $done_payments  = $sub_wc->get_completed_payment_count();
    $total_payments = WC_Subscriptions_Product::get_length( $item['product_id'] );

    if( ( $total_payments == $done_payments ) || $sub_wc->post_status == 'wc-active' ) {
        $result = true;
    }
}

如果该函数返回false(我已经汇总,省略return),我们需要检查已完成的订单,但与订阅无关,因为每个订阅可以包含多个订阅一个订单(父订单,续约等),所以这个功能没用:

wc_customer_bought_product( $current_user->user_email, $current_user->ID, $product_id )

你可能会问,为什么? 如果您不使用订阅,这些功能可以正常使用,请记住已取消订阅可以有2个已完成订单,此功能将返回true因为它确实如果订单与订阅有关,则无关紧要。

所以对于这种情况我创建了这个函数:

$user_completed_orders = get_posts( array(
    'numberposts' => -1,
    'meta_key'    => '_customer_user',
    'meta_value'  => $user->ID,
    'post_type'   => 'shop_order',
    'post_status' => 'wc-completed'
) );

foreach ( $completed_orders as $completed_order ) {
    $order_wc = new WC_Order( $completed_order->ID );

    // We only want orders not related with any subscriptions
    if( !wcs_order_contains_subscription( $order_wc ) ) {

        // Check if the user purchased the product
        // Only for testing, we only need the first product.
        $product = reset( $order_wc->get_items() );
        if( $product['product_id'] == $product_id ) {
            $result = true;
        }
    }
}

所有这一切导致负载增加,我们从大约6-7秒的负载变为14,我知道它并不多,但它让我很生气,因为没有定义的功能。

你认为对于这种特殊情况有更好的方法吗?

改进上面的代码?

也许我错过了官方的功能/方法?

感谢社区,对于长篇文章以及可能存在的任何拼写错误感到抱歉。 祝你有个美好的一天。

0 个答案:

没有答案