Php 获取Woocommerce中已定义产品和用户的活动订阅计数

Php 获取Woocommerce中已定义产品和用户的活动订阅计数,php,sql,wordpress,woocommerce,woocommerce-subscriptions,Php,Sql,Wordpress,Woocommerce,Woocommerce Subscriptions,我能够知道用户是否对给定产品有活动订阅: $subscribed = WC_Subscriptions_Manager::user_has_subscription($userId, $productId, $status); 但我无法计算用户对该产品有多少订阅…(Woocommerce订阅插件现在支持用户购买多个订阅) 是否有人知道如何执行此操作?此自定义函数将在一个非常简单的SQL查询中为您提供活动订阅的计数,用于定义已用ID和特定订阅产品ID: function get_user_act

我能够知道用户是否对给定产品有活动订阅:

$subscribed = WC_Subscriptions_Manager::user_has_subscription($userId, $productId, $status);
但我无法计算用户对该产品有多少订阅…(Woocommerce订阅插件现在支持用户购买多个订阅)


是否有人知道如何执行此操作?

此自定义函数将在一个非常简单的SQL查询中为您提供活动订阅的计数,用于定义已用ID和特定订阅产品ID:

function get_user_active_subscriptions_count( $product_id, $user_id = null ) {
    global $wpdb;

    // if the user_id is not set in function argument we get the current user ID
    if( null == $user_id )
        $user_id = get_current_user_id();

    // return the active subscriptions for a define user and a defined product ID
    return $wpdb->get_var("
        SELECT COUNT(p.ID)
        FROM {$wpdb->prefix}posts as p
        LEFT JOIN {$wpdb->prefix}posts AS p2 ON p.post_parent = p2.ID
        LEFT JOIN {$wpdb->prefix}postmeta AS pm ON p2.ID = pm.post_id
        LEFT JOIN {$wpdb->prefix}woocommerce_order_items AS woi ON pm.post_id = woi.order_id
        LEFT JOIN {$wpdb->prefix}woocommerce_order_itemmeta AS woim ON woi.order_item_id = woim.order_item_id
        WHERE p.post_type LIKE 'shop_subscription' AND p.post_status LIKE 'wc-active'
        AND p2.post_type LIKE 'shop_order' AND woi.order_item_type LIKE 'line_item'
        AND pm.meta_key LIKE '_customer_user' AND pm.meta_value = '$user_id'
        AND woim.meta_key = '_product_id'
        AND woim.meta_value = '$product_id'
    ");
}
代码进入活动子主题(或活动主题)的function.php文件。测试和工作


已定义产品ID的用法
9
和:

  • 用户ID作为动态变量
    $user\u ID

    回显“订阅计数:”。获取\u用户\u活动\u订阅\u计数('9',$user\u id)。'

    ",

  • 定义的用户ID(此处用户ID为
    15
    ):

    回显“订阅计数:”。获取用户活动订阅数('9','15')。'

    ",

  • 当前用户ID:

    回显“订阅计数:”。获取用户活动订阅计数('9')。'

    ",

  • 产品ID也可以是动态的,使用变量而不是整数(对于产品ID)


    更新:要获取定义的已用ID(在非常简单的SQL查询中)的活动订阅中产品订阅的总计数,请执行以下操作:

    代码进入活动子主题(或活动主题)的function.php文件。测试和工作


    用法与上述相同,但结果将不同,因为您将获得活动订阅中定义的产品订阅的总和(对于定义的用户ID(因此它将对用户ID所做订阅中与定义的产品ID对应的所有项目的数量求和))…

    同时,我认为这是可行的。我不知道它的效率有多高,但答案似乎是正确的——给定特定的用户和特定的产品,这将返回用户对该产品的订阅量。 (确保在$user\u id变量中提供Wordpress用户id,在$product\u id变量中提供Woocommerce产品id。)


    $allSubscriptions=WC\u Subscriptions\u Manager::get\u users\u Subscriptions($user\u id);
    $item_数量=0;
    foreach($allSubscriptions作为$subscription){
    如果($subscription['status']==“active”| |$subscription['status']==“pending cancel”)==false)继续;
    $order=wc_get_order($subscription['order_id']);
    //迭代顺序中的每个行项目
    foreach($order->get\u items()作为$item\u id=>$item\u数据){
    如果($item\u data->get\u product()->get\u id()!=$product\u id)继续;
    $item_quantity+=$item_data->get_quantity();
    }
    }
    回显“数量:”.$item_数量。“
    ”;
    感谢您的回答。但如果我读对了,它会返回用户所有活动订阅的计数?我真的想知道用户对特定产品的订阅数量(我有产品id和用户id).对。不过,我想再次获得已定义用户id和已定义产品id的活动订阅计数。(“…对于给定产品”)@ariel我已经更新了我的答案…我使用的代码是一个简单、独特、轻松、快速的查询…请尝试一下。谢谢。嗯。它没有给我与我的建议相同的答案。我已经为一个用户设置了由多个产品组成的多个订阅。总共,该用户在3个单独的订阅中订购了相同的订阅产品10次s、 我的答案是10,这是正确的。对于你的答案,我得到了3。现在,3确实是这个用户拥有的包含给定产品的订阅数。但是在其中一些订阅中,他订阅了该产品多次。@Ariel抱歉,你的问题真的不清楚……你在哪里问活动订阅数ns用户是否拥有(对于给定产品)?但不是此用户具有相同ID的订阅产品的数量。因此,关于您的问题,此答案是正确的。WC_订阅\u管理器::get_用户\u订阅已弃用,因为2.0版请使用wcs_get_用户\u订阅
    function get_user_active_product_subscriptions_count( $product_id, $user_id = null ) {
        global $wpdb;
    
        // if the user_id is not set in function argument we get the current user ID
        if( null == $user_id )
            $user_id = get_current_user_id();
    
        // return the active subscriptions for a define user and a defined product ID
        return $wpdb->get_var("
            SELECT sum(woim2.meta_value)
            FROM {$wpdb->prefix}posts as p
            LEFT JOIN {$wpdb->prefix}posts AS p2 ON p.post_parent = p2.ID
            LEFT JOIN {$wpdb->prefix}postmeta AS pm ON p2.ID = pm.post_id
            LEFT JOIN {$wpdb->prefix}woocommerce_order_items AS woi ON pm.post_id = woi.order_id
            LEFT JOIN {$wpdb->prefix}woocommerce_order_itemmeta AS woim ON woi.order_item_id = woim.order_item_id
            LEFT JOIN {$wpdb->prefix}woocommerce_order_itemmeta AS woim2 ON woim.order_item_id = woim2.order_item_id
            WHERE p.post_type LIKE 'shop_subscription' AND p.post_status LIKE 'wc-active'
            AND p2.post_type LIKE 'shop_order' AND woi.order_item_type LIKE 'line_item'
            AND pm.meta_key LIKE '_customer_user' AND pm.meta_value = '$user_id'
            AND woim.meta_key = '_product_id' AND woim.meta_value = '$product_id'
            AND woim2.meta_key = '_qty'
        ");
    }
    
    $allSubscriptions = WC_Subscriptions_Manager::get_users_subscriptions($user_id);
    $item_quantity = 0;
    foreach ($allSubscriptions as $subscription){
        if (($subscription['status'] == 'active' || $subscription['status'] == 'pending-cancel') == false) continue;
        $order = wc_get_order($subscription['order_id']);
        // Iterating through each line-item in the order
        foreach ($order->get_items() as $item_id => $item_data) {
            if ($item_data->get_product()->get_id() != $product_id) continue;
            $item_quantity += $item_data->get_quantity();
        }
    }
    echo 'Quantity: ' . $item_quantity . '<br>';