如何从WC_Memberships数组对象中输出会员计划名称与状态值?
获取WooCommerce会员计划名称与状态的正确方法
先看你给出的var_dump输出,核心问题一下就找到了:$memberships[0]是一个对象(WC_Memberships_Integration_Subscriptions_User_Membership实例),不是数组,你之前用数组下标['plan']的访问方式不符合PHP对象的语法规则,自然取不到值。
正确获取计划名称(name)的写法
针对你要的plan里的name,直接用PHP对象的属性访问符->即可:
if (!empty($memberships)) { // 先做安全判断,避免属性不存在导致报错 if (isset($memberships[0]->plan) && is_object($memberships[0]->plan)) { echo $memberships[0]->plan->name; } }
简单解释:$memberships[0]是会员对象,它的plan属性本身也是一个对象(WC_Memberships_Integration_Subscriptions_Membership_Plan实例),而name是这个计划对象的公开属性,所以用->层层访问就没问题。
获取会员状态(status)的方法
从你给出的var_dump片段里没看到直接的status公开属性,但WooCommerce Memberships的用户会员类通常会提供公开的 getter 方法来获取受保护的属性值(毕竟大部分核心属性都是protected的,不能直接访问),你可以试试官方推荐的get_status()方法:
if (!empty($memberships)) { $membership = $memberships[0]; // 先检查对象是否有这个方法,避免调用不存在的方法报错 if (method_exists($membership, 'get_status')) { echo $membership->get_status(); } }
为什么之前的方法失效?
- 方式一:你遍历
$memberships[0](对象)时,foreach会取出对象的公开属性值,但plan本身是对象,你再用$membership["plan"]去访问,相当于把属性值(对象)当成数组来用,逻辑完全错误。 - 方式二:直接用
$memberships[0]['plan']['name']是把普通对象当数组访问,只有实现了ArrayAccess接口的对象才能这么用,显然这个会员对象没实现该接口,所以会抛出错误。
内容的提问来源于stack exchange,提问作者Looq
相关产品推荐
相关产品推荐

