这是我的第一个问题,我无法找到解决方案:
我们正在运行电子学习平台以及销售课程的电子商务系统,可以通过两种方式购买,全价或每月订阅,所有这些都安装了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,我知道它并不多,但它让我很生气,因为没有定义的功能。
你认为对于这种特殊情况有更好的方法吗?
改进上面的代码?
也许我错过了官方的功能/方法?
感谢社区,对于长篇文章以及可能存在的任何拼写错误感到抱歉。 祝你有个美好的一天。