探究 WordPress `wpmu_current_user_can_super_admin()` 函数的源码:如何检查用户是否为超级管理员。

各位代码界的“弄潮儿”,今天咱们来聊聊WordPress里一个有点神秘,但又非常重要的函数:wpmu_current_user_can_super_admin()。 别看它名字长,其实功能很简单,就是用来判断当前用户是不是WordPress MultiSite(多站点)网络的超级管理员。 咱们今天就把它扒个底朝天,看看它到底是怎么工作的。

开场白:超级管理员的“超能力”

在单站点WordPress里,管理员权限就已经很大了,可以管理主题、插件、用户等等。 但是,在多站点网络里,超级管理员的权力更大,他们可以管理整个网络,包括创建站点、删除站点、管理网络主题和插件等等。 简而言之,超级管理员就是多站点网络里的“皇帝”。

那么,WordPress是怎么判断谁是“皇帝”的呢? 这就要靠我们今天的主角:wpmu_current_user_can_super_admin()

源码剖析:wpmu_current_user_can_super_admin() 做了什么?

让我们直接跳到WordPress的源码里,看看这个函数到底长什么样:

function wpmu_current_user_can_super_admin( $user_id = false ) {
    if ( ! is_multisite() ) {
        return apply_filters( 'wpmu_current_user_can_super_admin', false, $user_id );
    }

    if ( ! $user_id ) {
        $user_id = get_current_user_id();
    }

    if ( empty( $user_id ) ) {
        return apply_filters( 'wpmu_current_user_can_super_admin', false, $user_id );
    }

    if ( defined( 'WP_ADMIN' ) ) {
        $profile_override = apply_filters( 'enable_wp_user_search', false );
    } else {
        $profile_override = apply_filters( 'enable_wp_user_search', true );
    }

    if ( $profile_override ) {
        $caps = get_user_meta( $user_id, get_site_option( 'site_admins' ), true );
        if ( ! empty( $caps ) ) {
            return apply_filters( 'wpmu_current_user_can_super_admin', true, $user_id );
        }
    }

    $super_admins = get_super_admins();

    if ( is_array( $super_admins ) && in_array( (string) $user_id, $super_admins, true ) ) {
        return apply_filters( 'wpmu_current_user_can_super_admin', true, $user_id );
    }

    return apply_filters( 'wpmu_current_user_can_super_admin', false, $user_id );
}

代码看起来有点长,但别怕,咱们一点一点地拆解:

  1. 检查是否是多站点:

    if ( ! is_multisite() ) {
        return apply_filters( 'wpmu_current_user_can_super_admin', false, $user_id );
    }

    首先,函数会检查当前WordPress是否是多站点模式。 如果不是,那就直接返回false(通过过滤器wpmu_current_user_can_super_admin)。 毕竟,单站点哪来的超级管理员? 就像问企鹅要不要滑雪一样,问错对象了。

  2. 获取用户ID:

    if ( ! $user_id ) {
        $user_id = get_current_user_id();
    }
    
    if ( empty( $user_id ) ) {
        return apply_filters( 'wpmu_current_user_can_super_admin', false, $user_id );
    }

    如果函数没有传入用户ID,它会尝试获取当前用户的ID。 如果获取不到(比如用户未登录),那就直接返回false。 没身份,就别想当“皇帝”。

  3. enable_wp_user_search 过滤器:

    if ( defined( 'WP_ADMIN' ) ) {
        $profile_override = apply_filters( 'enable_wp_user_search', false );
    } else {
        $profile_override = apply_filters( 'enable_wp_user_search', true );
    }

    这段代码有点意思。 它根据是否在后台管理界面(WP_ADMIN是否定义)来决定enable_wp_user_search过滤器的默认值。这个过滤器控制是否允许通过用户资料页面来提升用户为超级管理员。

  4. 检查用户元数据:

    if ( $profile_override ) {
        $caps = get_user_meta( $user_id, get_site_option( 'site_admins' ), true );
        if ( ! empty( $caps ) ) {
            return apply_filters( 'wpmu_current_user_can_super_admin', true, $user_id );
        }
    }

    如果 enable_wp_user_search 过滤器允许通过用户资料修改,那么这段代码会检查用户的元数据里是否存储了超级管理员的权限。 get_site_option( 'site_admins' ) 返回的是存储管理员权限的键名(通常是 site_admins)。 如果找到了,那就返回true

  5. 检查super_admins选项:

    $super_admins = get_super_admins();
    
    if ( is_array( $super_admins ) && in_array( (string) $user_id, $super_admins, true ) ) {
        return apply_filters( 'wpmu_current_user_can_super_admin', true, $user_id );
    }

    这是最关键的一步。 get_super_admins()函数会返回一个包含所有超级管理员用户ID的数组。 函数会检查传入的用户ID是否在这个数组里。 如果在,那就返回true。 注意 in_array 函数使用了 strict 模式 (true),确保类型也匹配(用户 ID 通常是字符串)。

  6. 默认返回false:

    return apply_filters( 'wpmu_current_user_can_super_admin', false, $user_id );

    如果以上所有条件都不满足,那就说明这个用户不是超级管理员,返回false

get_super_admins() 又是怎么工作的呢?

刚才提到了get_super_admins()函数,它负责获取所有超级管理员的用户ID。 让我们也稍微看一下它的源码:

function get_super_admins() {
    global $super_admins;

    if ( isset( $super_admins ) ) {
        return $super_admins;
    }

    $super_admins = get_site_option( 'site_admins', array() );

    if ( empty( $super_admins ) ) {
        $super_admins = array();
    }

    return $super_admins;
}

