WordPress 4.9.4中如何获取WooCommerce特定会员计划的所有用户?
嘿,针对你在WordPress 4.9.4搭配WooCommerce和Memberships插件时遇到的「获取特定会员计划所有用户」的问题,我给你梳理下最靠谱的解决方案——优先用插件官方提供的函数,而不是直接写原生SQL查询,毕竟直接操作数据表很容易因为插件版本(哪怕你现在用的是旧版本)的结构变化踩坑,之前你查数据表没得到预期结果大概率就是这个原因。
一、优先使用WooCommerce Memberships官方函数
WooCommerce Memberships专门提供了wc_memberships_get_users_for_membership_plan()函数来干这个事,它会自动处理会员的关联关系、状态过滤,完全不用你自己去拼复杂的SQL。
代码示例
假设你的$memberships是会员计划的对象或者ID,直接这么用:
// 先确保拿到会员计划的ID $membership_plan_id = is_object( $memberships ) ? $memberships->ID : $memberships; // 获取该计划下的所有用户(默认返回所有关联状态的用户,包括有效、过期等) $plan_users = wc_memberships_get_users_for_membership_plan( $membership_plan_id ); // 如果你只想获取「有效」状态的会员,加个参数过滤 // $plan_users = wc_memberships_get_users_for_membership_plan( $membership_plan_id, array( 'status' => 'active' ) ); // 遍历输出用户信息 if ( ! empty( $plan_users ) ) { foreach ( $plan_users as $user ) { echo "用户ID: {$user->ID},用户名: {$user->user_login}<br>"; } } else { echo "该会员计划暂无关联用户"; }
这个函数返回的是WP_User对象数组,直接就能用WordPress的用户方法调用,非常方便。
二、为什么直接查数据表没结果?
WooCommerce Memberships的用户-会员计划关联数据存在wp_wc_user_memberships表(注意你的数据库前缀可能不是wp_),其中plan_id字段对应会员计划的ID,user_id对应用户ID,status字段标记会员状态(比如active、expired等)。
如果你一定要用原生查询(不推荐,因为插件版本更新可能改表结构),可以参考下面的代码:
global $wpdb; $membership_plan_id = is_object( $memberships ) ? $memberships->ID : $memberships; // 查询有效会员的用户ID $user_ids = $wpdb->get_col( $wpdb->prepare( " SELECT user_id FROM {$wpdb->prefix}wc_user_memberships WHERE plan_id = %d AND status = 'active' ", $membership_plan_id ) ); // 转换成WP_User对象数组 $plan_users = ! empty( $user_ids ) ? get_users( array( 'include' => $user_ids ) ) : array();
你之前查数据表没得到预期结果,可能是没关联用户表,或者没过滤状态,或者用错了表名/字段名。
三、关于钩子的使用
如果是需要在某个特定动作触发时获取这些用户(比如会员计划更新、新用户加入会员时),可以用WooCommerce Memberships提供的钩子,比如:
wc_memberships_user_added_to_membership_plan:用户加入会员计划时触发wc_memberships_membership_plan_updated:会员计划更新时触发
但如果只是单纯获取特定计划的用户列表,直接用前面的官方函数就够了,不需要额外使用钩子。
内容的提问来源于stack exchange,提问作者Aviv

