это мой первый вопрос здесь, я не могу найти решение для этого:
Мы используем платформу электронного обучения и систему электронной коммерции для продажи курсов, которые можно приобрести двумя способами: по полной цене или с ежемесячной подпиской. Все это подключено с помощью 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;
}
}
И если эта функция возвращает ложь (я резюмировал, опуская 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, я знаю, что это немного, но меня бесит, что для этого нет определенных функций.
Как вы думаете, есть лучший подход для этого конкретного случая?
Улучшить код выше?
Может быть, мне не хватает официальной функции / метода?
Спасибо сообществу, извините за длинный пост и за любые орфографические ошибки, которые могут возникнуть.
Хорошего дня.
Задача ещё не решена.
Других решений пока нет …