函数文档

user_can_access_admin_page()

💡 云策文档标注

概述

user_can_access_admin_page() 函数用于判断当前用户是否有权限访问当前 WordPress 管理页面。它通过检查全局变量和菜单权限来返回布尔值。

关键要点

  • 函数返回布尔值:true 表示用户可访问,false 表示不可访问。
  • 依赖全局变量如 $pagenow、$menu、$submenu、$_wp_menu_nopriv、$_wp_submenu_nopriv、$plugin_page 和 $_registered_pages。
  • 使用 get_admin_page_parent() 获取父页面,并结合 current_user_can() 检查用户能力。
  • 处理插件页面和核心管理页面的权限验证逻辑。

代码示例

if ( user_can_access_admin_page() ) {
    // 用户有权限访问当前管理页面
} else {
    // 用户无权限,可重定向或显示错误
}

注意事项

  • 函数在 WordPress 1.5.0 版本引入,主要用于内部权限检查。
  • 开发者应确保在管理页面上下文中调用,以避免全局变量未定义错误。
  • 相关函数包括 get_admin_page_parent()、get_plugin_page_hookname() 和 current_user_can()。

📄 原文内容

Determines whether the current user can access the current admin page.

Return

bool True if the current user can access the admin page, false otherwise.

Source

function user_can_access_admin_page() {
	global $pagenow, $menu, $submenu, $_wp_menu_nopriv, $_wp_submenu_nopriv,
		$plugin_page, $_registered_pages;

	$parent = get_admin_page_parent();

	if ( ! isset( $plugin_page ) && isset( $_wp_submenu_nopriv[ $parent ][ $pagenow ] ) ) {
		return false;
	}

	if ( isset( $plugin_page ) ) {
		if ( isset( $_wp_submenu_nopriv[ $parent ][ $plugin_page ] ) ) {
			return false;
		}

		$hookname = get_plugin_page_hookname( $plugin_page, $parent );

		if ( ! isset( $_registered_pages[ $hookname ] ) ) {
			return false;
		}
	}

	if ( empty( $parent ) ) {
		if ( isset( $_wp_menu_nopriv[ $pagenow ] ) ) {
			return false;
		}
		if ( isset( $_wp_submenu_nopriv[ $pagenow ][ $pagenow ] ) ) {
			return false;
		}
		if ( isset( $plugin_page ) && isset( $_wp_submenu_nopriv[ $pagenow ][ $plugin_page ] ) ) {
			return false;
		}
		if ( isset( $plugin_page ) && isset( $_wp_menu_nopriv[ $plugin_page ] ) ) {
			return false;
		}

		foreach ( array_keys( $_wp_submenu_nopriv ) as $key ) {
			if ( isset( $_wp_submenu_nopriv[ $key ][ $pagenow ] ) ) {
				return false;
			}
			if ( isset( $plugin_page ) && isset( $_wp_submenu_nopriv[ $key ][ $plugin_page ] ) ) {
				return false;
			}
		}

		return true;
	}

	if ( isset( $plugin_page ) && $plugin_page === $parent && isset( $_wp_menu_nopriv[ $plugin_page ] ) ) {
		return false;
	}

	if ( isset( $submenu[ $parent ] ) ) {
		foreach ( $submenu[ $parent ] as $submenu_array ) {
			if ( isset( $plugin_page ) && $submenu_array[2] === $plugin_page ) {
				return current_user_can( $submenu_array[1] );
			} elseif ( $submenu_array[2] === $pagenow ) {
				return current_user_can( $submenu_array[1] );
			}
		}
	}

	foreach ( $menu as $menu_array ) {
		if ( $menu_array[2] === $parent ) {
			return current_user_can( $menu_array[1] );
		}
	}

	return true;
}

Changelog

Version Description
1.5.0 Introduced.