解析 WordPress `get_user_by()` 函数的源码:如何根据不同字段查询用户。

大家好,我是你们今天的WordPress用户信息挖掘机讲师,代号“码农老司机”。 今天咱们要聊聊WordPress里面的get_user_by()函数,这玩意儿就像一把钥匙,能打开用户数据宝库的大门,帮你根据各种条件找到你想找的用户。

废话不多说,咱们直接上干货!

get_user_by() 函数:你的用户数据“寻宝仪”

这个函数的作用很简单,就是根据你提供的字段和值,从WordPress的用户表中检索用户信息。 你可以通过用户名、ID、邮箱等各种“线索”来定位目标用户。

函数原型长这样:

<?php
/**
 * Retrieve user info by a given field.
 *
 * @since 2.0.0
 *
 * @param string $field The field to search by. Accepts 'id', 'slug',
 *                      'email', 'login', and 'nicename'.
 * @param string|int|float $value The value to search for.
 * @return WP_User|false WP_User object on success, false on failure.
 */
function get_user_by( $field, $value ) {
    global $wpdb;

    $field = sanitize_key( $field );
    $value = sanitize_text_field( $value ); // Added sanitization for value

    if ( 'id' === $field || 'ID' === $field ) {
        $value = (int) $value;
        if ( ! $value ) {
            return false;
        }
        $user = get_userdata( $value );
    } elseif ( 'slug' === $field ) {
        $user = get_user_by( 'login', $value );
    } elseif ( 'email' === $field ) {
        $user = get_user_by_email( $value );
    } elseif ( 'login' === $field ) {
        $user = get_user_by_login( $value );
    } elseif ( 'nicename' === $field ) {
        $sql = $wpdb->prepare( "SELECT * FROM $wpdb->users WHERE user_nicename = %s", $value );
        $user = $wpdb->get_row( $sql );
    } else {
        return false;
    }

    if ( empty( $user ) ) {
        return false;
    }

    return new WP_User( $user );
}

看起来有点长,别慌,咱们慢慢拆解。

参数详解:告诉函数你要找谁

  • $field (string): 这是你搜索的依据,比如你想根据ID找,那就填'id'。 常用的字段有:
    • 'id': 用户ID (整数)
    • 'slug': 用户登录名 (字符串,已被login替代,不推荐使用)
    • 'email': 用户邮箱 (字符串)
    • 'login': 用户登录名 (字符串)
    • 'nicename': 用户昵称 (字符串)
  • $value (string|int|float): 这是你搜索的值,比如你想找ID为1的用户,那就填1。 注意类型要和$field对应。

返回值:找到或没找到,都得给个说法

  • WP_User (object): 如果找到了符合条件的用户,函数会返回一个WP_User对象,里面包含了用户的各种信息,比如ID、用户名、邮箱等等。
  • false (boolean): 如果没找到符合条件的用户,函数会返回false

源码剖析:一步一步看它怎么找人

现在咱们来深入源码,看看get_user_by()函数内部是怎么工作的。

  1. 全局变量声明:
global $wpdb;

这一行代码声明了全局变量 $wpdb,它代表了 WordPress 数据库连接对象。 使用 $wpdb 变量,可以执行 SQL 查询来获取 WordPress 数据库中的数据。

  1. 字段清理:
$field = sanitize_key( $field );
$value = sanitize_text_field( $value ); // Added sanitization for value

这里对 $field$value 进行了清理。sanitize_key() 用于清理 $field,确保它是一个有效的键名,防止注入攻击。sanitize_text_field() 清理 $value,移除潜在的恶意代码和 HTML 标签。 这两步是安全措施,防止有人恶意构造数据。

  1. 根据字段类型进行查找:

接下来,函数会根据$field的值,选择不同的查找方式。 这里用的是一堆if...elseif...else,就像一个条件判断的流水线。

*   **`'id'` 或 `'ID'`:**
if ( 'id' === $field || 'ID' === $field ) {
    $value = (int) $value;
    if ( ! $value ) {
        return false;
    }
    $user = get_userdata( $value );
}