很简单,它从wp_sitemeta 表中获取 site_admins 选项的值。 这个选项存储了一个包含所有超级管理员用户ID的数组。 如果这个选项不存在,那就返回一个空数组。

流程图:wpmu_current_user_can_super_admin() 的逻辑

为了更清晰地理解这个函数的工作流程,咱们可以把它画成一个简单的流程图:

graph LR
    A[开始] --> B{是否是多站点?};
    B -- 是 --> C{是否提供了用户ID?};
    B -- 否 --> I[返回 false];
    C -- 是 --> D{用户ID是否为空?};
    C -- 否 --> E{获取当前用户ID};
    D -- 否 --> F{检查用户元数据?};
    D -- 是 --> I[返回 false];
    E --> F;
    F -- 是 --> G{用户元数据包含超级管理员权限?};
    F -- 否 --> H{检查 super_admins 选项};
    G -- 是 --> J[返回 true];
    G -- 否 --> H;
    H -- 是 --> J;
    H -- 否 --> I;
    I[返回 false] --> K[结束];
    J[返回 true] --> K;

应用场景:什么时候需要用到这个函数?

wpmu_current_user_can_super_admin() 函数在很多场景下都非常有用。 比如:

  • 限制某些功能的访问: 只有超级管理员才能访问某些管理页面或执行某些操作。
  • 自定义用户界面: 根据用户是否是超级管理员,显示不同的界面元素。
  • 插件开发: 插件可以利用这个函数来判断当前用户是否有权限执行某些插件特定的操作。

代码示例:限制插件设置页面的访问

假设你开发了一个多站点插件,你希望只有超级管理员才能访问插件的设置页面。 你可以这样做:

function my_plugin_admin_menu() {
    if ( wpmu_current_user_can_super_admin() ) {
        add_menu_page(
            'My Plugin Settings',
            'My Plugin',
            'manage_options',
            'my-plugin-settings',
            'my_plugin_settings_page'
        );
    }
}
add_action( 'admin_menu', 'my_plugin_admin_menu' );

function my_plugin_settings_page() {
    // 显示插件设置页面
    echo '<h1>My Plugin Settings</h1>';
    echo '<p>Welcome, Super Admin!</p>';
}

这段代码会在后台管理菜单中添加一个名为“My Plugin”的菜单项,只有超级管理员才能看到它。 其他用户即使知道这个页面的URL,也无法访问。

代码示例:给超级管理员显示特殊的提示信息

function my_plugin_admin_notice() {
    if ( wpmu_current_user_can_super_admin() ) {
        echo '<div class="notice notice-success is-dismissible">';
        echo '<p>你好,尊贵的超级管理员! 您拥有管理整个网络的至高权力!</p>';
        echo '</div>';
    }
}
add_action( 'admin_notices', 'my_plugin_admin_notice' );

这段代码会在后台管理界面显示一个绿色的提示信息,只有超级管理员才能看到。 这可以用来提醒超级管理员,他们拥有特殊的权限。

安全提示:不要滥用超级管理员权限

超级管理员权限非常强大,但也要小心使用。 不要轻易将用户提升为超级管理员,因为他们可能会对整个网络造成破坏。 就像不要随便把核武器的按钮交给熊孩子一样,后果不堪设想。

过滤器:wpmu_current_user_can_super_admin

细心的同学可能已经注意到了,wpmu_current_user_can_super_admin() 函数的每一次返回都会经过一个过滤器:wpmu_current_user_can_super_admin

apply_filters( 'wpmu_current_user_can_super_admin', true, $user_id );
apply_filters( 'wpmu_current_user_can_super_admin', false, $user_id );

这意味着你可以使用这个过滤器来修改函数的返回值。 比如,你可以创建一个插件,让某个特定的用户即使不在super_admins 数组里,也能被认为是超级管理员。 或者,你也可以创建一个插件,让某个用户永远无法成为超级管理员。

代码示例:使用过滤器修改返回值

function my_plugin_filter_super_admin( $is_super_admin, $user_id ) {
    // 让用户ID为1的用户始终被认为是超级管理员
    if ( $user_id == 1 ) {
        return true;
    }

    return $is_super_admin;
}
add_filter( 'wpmu_current_user_can_super_admin', 'my_plugin_filter_super_admin', 10, 2 );

这段代码会让用户ID为1的用户始终被认为是超级管理员,无论他是否在super_admins数组里。 当然,这只是一个示例,实际应用中要谨慎使用。

总结:wpmu_current_user_can_super_admin() 的重要性

wpmu_current_user_can_super_admin() 函数是WordPress多站点网络安全的重要组成部分。 它确保只有授权的用户才能拥有超级管理员的权限,从而保护整个网络的安全。 理解这个函数的工作原理,对于开发多站点插件、自定义WordPress功能以及维护多站点网络都非常重要。

表格总结:wpmu_current_user_can_super_admin() 重要参数和返回值

参数 类型 描述
$user_id int (可选) 要检查的用户ID。 如果不提供,则默认为当前用户ID。
返回值 类型 描述
true bool 如果用户是超级管理员,则返回true
false bool 如果用户不是超级管理员,则返回false

课后作业:

  1. 尝试创建一个插件,使用wpmu_current_user_can_super_admin() 函数来限制某个管理页面的访问。
  2. 研究一下enable_wp_user_search 过滤器的作用,以及它对超级管理员权限的影响。
  3. 思考一下,除了今天讲到的场景,wpmu_current_user_can_super_admin() 函数还可以应用在哪些地方?

好了,今天的“扒源码”讲座就到这里。 希望大家有所收获,对wpmu_current_user_can_super_admin() 函数有了更深入的了解。 记住,代码的世界是充满乐趣的,只要你肯探索,总能发现新的惊喜!下次再见!

发表回复

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