WordPress 中如何获取 Billing phone number
支付老李
结论
WooCommerce 的 Billing phone number 保存在用户元数据中,对应的 meta key 是 billing_phone,不属于 WP_User->data 的字段。应使用 get_user_meta() 获取:
$billing_phone = get_user_meta( $user->ID, 'billing_phone', true );
不要使用:
$user->data->billing_phone
修改后的代码
if ( ! function_exists( 'my_custom_users_list' ) ) {
function my_custom_users_list() {
$users = get_users();
$list_html = '<ul>';
foreach ( $users as $user ) {
$billing_phone = get_user_meta(
$user->ID,
'billing_phone',
true
);
$list_html .= '<li>'
. 'ID: ' . esc_html( $user->ID ) . '<br />'
. 'Username: ' . esc_html( $user->user_login ) . '<br />'
. 'Nice Name: ' . esc_html( $user->user_nicename ) . '<br />'
. 'Display Name: ' . esc_html( $user->display_name ) . '<br />'
. 'Email: ' . esc_html( $user->user_email ) . '<br />'
. 'URL (website): ' . esc_url( $user->user_url ) . '<br />'
. 'Registration Date: ' . esc_html( $user->user_registered ) . '<br />'
. 'User Phone number: '
. esc_html( $billing_phone ?: '未填写' )
. '<br />'
. '</li>';
}
$list_html .= '</ul>';
return $list_html;
}
}
function register_my_users_list_shortcode() {
add_shortcode( 'my-users-list', 'my_custom_users_list' );
}
add_action( 'init', 'register_my_users_list_shortcode' );
然后在页面或文章中加入:
[my-users-list]
原因
$user->data 主要包含 wp_users 数据表中的核心字段,例如:
IDuser_loginuser_emailuser_urluser_registereddisplay_name
WooCommerce 的账单电话通常保存在 wp_usermeta 表中,对应的 key 是 billing_phone。读取这类字段需要调用:
get_user_meta( $user_id, 'billing_phone', true );
第三个参数设为 true 时,函数会直接返回单个值;不传 true 则会返回数组。
也可以通过 WP_User 对象读取用户元数据:
$billing_phone = $user->get( 'billing_phone' );
不过,显式调用 get_user_meta() 能更清楚地表明该字段来自用户元数据。
如果仍然获取不到
先确认该用户是否保存了 billing_phone:
$all_meta = get_user_meta( $user->ID );
可以在调试环境中临时查看:
echo '<pre>';
print_r( $all_meta );
echo '</pre>';
如果找不到 billing_phone 或它的值为空,常见原因包括:
- 用户没有在 WooCommerce 的账户账单地址中填写电话号码。
- 电话号码只保存在某一笔订单中,没有同步到用户资料。
- 用户未登录结账,因此订单没有对应的 WordPress 用户。
- 其他插件使用了不同的 meta key,例如自定义的
phone_number。
订单账单电话和用户账单电话是两份不同的数据。要读取某笔 WooCommerce 订单中的电话号码,应从订单对象中获取:
$order = wc_get_order( $order_id );
if ( $order ) {
$billing_phone = $order->get_billing_phone();
}
如果需要列出注册用户资料中的账单电话,使用 get_user_meta( $user->ID, 'billing_phone', true ) 即可。
安全与隐私注意事项
电话号码属于个人信息,不建议通过公开短代码向所有访客展示。至少应加入权限检查,例如只允许管理员查看:
if ( ! current_user_can( 'list_users' ) ) {
return '<p>您没有权限查看用户列表。</p>';
}
输出用户资料时,还应使用 esc_html() 等转义函数,避免其中的异常内容被直接渲染成 HTML。
备注:内容仅供参考。
