WordPress后台自定义页面统计过期WooCommerce订阅总数显示异常
修复WooCommerce过期订阅统计始终显示0的问题
原代码的问题点
- 变量拼写错误:
$subscription_expiry_coun少了末尾的t,导致计数根本无法累加 wcs_get_users_subscriptions()返回的是订阅数组,不是单个订阅对象,不能直接调用->has_status()方法- 如果
$users变量没正确获取到所有用户,也会直接导致统计无效
修正后的代码实现
方法1:遍历用户统计(适合需要关联用户信息的场景)
$subscription_expiry_count = 0; // 获取所有用户,需要筛选用户的话可以添加get_users()的参数 $users = get_users(); foreach ($users as $user) { // 获取当前用户的所有订阅 $user_subscriptions = wcs_get_users_subscriptions($user->ID); // 循环每个订阅判断状态 if (!empty($user_subscriptions)) { foreach ($user_subscriptions as $subscription) { if ($subscription->has_status('expired')) { $subscription_expiry_count++; } } } } echo '<div><p>Total Expired Subscriptions</p><p>' . $subscription_expiry_count . '</p></div>';
方法2:直接查询订阅(更高效,无需遍历所有用户)
WooCommerce订阅是自定义文章类型shop_subscription,可以直接用WP_Query查询状态为expired的订阅,性能比遍历用户好很多:
// 查询所有过期订阅 $expired_subscriptions = new WP_Query(array( 'post_type' => 'shop_subscription', 'post_status' => 'expired', 'posts_per_page' => -1, 'fields' => 'ids', // 只获取ID,提升查询性能 )); $subscription_expiry_count = $expired_subscriptions->found_posts; echo '<div><p>Total Expired Subscriptions</p><p>' . $subscription_expiry_count . '</p></div>';
注意事项
- 方法2更适合订阅量或用户量较大的场景,避免循环所有用户的额外开销
- 确保WooCommerce Subscriptions插件已正常激活,否则相关函数和自定义文章类型不会生效
- 把代码放到你自定义插件的后台页面回调函数里,就能在后台页面显示统计结果了
内容的提问来源于stack exchange,提问作者Ferran Mark
相关产品推荐
相关产品推荐

