PAYATHON 2026

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 数据表中的核心字段,例如:

  • ID
  • user_login
  • user_email
  • user_url
  • user_registered
  • display_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 或它的值为空,常见原因包括:

  1. 用户没有在 WooCommerce 的账户账单地址中填写电话号码。
  2. 电话号码只保存在某一笔订单中,没有同步到用户资料。
  3. 用户未登录结账,因此订单没有对应的 WordPress 用户。
  4. 其他插件使用了不同的 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。

备注:内容仅供参考。