如果$field'id',那么函数会先把$value强制转换成整数,然后调用get_userdata()函数来获取用户信息。 get_userdata()函数是专门用来根据用户ID获取用户信息的,效率很高。 如果 $value0 或者非数字,则直接返回 false

*   **`'slug'`:**
elseif ( 'slug' === $field ) {
    $user = get_user_by( 'login', $value );
}

如果$field'slug',函数会直接调用自己,但是把$field改成'login',相当于把问题转化成了根据用户名查找。 这种做法是因为user_loginuser_nicename 在早期版本中有一定的关联性,但现在已经不推荐使用 'slug' 了。

*   **`'email'`:**
elseif ( 'email' === $field ) {
    $user = get_user_by_email( $value );
}

如果$field'email',函数会调用get_user_by_email()函数来获取用户信息。 get_user_by_email()函数是专门用来根据邮箱查找用户的。

*   **`'login'`:**
elseif ( 'login' === $field ) {
    $user = get_user_by_login( $value );
}

如果$field'login',函数会调用get_user_by_login()函数来获取用户信息。 get_user_by_login()函数是专门用来根据用户名查找用户的。

*   **`'nicename'`:**
elseif ( 'nicename' === $field ) {
    $sql = $wpdb->prepare( "SELECT * FROM $wpdb->users WHERE user_nicename = %s", $value );
    $user = $wpdb->get_row( $sql );
}

如果$field'nicename',函数会直接执行SQL查询来获取用户信息。 这里用到了$wpdb->prepare()函数,可以防止SQL注入攻击。%s是一个占位符,会被$value替换。 $wpdb->get_row()函数会返回查询结果的第一行,如果没有结果,则返回null

*   **其他情况:**
else {
    return false;
}

如果$field不是以上任何一种,函数会直接返回false,表示不支持这种查找方式。

  1. 结果处理:
if ( empty( $user ) ) {
    return false;
}

return new WP_User( $user );

最后,函数会判断$user是否为空。如果为空,表示没有找到符合条件的用户,函数会返回false。 如果不为空,函数会创建一个新的WP_User对象,把$user的数据填充进去,然后返回这个对象。

实战演练:用代码说话

光说不练假把式,咱们来写几个例子,看看get_user_by()函数怎么用。

  • 根据ID查找用户:
$user_id = 123; // 假设我们要找ID为123的用户
$user = get_user_by( 'id', $user_id );

if ( $user ) {
    echo '找到了用户:' . $user->user_login; // 输出用户名
} else {
    echo '没找到ID为' . $user_id . '的用户';
}
  • 根据邮箱查找用户:
$user_email = '[email protected]'; // 假设我们要找邮箱为[email protected]的用户
$user = get_user_by( 'email', $user_email );

if ( $user ) {
    echo '找到了用户:' . $user->user_login; // 输出用户名
} else {
    echo '没找到邮箱为' . $user_email . '的用户';
}
  • 根据用户名查找用户:
$username = 'testuser'; // 假设我们要找用户名为testuser的用户
$user = get_user_by( 'login', $username );

if ( $user ) {
    echo '找到了用户:' . $user->user_login; // 输出用户名
} else {
    echo '没找到用户名为' . $username . '的用户';
}
  • 根据昵称查找用户:
$nicename = '测试用户'; // 假设我们要找昵称为测试用户的用户
$user = get_user_by( 'nicename', $nicename );

if ( $user ) {
    echo '找到了用户:' . $user->user_login; // 输出用户名
} else {
    echo '没找到昵称为' . $nicename . '的用户';
}

注意事项:避开那些坑

  • 性能问题: 尽量使用'id''login''email' 查找,因为WordPress对这些字段做了索引,查找速度更快。 'nicename' 查找需要执行SQL查询,速度相对较慢。
  • 安全性问题: 一定要对$value进行过滤,防止SQL注入攻击。 WordPress提供了sanitize_text_field()函数,可以用来过滤字符串。
  • 缓存问题: WordPress会对用户数据进行缓存,所以如果你修改了用户数据,可能需要清除缓存才能看到最新的结果。

get_user_by_email()get_user_by_login() 的源码分析

既然提到了get_user_by_email()get_user_by_login(), 咱们也顺便看看它们的源码,了解一下它们是怎么工作的。

