Подписки WooCommerce - проверьте, есть ли у продукта уже активный подписчик
Я использую плагин "Подписки WooCommerce" и хочу проверить, есть ли у продукта активный подписчик в системе
Я хочу только 1 подписчика на продукт. Для проверки есть фильтр, но я не знаю, как его использовать:
https://docs.woocommerce.com/document/subscriptions/develop/filter-reference/
Как я могу использовать эти функции или хуки, чтобы добиться этого?
Спасибо
1 ответ
Эта сделанная на заказ условная функция вернет true
если подписной продукт уже активно используется подписчиком.
function has_an_active_subscriber( $product_id = null ){
// Empty array to store ALL existing Subscription PRODUCTS
$products_arr = array();
$products_subscr = get_posts( array(
'numberposts' => -1,
'post_status' => 'publish',
'post_type' => array( 'product', 'product_variation' ),
'meta_key' => '_subscription_price',
) );
foreach( $products_subscr as $prod_subs ) {
$products_arr[] = $prod_subs->ID;
}
// Testing if current product is a subscription product
if (in_array( $product_id, $products_arr) ){
// Declaring empties arrays
$subscribers_arr = array(); // ALL subscribers IDS
$active_subscriptions_arr = array(); // ALL actives subscriptions
$active_subscription_products_arr = array(); // ALL actif subscription products IDS IDS
$subscriber_subscriptions = array();
// Getting arrays of "active" IDS for subscribers, subscriptions orders and subscription products
$subscribers = get_users( array( 'role' => 'subscriber') );
foreach( $subscribers as $subscriber ) {
$subscriber_arr[] = $subscriber->ID;
$subscriptions = wcs_get_users_subscriptions($subscriber->ID);
foreach ($subscriptions as $key => $subscription ){
$subscription_status = $subscription->post->post_status;
if ( $subscription_status == 'wc-active' ) { // active subscriptions only
$subscription_id = $subscription->post->ID;
$order_id = $subscription->order->post->ID; // order ID (corresponding to the subscription ID)
$active_subscriptions_arr[] = $subscription->post->ID;
$order_items = $subscription->order->get_items();
// Getting all the products in the Order
foreach ( $order_items as $item ) {
// $item_id = $item[product_id];
// Avoiding to add existing products in the array
if( !in_array( $product_id, $active_subscription_products_arr ))
$active_subscription_products_arr[] = $item[product_id];
}
}
}
}
}
if (in_array( $product_id, $active_subscription_products_arr ) ) return true;
else return false;
}
Этот код находится в файле function.php вашей активной дочерней темы (или темы) или также в любом файле плагина.
Я просто использовал здесь wcs_get_users_subscriptions()
встроенная функция подписки, чтобы получить подписки для определенного идентификатора пользователя, в моем коде.
USAGE (для определенной переменной $product_id)
If ( has_an_active_subscriber( $product->id ) ) { // or $product_id // This product is already used by an active subscriber // DO SOMETHING HERE } else { // This product is NOT used // DO SOMETHING HERE }
Вы также можете заменить
$product_id
по идентификатору продукта здесь, например, если идентификатор продукта 124):If ( has_an_active_subscriber( 124 ) ) //do something
Вы можете использовать эту условную функцию, в частности, на
add-to-cart
(подписка) шаблоны (которые вам нужно будет скопировать из папки шаблонов плагинов подписки в папку шаблонов woocommerce вашей активной темы …)
Весь код протестирован и полностью функционален
Рекомендации: