【问题标题】:WooCommerce Subscriptions - Check if product already has an active subscriberWooCommerce 订阅 - 检查产品是否已有活跃订阅者
【发布时间】:2016-12-29 22:31:28
【问题描述】:

我正在使用插件“WooCommerce 订阅”,我想检查产品是否在系统中已经有活跃订阅者

我只希望每个产品有 1 个订阅者。有一个过滤器可以检查它,但我不知道如何使用它:
https://docs.woocommerce.com/document/subscriptions/develop/filter-reference/

我如何使用这些函数或钩子来实现这一点?

谢谢

【问题讨论】:

    标签: php wordpress woocommerce product woocommerce-subscriptions


    【解决方案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() 原生订阅功能,在我的代码中获取已定义用户 ID 的订阅。


    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 替换为产品 ID,例如,如果产品 ID 为 124):

    If ( has_an_active_subscriber( 124 ) )  //do something
    

    您可以使用此条件函数,尤其是在 add-to-cart (订阅) 模板(您必须从订阅中复制插件模板文件夹到您的活动theme's woocommerce template folder...)

    所有代码都经过测试且功能齐全

    参考文献:

    【讨论】:

      猜你喜欢
      • 2017-06-18
      • 2021-07-01
      • 2019-07-29
      • 1970-01-01
      • 2021-01-25
      • 1970-01-01
      • 2017-12-03
      • 2017-02-16
      • 2021-03-16
      相关资源
      最近更新 更多