get_user_by_email()

<?php
/**
 * Retrieve user info by email.
 *
 * @since 2.0.0
 *
 * @param string $email User email address.
 * @return WP_User|false WP_User object on success, false on failure.
 */
function get_user_by_email( $email ) {
    global $wpdb;

    $email = sanitize_email( $email );

    if ( ! is_email( $email ) ) {
        return false;
    }

    $sql = $wpdb->prepare( "SELECT * FROM $wpdb->users WHERE user_email = %s", $email );
    $user = $wpdb->get_row( $sql );

    if ( empty( $user ) ) {
        return false;
    }

    return new WP_User( $user );
}
  • 参数: $email (string) – 用户邮箱地址。
  • 返回值: WP_User (object) – 如果找到,返回WP_User对象;false – 如果没找到。

源码很简单,主要做了以下几件事:

  1. 清理邮箱:sanitize_email()函数清理邮箱地址,确保邮箱格式正确。
  2. 验证邮箱:is_email() 函数验证邮箱格式是否正确。 如果不正确,直接返回 false
  3. 执行SQL查询: 执行SQL查询,根据邮箱地址查找用户。
  4. 返回结果: 如果找到用户,返回WP_User对象;否则返回false

get_user_by_login()

<?php
/**
 * Retrieve user info by user login.
 *
 * @since 2.0.0
 *
 * @param string $login User login name.
 * @return WP_User|false WP_User object on success, false on failure.
 */
function get_user_by_login( $login ) {
    global $wpdb;

    $login = sanitize_user( $login, true );

    $sql = $wpdb->prepare( "SELECT * FROM $wpdb->users WHERE user_login = %s", $login );
    $user = $wpdb->get_row( $sql );

    if ( empty( $user ) ) {
        return false;
    }

    return new WP_User( $user );
}
  • 参数: $login (string) – 用户登录名。
  • 返回值: WP_User (object) – 如果找到,返回WP_User对象;false – 如果没找到。

源码也很简单,主要做了以下几件事:

  1. 清理用户名:sanitize_user()函数清理用户名,确保用户名格式正确。
  2. 执行SQL查询: 执行SQL查询,根据用户名查找用户。
  3. 返回结果: 如果找到用户,返回WP_User对象;否则返回false

总结:get_user_by() 函数的“葵花宝典”

get_user_by()函数是WordPress中一个非常重要的函数,它可以根据不同的字段查找用户信息。 理解它的原理和用法,可以帮助你更好地管理和操作用户数据。

函数/方法 描述 使用场景 注意事项
get_user_by() 根据指定的字段和值检索用户信息。 根据用户ID、用户名、邮箱等查找用户。 字段选择要谨慎,尽量使用'id''login''email',性能更好。 对$value进行过滤,防止SQL注入。 理解缓存机制,及时清除缓存。
get_user_by_email() 根据邮箱地址检索用户信息。 验证用户邮箱是否存在,根据邮箱找回密码等。 确保邮箱格式正确,使用 sanitize_email() 清理邮箱地址。
get_user_by_login() 根据用户名检索用户信息。 用户登录验证,根据用户名显示用户信息等。 确保用户名格式正确,使用 sanitize_user() 清理用户名。
$wpdb->prepare() 用于预处理SQL查询语句,防止SQL注入攻击。 执行任何涉及到用户输入数据的SQL查询。 务必使用此方法处理用户输入数据,避免安全漏洞。
sanitize_email() 用于清理邮箱地址,确保邮箱格式正确。 在处理任何用户提交的邮箱地址时使用。 可以移除邮箱地址中的非法字符,确保数据安全。
sanitize_user() 用于清理用户名,确保用户名格式正确。 在处理任何用户提交的用户名时使用。 可以移除用户名中的非法字符,确保数据安全。
is_email() 用于验证邮箱格式是否正确。 在处理任何用户提交的邮箱地址时使用。 确保邮箱格式符合规范。

希望今天的讲座能帮助大家更好地理解get_user_by()函数,让大家在WordPress的世界里畅游无阻! 下次有机会再跟大家分享其他WordPress技巧,拜拜!

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注