wp/wp-includes/capabilities.php
author ymh <ymh.work@gmail.com>
Wed, 06 Nov 2013 03:21:17 +0000
changeset 0 d970ebf37754
child 5 5e2f62d02dcd
permissions -rw-r--r--
first import
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
     1
<?php
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
     2
/**
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
     3
 * WordPress Roles and Capabilities.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
     4
 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
     5
 * @package WordPress
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
     6
 * @subpackage User
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
     7
 */
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
     8
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
     9
/**
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    10
 * WordPress User Roles.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    11
 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    12
 * The role option is simple, the structure is organized by role name that store
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    13
 * the name in value of the 'name' key. The capabilities are stored as an array
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    14
 * in the value of the 'capability' key.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    15
 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    16
 * <code>
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    17
 * array (
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    18
 *		'rolename' => array (
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    19
 *			'name' => 'rolename',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    20
 *			'capabilities' => array()
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    21
 *		)
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    22
 * )
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    23
 * </code>
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    24
 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    25
 * @since 2.0.0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    26
 * @package WordPress
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    27
 * @subpackage User
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    28
 */
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    29
class WP_Roles {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    30
	/**
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    31
	 * List of roles and capabilities.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    32
	 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    33
	 * @since 2.0.0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    34
	 * @access public
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    35
	 * @var array
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    36
	 */
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    37
	var $roles;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    38
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    39
	/**
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    40
	 * List of the role objects.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    41
	 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    42
	 * @since 2.0.0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    43
	 * @access public
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    44
	 * @var array
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    45
	 */
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    46
	var $role_objects = array();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    47
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    48
	/**
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    49
	 * List of role names.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    50
	 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    51
	 * @since 2.0.0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    52
	 * @access public
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    53
	 * @var array
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    54
	 */
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    55
	var $role_names = array();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    56
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    57
	/**
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    58
	 * Option name for storing role list.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    59
	 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    60
	 * @since 2.0.0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    61
	 * @access public
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    62
	 * @var string
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    63
	 */
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    64
	var $role_key;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    65
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    66
	/**
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    67
	 * Whether to use the database for retrieval and storage.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    68
	 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    69
	 * @since 2.1.0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    70
	 * @access public
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    71
	 * @var bool
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    72
	 */
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    73
	var $use_db = true;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    74
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    75
	/**
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    76
	 * Constructor
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    77
	 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    78
	 * @since 2.0.0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    79
	 */
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    80
	function __construct() {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    81
		$this->_init();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    82
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    83
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    84
	/**
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    85
	 * Set up the object properties.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    86
	 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    87
	 * The role key is set to the current prefix for the $wpdb object with
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    88
	 * 'user_roles' appended. If the $wp_user_roles global is set, then it will
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    89
	 * be used and the role option will not be updated or used.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    90
	 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    91
	 * @since 2.1.0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    92
	 * @access protected
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    93
	 * @uses $wpdb Used to get the database prefix.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    94
	 * @global array $wp_user_roles Used to set the 'roles' property value.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    95
	 */
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    96
	function _init () {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    97
		global $wpdb, $wp_user_roles;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    98
		$this->role_key = $wpdb->get_blog_prefix() . 'user_roles';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    99
		if ( ! empty( $wp_user_roles ) ) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   100
			$this->roles = $wp_user_roles;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   101
			$this->use_db = false;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   102
		} else {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   103
			$this->roles = get_option( $this->role_key );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   104
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   105
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   106
		if ( empty( $this->roles ) )
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   107
			return;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   108
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   109
		$this->role_objects = array();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   110
		$this->role_names =  array();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   111
		foreach ( array_keys( $this->roles ) as $role ) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   112
			$this->role_objects[$role] = new WP_Role( $role, $this->roles[$role]['capabilities'] );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   113
			$this->role_names[$role] = $this->roles[$role]['name'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   114
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   115
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   116
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   117
	/**
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   118
	 * Reinitialize the object
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   119
	 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   120
	 * Recreates the role objects. This is typically called only by switch_to_blog()
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   121
	 * after switching wpdb to a new blog ID.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   122
	 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   123
	 * @since 3.5.0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   124
	 * @access public
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   125
	 */
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   126
	function reinit() {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   127
		// There is no need to reinit if using the wp_user_roles global.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   128
		if ( ! $this->use_db )
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   129
			return;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   130
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   131
		global $wpdb, $wp_user_roles;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   132
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   133
		// Duplicated from _init() to avoid an extra function call.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   134
		$this->role_key = $wpdb->get_blog_prefix() . 'user_roles';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   135
		$this->roles = get_option( $this->role_key );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   136
		if ( empty( $this->roles ) )
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   137
			return;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   138
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   139
		$this->role_objects = array();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   140
		$this->role_names =  array();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   141
		foreach ( array_keys( $this->roles ) as $role ) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   142
			$this->role_objects[$role] = new WP_Role( $role, $this->roles[$role]['capabilities'] );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   143
			$this->role_names[$role] = $this->roles[$role]['name'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   144
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   145
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   146
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   147
	/**
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   148
	 * Add role name with capabilities to list.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   149
	 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   150
	 * Updates the list of roles, if the role doesn't already exist.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   151
	 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   152
	 * The capabilities are defined in the following format `array( 'read' => true );`
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   153
	 * To explicitly deny a role a capability you set the value for that capability to false.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   154
	 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   155
	 * @since 2.0.0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   156
	 * @access public
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   157
	 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   158
	 * @param string $role Role name.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   159
	 * @param string $display_name Role display name.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   160
	 * @param array $capabilities List of role capabilities in the above format.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   161
	 * @return WP_Role|null WP_Role object if role is added, null if already exists.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   162
	 */
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   163
	function add_role( $role, $display_name, $capabilities = array() ) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   164
		if ( isset( $this->roles[$role] ) )
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   165
			return;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   166
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   167
		$this->roles[$role] = array(
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   168
			'name' => $display_name,
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   169
			'capabilities' => $capabilities
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   170
			);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   171
		if ( $this->use_db )
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   172
			update_option( $this->role_key, $this->roles );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   173
		$this->role_objects[$role] = new WP_Role( $role, $capabilities );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   174
		$this->role_names[$role] = $display_name;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   175
		return $this->role_objects[$role];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   176
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   177
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   178
	/**
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   179
	 * Remove role by name.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   180
	 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   181
	 * @since 2.0.0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   182
	 * @access public
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   183
	 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   184
	 * @param string $role Role name.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   185
	 */
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   186
	function remove_role( $role ) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   187
		if ( ! isset( $this->role_objects[$role] ) )
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   188
			return;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   189
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   190
		unset( $this->role_objects[$role] );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   191
		unset( $this->role_names[$role] );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   192
		unset( $this->roles[$role] );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   193
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   194
		if ( $this->use_db )
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   195
			update_option( $this->role_key, $this->roles );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   196
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   197
		if ( get_option( 'default_role' ) == $role )
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   198
			update_option( 'default_role', 'subscriber' );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   199
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   200
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   201
	/**
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   202
	 * Add capability to role.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   203
	 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   204
	 * @since 2.0.0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   205
	 * @access public
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   206
	 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   207
	 * @param string $role Role name.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   208
	 * @param string $cap Capability name.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   209
	 * @param bool $grant Optional, default is true. Whether role is capable of performing capability.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   210
	 */
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   211
	function add_cap( $role, $cap, $grant = true ) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   212
		if ( ! isset( $this->roles[$role] ) )
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   213
			return;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   214
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   215
		$this->roles[$role]['capabilities'][$cap] = $grant;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   216
		if ( $this->use_db )
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   217
			update_option( $this->role_key, $this->roles );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   218
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   219
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   220
	/**
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   221
	 * Remove capability from role.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   222
	 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   223
	 * @since 2.0.0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   224
	 * @access public
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   225
	 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   226
	 * @param string $role Role name.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   227
	 * @param string $cap Capability name.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   228
	 */
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   229
	function remove_cap( $role, $cap ) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   230
		if ( ! isset( $this->roles[$role] ) )
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   231
			return;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   232
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   233
		unset( $this->roles[$role]['capabilities'][$cap] );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   234
		if ( $this->use_db )
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   235
			update_option( $this->role_key, $this->roles );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   236
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   237
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   238
	/**
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   239
	 * Retrieve role object by name.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   240
	 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   241
	 * @since 2.0.0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   242
	 * @access public
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   243
	 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   244
	 * @param string $role Role name.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   245
	 * @return WP_Role|null WP_Role object if found, null if the role does not exist.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   246
	 */
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   247
	function get_role( $role ) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   248
		if ( isset( $this->role_objects[$role] ) )
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   249
			return $this->role_objects[$role];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   250
		else
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   251
			return null;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   252
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   253
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   254
	/**
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   255
	 * Retrieve list of role names.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   256
	 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   257
	 * @since 2.0.0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   258
	 * @access public
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   259
	 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   260
	 * @return array List of role names.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   261
	 */
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   262
	function get_names() {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   263
		return $this->role_names;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   264
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   265
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   266
	/**
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   267
	 * Whether role name is currently in the list of available roles.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   268
	 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   269
	 * @since 2.0.0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   270
	 * @access public
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   271
	 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   272
	 * @param string $role Role name to look up.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   273
	 * @return bool
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   274
	 */
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   275
	function is_role( $role ) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   276
		return isset( $this->role_names[$role] );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   277
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   278
}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   279
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   280
/**
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   281
 * WordPress Role class.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   282
 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   283
 * @since 2.0.0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   284
 * @package WordPress
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   285
 * @subpackage User
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   286
 */
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   287
class WP_Role {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   288
	/**
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   289
	 * Role name.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   290
	 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   291
	 * @since 2.0.0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   292
	 * @access public
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   293
	 * @var string
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   294
	 */
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   295
	var $name;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   296
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   297
	/**
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   298
	 * List of capabilities the role contains.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   299
	 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   300
	 * @since 2.0.0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   301
	 * @access public
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   302
	 * @var array
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   303
	 */
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   304
	var $capabilities;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   305
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   306
	/**
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   307
	 * Constructor - Set up object properties.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   308
	 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   309
	 * The list of capabilities, must have the key as the name of the capability
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   310
	 * and the value a boolean of whether it is granted to the role.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   311
	 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   312
	 * @since 2.0.0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   313
	 * @access public
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   314
	 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   315
	 * @param string $role Role name.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   316
	 * @param array $capabilities List of capabilities.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   317
	 */
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   318
	function __construct( $role, $capabilities ) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   319
		$this->name = $role;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   320
		$this->capabilities = $capabilities;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   321
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   322
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   323
	/**
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   324
	 * Assign role a capability.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   325
	 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   326
	 * @see WP_Roles::add_cap() Method uses implementation for role.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   327
	 * @since 2.0.0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   328
	 * @access public
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   329
	 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   330
	 * @param string $cap Capability name.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   331
	 * @param bool $grant Whether role has capability privilege.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   332
	 */
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   333
	function add_cap( $cap, $grant = true ) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   334
		global $wp_roles;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   335
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   336
		if ( ! isset( $wp_roles ) )
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   337
			$wp_roles = new WP_Roles();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   338
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   339
		$this->capabilities[$cap] = $grant;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   340
		$wp_roles->add_cap( $this->name, $cap, $grant );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   341
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   342
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   343
	/**
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   344
	 * Remove capability from role.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   345
	 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   346
	 * This is a container for {@link WP_Roles::remove_cap()} to remove the
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   347
	 * capability from the role. That is to say, that {@link
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   348
	 * WP_Roles::remove_cap()} implements the functionality, but it also makes
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   349
	 * sense to use this class, because you don't need to enter the role name.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   350
	 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   351
	 * @since 2.0.0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   352
	 * @access public
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   353
	 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   354
	 * @param string $cap Capability name.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   355
	 */
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   356
	function remove_cap( $cap ) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   357
		global $wp_roles;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   358
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   359
		if ( ! isset( $wp_roles ) )
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   360
			$wp_roles = new WP_Roles();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   361
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   362
		unset( $this->capabilities[$cap] );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   363
		$wp_roles->remove_cap( $this->name, $cap );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   364
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   365
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   366
	/**
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   367
	 * Whether role has capability.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   368
	 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   369
	 * The capabilities is passed through the 'role_has_cap' filter. The first
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   370
	 * parameter for the hook is the list of capabilities the class has
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   371
	 * assigned. The second parameter is the capability name to look for. The
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   372
	 * third and final parameter for the hook is the role name.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   373
	 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   374
	 * @since 2.0.0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   375
	 * @access public
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   376
	 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   377
	 * @param string $cap Capability name.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   378
	 * @return bool True, if user has capability. False, if doesn't have capability.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   379
	 */
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   380
	function has_cap( $cap ) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   381
		$capabilities = apply_filters( 'role_has_cap', $this->capabilities, $cap, $this->name );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   382
		if ( !empty( $capabilities[$cap] ) )
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   383
			return $capabilities[$cap];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   384
		else
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   385
			return false;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   386
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   387
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   388
}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   389
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   390
/**
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   391
 * WordPress User class.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   392
 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   393
 * @since 2.0.0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   394
 * @package WordPress
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   395
 * @subpackage User
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   396
 */
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   397
class WP_User {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   398
	/**
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   399
	 * User data container.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   400
	 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   401
	 * @since 2.0.0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   402
	 * @access private
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   403
	 * @var array
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   404
	 */
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   405
	var $data;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   406
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   407
	/**
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   408
	 * The user's ID.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   409
	 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   410
	 * @since 2.1.0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   411
	 * @access public
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   412
	 * @var int
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   413
	 */
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   414
	var $ID = 0;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   415
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   416
	/**
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   417
	 * The individual capabilities the user has been given.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   418
	 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   419
	 * @since 2.0.0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   420
	 * @access public
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   421
	 * @var array
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   422
	 */
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   423
	var $caps = array();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   424
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   425
	/**
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   426
	 * User metadata option name.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   427
	 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   428
	 * @since 2.0.0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   429
	 * @access public
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   430
	 * @var string
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   431
	 */
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   432
	var $cap_key;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   433
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   434
	/**
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   435
	 * The roles the user is part of.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   436
	 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   437
	 * @since 2.0.0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   438
	 * @access public
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   439
	 * @var array
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   440
	 */
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   441
	var $roles = array();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   442
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   443
	/**
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   444
	 * All capabilities the user has, including individual and role based.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   445
	 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   446
	 * @since 2.0.0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   447
	 * @access public
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   448
	 * @var array
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   449
	 */
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   450
	var $allcaps = array();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   451
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   452
	/**
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   453
	 * The filter context applied to user data fields.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   454
	 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   455
	 * @since 2.9.0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   456
	 * @access private
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   457
	 * @var string
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   458
	 */
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   459
	var $filter = null;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   460
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   461
	private static $back_compat_keys;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   462
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   463
	/**
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   464
	 * Constructor
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   465
	 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   466
	 * Retrieves the userdata and passes it to {@link WP_User::init()}.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   467
	 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   468
	 * @since 2.0.0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   469
	 * @access public
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   470
	 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   471
	 * @param int|string|stdClass|WP_User $id User's ID, a WP_User object, or a user object from the DB.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   472
	 * @param string $name Optional. User's username
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   473
	 * @param int $blog_id Optional Blog ID, defaults to current blog.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   474
	 * @return WP_User
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   475
	 */
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   476
	function __construct( $id = 0, $name = '', $blog_id = '' ) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   477
		if ( ! isset( self::$back_compat_keys ) ) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   478
			$prefix = $GLOBALS['wpdb']->prefix;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   479
			self::$back_compat_keys = array(
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   480
				'user_firstname' => 'first_name',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   481
				'user_lastname' => 'last_name',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   482
				'user_description' => 'description',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   483
				'user_level' => $prefix . 'user_level',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   484
				$prefix . 'usersettings' => $prefix . 'user-settings',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   485
				$prefix . 'usersettingstime' => $prefix . 'user-settings-time',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   486
			);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   487
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   488
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   489
		if ( is_a( $id, 'WP_User' ) ) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   490
			$this->init( $id->data, $blog_id );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   491
			return;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   492
		} elseif ( is_object( $id ) ) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   493
			$this->init( $id, $blog_id );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   494
			return;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   495
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   496
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   497
		if ( ! empty( $id ) && ! is_numeric( $id ) ) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   498
			$name = $id;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   499
			$id = 0;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   500
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   501
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   502
		if ( $id )
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   503
			$data = self::get_data_by( 'id', $id );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   504
		else
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   505
			$data = self::get_data_by( 'login', $name );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   506
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   507
		if ( $data )
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   508
			$this->init( $data, $blog_id );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   509
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   510
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   511
	/**
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   512
	 * Sets up object properties, including capabilities.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   513
	 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   514
	 * @param object $data User DB row object
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   515
	 * @param int $blog_id Optional. The blog id to initialize for
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   516
	 */
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   517
	function init( $data, $blog_id = '' ) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   518
		$this->data = $data;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   519
		$this->ID = (int) $data->ID;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   520
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   521
		$this->for_blog( $blog_id );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   522
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   523
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   524
	/**
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   525
	 * Return only the main user fields
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   526
	 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   527
	 * @since 3.3.0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   528
	 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   529
	 * @param string $field The field to query against: 'id', 'slug', 'email' or 'login'
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   530
	 * @param string|int $value The field value
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   531
	 * @return object Raw user object
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   532
	 */
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   533
	static function get_data_by( $field, $value ) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   534
		global $wpdb;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   535
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   536
		if ( 'id' == $field ) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   537
			// Make sure the value is numeric to avoid casting objects, for example,
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   538
			// to int 1.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   539
			if ( ! is_numeric( $value ) )
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   540
				return false;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   541
			$value = intval( $value );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   542
			if ( $value < 1 )
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   543
				return false;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   544
		} else {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   545
			$value = trim( $value );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   546
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   547
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   548
		if ( !$value )
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   549
			return false;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   550
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   551
		switch ( $field ) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   552
			case 'id':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   553
				$user_id = $value;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   554
				$db_field = 'ID';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   555
				break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   556
			case 'slug':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   557
				$user_id = wp_cache_get($value, 'userslugs');
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   558
				$db_field = 'user_nicename';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   559
				break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   560
			case 'email':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   561
				$user_id = wp_cache_get($value, 'useremail');
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   562
				$db_field = 'user_email';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   563
				break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   564
			case 'login':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   565
				$value = sanitize_user( $value );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   566
				$user_id = wp_cache_get($value, 'userlogins');
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   567
				$db_field = 'user_login';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   568
				break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   569
			default:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   570
				return false;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   571
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   572
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   573
		if ( false !== $user_id ) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   574
			if ( $user = wp_cache_get( $user_id, 'users' ) )
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   575
				return $user;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   576
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   577
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   578
		if ( !$user = $wpdb->get_row( $wpdb->prepare(
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   579
			"SELECT * FROM $wpdb->users WHERE $db_field = %s", $value
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   580
		) ) )
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   581
			return false;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   582
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   583
		update_user_caches( $user );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   584
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   585
		return $user;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   586
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   587
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   588
	/**
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   589
	 * Magic method for checking the existence of a certain custom field
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   590
	 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   591
	 * @since 3.3.0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   592
	 */
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   593
	function __isset( $key ) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   594
		if ( 'id' == $key ) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   595
			_deprecated_argument( 'WP_User->id', '2.1', __( 'Use <code>WP_User->ID</code> instead.' ) );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   596
			$key = 'ID';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   597
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   598
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   599
		if ( isset( $this->data->$key ) )
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   600
			return true;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   601
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   602
		if ( isset( self::$back_compat_keys[ $key ] ) )
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   603
			$key = self::$back_compat_keys[ $key ];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   604
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   605
		return metadata_exists( 'user', $this->ID, $key );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   606
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   607
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   608
	/**
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   609
	 * Magic method for accessing custom fields
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   610
	 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   611
	 * @since 3.3.0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   612
	 */
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   613
	function __get( $key ) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   614
		if ( 'id' == $key ) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   615
			_deprecated_argument( 'WP_User->id', '2.1', __( 'Use <code>WP_User->ID</code> instead.' ) );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   616
			return $this->ID;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   617
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   618
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   619
		if ( isset( $this->data->$key ) ) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   620
			$value = $this->data->$key;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   621
		} else {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   622
			if ( isset( self::$back_compat_keys[ $key ] ) )
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   623
				$key = self::$back_compat_keys[ $key ];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   624
			$value = get_user_meta( $this->ID, $key, true );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   625
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   626
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   627
		if ( $this->filter ) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   628
			$value = sanitize_user_field( $key, $value, $this->ID, $this->filter );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   629
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   630
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   631
		return $value;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   632
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   633
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   634
	/**
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   635
	 * Magic method for setting custom fields
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   636
	 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   637
	 * @since 3.3.0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   638
	 */
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   639
	function __set( $key, $value ) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   640
		if ( 'id' == $key ) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   641
			_deprecated_argument( 'WP_User->id', '2.1', __( 'Use <code>WP_User->ID</code> instead.' ) );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   642
			$this->ID = $value;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   643
			return;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   644
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   645
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   646
		$this->data->$key = $value;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   647
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   648
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   649
	/**
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   650
	 * Determine whether the user exists in the database.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   651
	 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   652
	 * @since 3.4.0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   653
	 * @access public
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   654
	 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   655
	 * @return bool True if user exists in the database, false if not.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   656
	 */
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   657
	function exists() {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   658
		return ! empty( $this->ID );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   659
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   660
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   661
	/**
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   662
	 * Retrieve the value of a property or meta key.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   663
	 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   664
	 * Retrieves from the users and usermeta table.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   665
	 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   666
	 * @since 3.3.0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   667
	 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   668
	 * @param string $key Property
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   669
	 */
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   670
	function get( $key ) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   671
		return $this->__get( $key );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   672
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   673
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   674
	/**
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   675
	 * Determine whether a property or meta key is set
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   676
	 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   677
	 * Consults the users and usermeta tables.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   678
	 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   679
	 * @since 3.3.0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   680
	 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   681
	 * @param string $key Property
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   682
	 */
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   683
	function has_prop( $key ) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   684
		return $this->__isset( $key );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   685
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   686
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   687
	/*
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   688
	 * Return an array representation.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   689
	 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   690
	 * @since 3.5.0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   691
	 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   692
	 * @return array Array representation.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   693
	 */
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   694
	function to_array() {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   695
		return get_object_vars( $this->data );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   696
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   697
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   698
	/**
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   699
	 * Set up capability object properties.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   700
	 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   701
	 * Will set the value for the 'cap_key' property to current database table
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   702
	 * prefix, followed by 'capabilities'. Will then check to see if the
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   703
	 * property matching the 'cap_key' exists and is an array. If so, it will be
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   704
	 * used.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   705
	 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   706
	 * @access protected
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   707
	 * @since 2.1.0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   708
	 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   709
	 * @param string $cap_key Optional capability key
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   710
	 */
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   711
	function _init_caps( $cap_key = '' ) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   712
		global $wpdb;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   713
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   714
		if ( empty($cap_key) )
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   715
			$this->cap_key = $wpdb->get_blog_prefix() . 'capabilities';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   716
		else
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   717
			$this->cap_key = $cap_key;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   718
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   719
		$this->caps = get_user_meta( $this->ID, $this->cap_key, true );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   720
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   721
		if ( ! is_array( $this->caps ) )
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   722
			$this->caps = array();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   723
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   724
		$this->get_role_caps();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   725
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   726
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   727
	/**
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   728
	 * Retrieve all of the role capabilities and merge with individual capabilities.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   729
	 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   730
	 * All of the capabilities of the roles the user belongs to are merged with
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   731
	 * the users individual roles. This also means that the user can be denied
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   732
	 * specific roles that their role might have, but the specific user isn't
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   733
	 * granted permission to.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   734
	 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   735
	 * @since 2.0.0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   736
	 * @uses $wp_roles
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   737
	 * @access public
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   738
	 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   739
	 * @return array List of all capabilities for the user.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   740
	 */
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   741
	function get_role_caps() {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   742
		global $wp_roles;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   743
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   744
		if ( ! isset( $wp_roles ) )
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   745
			$wp_roles = new WP_Roles();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   746
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   747
		//Filter out caps that are not role names and assign to $this->roles
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   748
		if ( is_array( $this->caps ) )
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   749
			$this->roles = array_filter( array_keys( $this->caps ), array( $wp_roles, 'is_role' ) );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   750
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   751
		//Build $allcaps from role caps, overlay user's $caps
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   752
		$this->allcaps = array();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   753
		foreach ( (array) $this->roles as $role ) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   754
			$the_role = $wp_roles->get_role( $role );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   755
			$this->allcaps = array_merge( (array) $this->allcaps, (array) $the_role->capabilities );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   756
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   757
		$this->allcaps = array_merge( (array) $this->allcaps, (array) $this->caps );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   758
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   759
		return $this->allcaps;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   760
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   761
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   762
	/**
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   763
	 * Add role to user.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   764
	 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   765
	 * Updates the user's meta data option with capabilities and roles.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   766
	 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   767
	 * @since 2.0.0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   768
	 * @access public
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   769
	 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   770
	 * @param string $role Role name.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   771
	 */
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   772
	function add_role( $role ) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   773
		$this->caps[$role] = true;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   774
		update_user_meta( $this->ID, $this->cap_key, $this->caps );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   775
		$this->get_role_caps();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   776
		$this->update_user_level_from_caps();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   777
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   778
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   779
	/**
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   780
	 * Remove role from user.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   781
	 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   782
	 * @since 2.0.0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   783
	 * @access public
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   784
	 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   785
	 * @param string $role Role name.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   786
	 */
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   787
	function remove_role( $role ) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   788
		if ( !in_array($role, $this->roles) )
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   789
			return;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   790
		unset( $this->caps[$role] );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   791
		update_user_meta( $this->ID, $this->cap_key, $this->caps );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   792
		$this->get_role_caps();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   793
		$this->update_user_level_from_caps();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   794
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   795
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   796
	/**
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   797
	 * Set the role of the user.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   798
	 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   799
	 * This will remove the previous roles of the user and assign the user the
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   800
	 * new one. You can set the role to an empty string and it will remove all
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   801
	 * of the roles from the user.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   802
	 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   803
	 * @since 2.0.0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   804
	 * @access public
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   805
	 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   806
	 * @param string $role Role name.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   807
	 */
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   808
	function set_role( $role ) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   809
		if ( 1 == count( $this->roles ) && $role == current( $this->roles ) )
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   810
			return;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   811
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   812
		foreach ( (array) $this->roles as $oldrole )
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   813
			unset( $this->caps[$oldrole] );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   814
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   815
		$old_roles = $this->roles;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   816
		if ( !empty( $role ) ) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   817
			$this->caps[$role] = true;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   818
			$this->roles = array( $role => true );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   819
		} else {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   820
			$this->roles = false;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   821
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   822
		update_user_meta( $this->ID, $this->cap_key, $this->caps );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   823
		$this->get_role_caps();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   824
		$this->update_user_level_from_caps();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   825
		do_action( 'set_user_role', $this->ID, $role, $old_roles );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   826
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   827
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   828
	/**
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   829
	 * Choose the maximum level the user has.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   830
	 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   831
	 * Will compare the level from the $item parameter against the $max
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   832
	 * parameter. If the item is incorrect, then just the $max parameter value
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   833
	 * will be returned.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   834
	 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   835
	 * Used to get the max level based on the capabilities the user has. This
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   836
	 * is also based on roles, so if the user is assigned the Administrator role
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   837
	 * then the capability 'level_10' will exist and the user will get that
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   838
	 * value.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   839
	 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   840
	 * @since 2.0.0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   841
	 * @access public
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   842
	 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   843
	 * @param int $max Max level of user.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   844
	 * @param string $item Level capability name.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   845
	 * @return int Max Level.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   846
	 */
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   847
	function level_reduction( $max, $item ) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   848
		if ( preg_match( '/^level_(10|[0-9])$/i', $item, $matches ) ) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   849
			$level = intval( $matches[1] );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   850
			return max( $max, $level );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   851
		} else {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   852
			return $max;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   853
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   854
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   855
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   856
	/**
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   857
	 * Update the maximum user level for the user.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   858
	 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   859
	 * Updates the 'user_level' user metadata (includes prefix that is the
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   860
	 * database table prefix) with the maximum user level. Gets the value from
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   861
	 * the all of the capabilities that the user has.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   862
	 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   863
	 * @since 2.0.0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   864
	 * @access public
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   865
	 */
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   866
	function update_user_level_from_caps() {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   867
		global $wpdb;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   868
		$this->user_level = array_reduce( array_keys( $this->allcaps ), array( $this, 'level_reduction' ), 0 );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   869
		update_user_meta( $this->ID, $wpdb->get_blog_prefix() . 'user_level', $this->user_level );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   870
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   871
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   872
	/**
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   873
	 * Add capability and grant or deny access to capability.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   874
	 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   875
	 * @since 2.0.0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   876
	 * @access public
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   877
	 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   878
	 * @param string $cap Capability name.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   879
	 * @param bool $grant Whether to grant capability to user.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   880
	 */
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   881
	function add_cap( $cap, $grant = true ) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   882
		$this->caps[$cap] = $grant;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   883
		update_user_meta( $this->ID, $this->cap_key, $this->caps );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   884
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   885
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   886
	/**
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   887
	 * Remove capability from user.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   888
	 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   889
	 * @since 2.0.0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   890
	 * @access public
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   891
	 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   892
	 * @param string $cap Capability name.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   893
	 */
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   894
	function remove_cap( $cap ) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   895
		if ( ! isset( $this->caps[$cap] ) )
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   896
			return;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   897
		unset( $this->caps[$cap] );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   898
		update_user_meta( $this->ID, $this->cap_key, $this->caps );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   899
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   900
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   901
	/**
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   902
	 * Remove all of the capabilities of the user.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   903
	 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   904
	 * @since 2.1.0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   905
	 * @access public
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   906
	 */
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   907
	function remove_all_caps() {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   908
		global $wpdb;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   909
		$this->caps = array();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   910
		delete_user_meta( $this->ID, $this->cap_key );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   911
		delete_user_meta( $this->ID, $wpdb->get_blog_prefix() . 'user_level' );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   912
		$this->get_role_caps();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   913
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   914
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   915
	/**
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   916
	 * Whether user has capability or role name.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   917
	 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   918
	 * This is useful for looking up whether the user has a specific role
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   919
	 * assigned to the user. The second optional parameter can also be used to
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   920
	 * check for capabilities against a specific object, such as a post or user.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   921
	 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   922
	 * @since 2.0.0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   923
	 * @access public
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   924
	 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   925
	 * @param string|int $cap Capability or role name to search.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   926
	 * @return bool True, if user has capability; false, if user does not have capability.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   927
	 */
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   928
	function has_cap( $cap ) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   929
		if ( is_numeric( $cap ) ) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   930
			_deprecated_argument( __FUNCTION__, '2.0', __('Usage of user levels by plugins and themes is deprecated. Use roles and capabilities instead.') );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   931
			$cap = $this->translate_level_to_cap( $cap );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   932
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   933
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   934
		$args = array_slice( func_get_args(), 1 );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   935
		$args = array_merge( array( $cap, $this->ID ), $args );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   936
		$caps = call_user_func_array( 'map_meta_cap', $args );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   937
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   938
		// Multisite super admin has all caps by definition, Unless specifically denied.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   939
		if ( is_multisite() && is_super_admin( $this->ID ) ) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   940
			if ( in_array('do_not_allow', $caps) )
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   941
				return false;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   942
			return true;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   943
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   944
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   945
		// Must have ALL requested caps
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   946
		$capabilities = apply_filters( 'user_has_cap', $this->allcaps, $caps, $args, $this );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   947
		$capabilities['exist'] = true; // Everyone is allowed to exist
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   948
		foreach ( (array) $caps as $cap ) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   949
			if ( empty( $capabilities[ $cap ] ) )
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   950
				return false;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   951
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   952
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   953
		return true;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   954
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   955
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   956
	/**
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   957
	 * Convert numeric level to level capability name.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   958
	 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   959
	 * Prepends 'level_' to level number.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   960
	 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   961
	 * @since 2.0.0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   962
	 * @access public
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   963
	 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   964
	 * @param int $level Level number, 1 to 10.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   965
	 * @return string
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   966
	 */
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   967
	function translate_level_to_cap( $level ) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   968
		return 'level_' . $level;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   969
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   970
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   971
	/**
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   972
	 * Set the blog to operate on. Defaults to the current blog.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   973
	 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   974
	 * @since 3.0.0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   975
	 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   976
	 * @param int $blog_id Optional Blog ID, defaults to current blog.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   977
	 */
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   978
	function for_blog( $blog_id = '' ) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   979
		global $wpdb;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   980
		if ( ! empty( $blog_id ) )
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   981
			$cap_key = $wpdb->get_blog_prefix( $blog_id ) . 'capabilities';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   982
		else
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   983
			$cap_key = '';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   984
		$this->_init_caps( $cap_key );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   985
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   986
}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   987
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   988
/**
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   989
 * Map meta capabilities to primitive capabilities.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   990
 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   991
 * This does not actually compare whether the user ID has the actual capability,
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   992
 * just what the capability or capabilities are. Meta capability list value can
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   993
 * be 'delete_user', 'edit_user', 'remove_user', 'promote_user', 'delete_post',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   994
 * 'delete_page', 'edit_post', 'edit_page', 'read_post', or 'read_page'.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   995
 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   996
 * @since 2.0.0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   997
 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   998
 * @param string $cap Capability name.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   999
 * @param int $user_id User ID.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1000
 * @return array Actual capabilities for meta capability.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1001
 */
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1002
function map_meta_cap( $cap, $user_id ) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1003
	$args = array_slice( func_get_args(), 2 );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1004
	$caps = array();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1005
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1006
	switch ( $cap ) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1007
	case 'remove_user':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1008
		$caps[] = 'remove_users';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1009
		break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1010
	case 'promote_user':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1011
		$caps[] = 'promote_users';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1012
		break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1013
	case 'edit_user':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1014
	case 'edit_users':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1015
		// Allow user to edit itself
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1016
		if ( 'edit_user' == $cap && isset( $args[0] ) && $user_id == $args[0] )
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1017
			break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1018
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1019
		// If multisite these caps are allowed only for super admins.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1020
		if ( is_multisite() && !is_super_admin( $user_id ) )
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1021
			$caps[] = 'do_not_allow';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1022
		else
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1023
			$caps[] = 'edit_users'; // edit_user maps to edit_users.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1024
		break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1025
	case 'delete_post':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1026
	case 'delete_page':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1027
		$post = get_post( $args[0] );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1028
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1029
		if ( 'revision' == $post->post_type ) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1030
			$post = get_post( $post->post_parent );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1031
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1032
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1033
		$post_type = get_post_type_object( $post->post_type );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1034
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1035
		if ( ! $post_type->map_meta_cap ) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1036
			$caps[] = $post_type->cap->$cap;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1037
			// Prior to 3.1 we would re-call map_meta_cap here.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1038
			if ( 'delete_post' == $cap )
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1039
				$cap = $post_type->cap->$cap;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1040
			break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1041
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1042
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1043
		$post_author_id = $post->post_author;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1044
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1045
		// If no author set yet, default to current user for cap checks.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1046
		if ( ! $post_author_id )
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1047
			$post_author_id = $user_id;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1048
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1049
		// If the user is the author...
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1050
		if ( $user_id == $post_author_id ) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1051
			// If the post is published...
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1052
			if ( 'publish' == $post->post_status ) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1053
				$caps[] = $post_type->cap->delete_published_posts;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1054
			} elseif ( 'trash' == $post->post_status ) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1055
				if ('publish' == get_post_meta($post->ID, '_wp_trash_meta_status', true) )
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1056
					$caps[] = $post_type->cap->delete_published_posts;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1057
			} else {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1058
				// If the post is draft...
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1059
				$caps[] = $post_type->cap->delete_posts;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1060
			}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1061
		} else {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1062
			// The user is trying to edit someone else's post.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1063
			$caps[] = $post_type->cap->delete_others_posts;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1064
			// The post is published, extra cap required.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1065
			if ( 'publish' == $post->post_status )
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1066
				$caps[] = $post_type->cap->delete_published_posts;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1067
			elseif ( 'private' == $post->post_status )
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1068
				$caps[] = $post_type->cap->delete_private_posts;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1069
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1070
		break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1071
		// edit_post breaks down to edit_posts, edit_published_posts, or
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1072
		// edit_others_posts
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1073
	case 'edit_post':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1074
	case 'edit_page':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1075
		$post = get_post( $args[0] );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1076
		if ( empty( $post ) )
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1077
			break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1078
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1079
		if ( 'revision' == $post->post_type ) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1080
			$post = get_post( $post->post_parent );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1081
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1082
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1083
		$post_type = get_post_type_object( $post->post_type );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1084
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1085
		if ( ! $post_type->map_meta_cap ) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1086
			$caps[] = $post_type->cap->$cap;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1087
			// Prior to 3.1 we would re-call map_meta_cap here.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1088
			if ( 'edit_post' == $cap )
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1089
				$cap = $post_type->cap->$cap;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1090
			break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1091
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1092
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1093
		$post_author_id = $post->post_author;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1094
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1095
		// If no author set yet, default to current user for cap checks.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1096
		if ( ! $post_author_id )
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1097
			$post_author_id = $user_id;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1098
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1099
		// If the user is the author...
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1100
		if ( $user_id == $post_author_id ) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1101
			// If the post is published...
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1102
			if ( 'publish' == $post->post_status ) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1103
				$caps[] = $post_type->cap->edit_published_posts;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1104
			} elseif ( 'trash' == $post->post_status ) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1105
				if ('publish' == get_post_meta($post->ID, '_wp_trash_meta_status', true) )
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1106
					$caps[] = $post_type->cap->edit_published_posts;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1107
			} else {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1108
				// If the post is draft...
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1109
				$caps[] = $post_type->cap->edit_posts;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1110
			}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1111
		} else {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1112
			// The user is trying to edit someone else's post.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1113
			$caps[] = $post_type->cap->edit_others_posts;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1114
			// The post is published, extra cap required.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1115
			if ( 'publish' == $post->post_status )
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1116
				$caps[] = $post_type->cap->edit_published_posts;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1117
			elseif ( 'private' == $post->post_status )
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1118
				$caps[] = $post_type->cap->edit_private_posts;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1119
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1120
		break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1121
	case 'read_post':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1122
	case 'read_page':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1123
		$post = get_post( $args[0] );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1124
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1125
		if ( 'revision' == $post->post_type ) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1126
			$post = get_post( $post->post_parent );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1127
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1128
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1129
		$post_type = get_post_type_object( $post->post_type );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1130
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1131
		if ( ! $post_type->map_meta_cap ) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1132
			$caps[] = $post_type->cap->$cap;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1133
			// Prior to 3.1 we would re-call map_meta_cap here.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1134
			if ( 'read_post' == $cap )
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1135
				$cap = $post_type->cap->$cap;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1136
			break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1137
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1138
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1139
		$status_obj = get_post_status_object( $post->post_status );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1140
		if ( $status_obj->public ) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1141
			$caps[] = $post_type->cap->read;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1142
			break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1143
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1144
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1145
		$post_author_id = $post->post_author;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1146
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1147
		// If no author set yet, default to current user for cap checks.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1148
		if ( ! $post_author_id )
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1149
			$post_author_id = $user_id;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1150
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1151
		if ( $user_id == $post_author_id )
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1152
			$caps[] = $post_type->cap->read;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1153
		elseif ( $status_obj->private )
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1154
			$caps[] = $post_type->cap->read_private_posts;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1155
		else
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1156
			$caps = map_meta_cap( 'edit_post', $user_id, $post->ID );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1157
		break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1158
	case 'publish_post':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1159
		$post = get_post( $args[0] );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1160
		$post_type = get_post_type_object( $post->post_type );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1161
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1162
		$caps[] = $post_type->cap->publish_posts;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1163
		break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1164
	case 'edit_post_meta':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1165
	case 'delete_post_meta':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1166
	case 'add_post_meta':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1167
		$post = get_post( $args[0] );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1168
		$caps = map_meta_cap( 'edit_post', $user_id, $post->ID );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1169
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1170
		$meta_key = isset( $args[ 1 ] ) ? $args[ 1 ] : false;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1171
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1172
		if ( $meta_key && has_filter( "auth_post_meta_{$meta_key}" ) ) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1173
			$allowed = apply_filters( "auth_post_meta_{$meta_key}", false, $meta_key, $post->ID, $user_id, $cap, $caps );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1174
			if ( ! $allowed )
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1175
				$caps[] = $cap;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1176
		} elseif ( $meta_key && is_protected_meta( $meta_key, 'post' ) ) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1177
			$caps[] = $cap;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1178
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1179
		break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1180
	case 'edit_comment':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1181
		$comment = get_comment( $args[0] );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1182
		if ( empty( $comment ) )
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1183
			break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1184
		$post = get_post( $comment->comment_post_ID );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1185
		$caps = map_meta_cap( 'edit_post', $user_id, $post->ID );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1186
		break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1187
	case 'unfiltered_upload':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1188
		if ( defined('ALLOW_UNFILTERED_UPLOADS') && ALLOW_UNFILTERED_UPLOADS && ( !is_multisite() || is_super_admin( $user_id ) )  )
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1189
			$caps[] = $cap;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1190
		else
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1191
			$caps[] = 'do_not_allow';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1192
		break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1193
	case 'unfiltered_html' :
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1194
		// Disallow unfiltered_html for all users, even admins and super admins.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1195
		if ( defined( 'DISALLOW_UNFILTERED_HTML' ) && DISALLOW_UNFILTERED_HTML )
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1196
			$caps[] = 'do_not_allow';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1197
		elseif ( is_multisite() && ! is_super_admin( $user_id ) )
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1198
			$caps[] = 'do_not_allow';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1199
		else
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1200
			$caps[] = $cap;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1201
		break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1202
	case 'edit_files':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1203
	case 'edit_plugins':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1204
	case 'edit_themes':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1205
		// Disallow the file editors.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1206
		if ( defined( 'DISALLOW_FILE_EDIT' ) && DISALLOW_FILE_EDIT )
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1207
			$caps[] = 'do_not_allow';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1208
		elseif ( defined( 'DISALLOW_FILE_MODS' ) && DISALLOW_FILE_MODS )
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1209
			$caps[] = 'do_not_allow';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1210
		elseif ( is_multisite() && ! is_super_admin( $user_id ) )
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1211
			$caps[] = 'do_not_allow';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1212
		else
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1213
			$caps[] = $cap;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1214
		break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1215
	case 'update_plugins':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1216
	case 'delete_plugins':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1217
	case 'install_plugins':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1218
	case 'update_themes':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1219
	case 'delete_themes':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1220
	case 'install_themes':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1221
	case 'update_core':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1222
		// Disallow anything that creates, deletes, or updates core, plugin, or theme files.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1223
		// Files in uploads are excepted.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1224
		if ( defined( 'DISALLOW_FILE_MODS' ) && DISALLOW_FILE_MODS )
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1225
			$caps[] = 'do_not_allow';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1226
		elseif ( is_multisite() && ! is_super_admin( $user_id ) )
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1227
			$caps[] = 'do_not_allow';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1228
		else
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1229
			$caps[] = $cap;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1230
		break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1231
	case 'activate_plugins':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1232
		$caps[] = $cap;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1233
		if ( is_multisite() ) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1234
			// update_, install_, and delete_ are handled above with is_super_admin().
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1235
			$menu_perms = get_site_option( 'menu_items', array() );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1236
			if ( empty( $menu_perms['plugins'] ) )
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1237
				$caps[] = 'manage_network_plugins';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1238
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1239
		break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1240
	case 'delete_user':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1241
	case 'delete_users':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1242
		// If multisite only super admins can delete users.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1243
		if ( is_multisite() && ! is_super_admin( $user_id ) )
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1244
			$caps[] = 'do_not_allow';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1245
		else
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1246
			$caps[] = 'delete_users'; // delete_user maps to delete_users.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1247
		break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1248
	case 'create_users':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1249
		if ( !is_multisite() )
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1250
			$caps[] = $cap;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1251
		elseif ( is_super_admin() || get_site_option( 'add_new_users' ) )
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1252
			$caps[] = $cap;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1253
		else
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1254
			$caps[] = 'do_not_allow';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1255
		break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1256
	case 'manage_links' :
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1257
		if ( get_option( 'link_manager_enabled' ) )
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1258
			$caps[] = $cap;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1259
		else
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1260
			$caps[] = 'do_not_allow';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1261
		break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1262
	default:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1263
		// Handle meta capabilities for custom post types.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1264
		$post_type_meta_caps = _post_type_meta_capabilities();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1265
		if ( isset( $post_type_meta_caps[ $cap ] ) ) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1266
			$args = array_merge( array( $post_type_meta_caps[ $cap ], $user_id ), $args );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1267
			return call_user_func_array( 'map_meta_cap', $args );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1268
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1269
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1270
		// If no meta caps match, return the original cap.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1271
		$caps[] = $cap;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1272
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1273
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1274
	return apply_filters('map_meta_cap', $caps, $cap, $user_id, $args);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1275
}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1276
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1277
/**
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1278
 * Whether current user has capability or role.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1279
 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1280
 * @since 2.0.0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1281
 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1282
 * @param string $capability Capability or role name.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1283
 * @return bool
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1284
 */
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1285
function current_user_can( $capability ) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1286
	$current_user = wp_get_current_user();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1287
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1288
	if ( empty( $current_user ) )
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1289
		return false;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1290
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1291
	$args = array_slice( func_get_args(), 1 );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1292
	$args = array_merge( array( $capability ), $args );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1293
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1294
	return call_user_func_array( array( $current_user, 'has_cap' ), $args );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1295
}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1296
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1297
/**
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1298
 * Whether current user has a capability or role for a given blog.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1299
 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1300
 * @since 3.0.0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1301
 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1302
 * @param int $blog_id Blog ID
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1303
 * @param string $capability Capability or role name.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1304
 * @return bool
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1305
 */
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1306
function current_user_can_for_blog( $blog_id, $capability ) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1307
	if ( is_multisite() )
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1308
		switch_to_blog( $blog_id );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1309
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1310
	$current_user = wp_get_current_user();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1311
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1312
	if ( empty( $current_user ) )
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1313
		return false;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1314
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1315
	$args = array_slice( func_get_args(), 2 );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1316
	$args = array_merge( array( $capability ), $args );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1317
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1318
	$can = call_user_func_array( array( $current_user, 'has_cap' ), $args );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1319
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1320
	if ( is_multisite() )
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1321
		restore_current_blog();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1322
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1323
	return $can;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1324
}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1325
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1326
/**
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1327
 * Whether author of supplied post has capability or role.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1328
 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1329
 * @since 2.9.0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1330
 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1331
 * @param int|object $post Post ID or post object.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1332
 * @param string $capability Capability or role name.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1333
 * @return bool
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1334
 */
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1335
function author_can( $post, $capability ) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1336
	if ( !$post = get_post($post) )
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1337
		return false;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1338
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1339
	$author = get_userdata( $post->post_author );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1340
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1341
	if ( ! $author )
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1342
		return false;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1343
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1344
	$args = array_slice( func_get_args(), 2 );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1345
	$args = array_merge( array( $capability ), $args );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1346
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1347
	return call_user_func_array( array( $author, 'has_cap' ), $args );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1348
}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1349
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1350
/**
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1351
 * Whether a particular user has capability or role.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1352
 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1353
 * @since 3.1.0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1354
 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1355
 * @param int|object $user User ID or object.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1356
 * @param string $capability Capability or role name.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1357
 * @return bool
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1358
 */
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1359
function user_can( $user, $capability ) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1360
	if ( ! is_object( $user ) )
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1361
		$user = get_userdata( $user );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1362
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1363
	if ( ! $user || ! $user->exists() )
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1364
		return false;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1365
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1366
	$args = array_slice( func_get_args(), 2 );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1367
	$args = array_merge( array( $capability ), $args );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1368
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1369
	return call_user_func_array( array( $user, 'has_cap' ), $args );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1370
}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1371
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1372
/**
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1373
 * Retrieve role object.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1374
 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1375
 * @see WP_Roles::get_role() Uses method to retrieve role object.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1376
 * @since 2.0.0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1377
 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1378
 * @param string $role Role name.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1379
 * @return WP_Role|null WP_Role object if found, null if the role does not exist.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1380
 */
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1381
function get_role( $role ) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1382
	global $wp_roles;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1383
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1384
	if ( ! isset( $wp_roles ) )
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1385
		$wp_roles = new WP_Roles();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1386
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1387
	return $wp_roles->get_role( $role );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1388
}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1389
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1390
/**
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1391
 * Add role, if it does not exist.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1392
 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1393
 * @see WP_Roles::add_role() Uses method to add role.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1394
 * @since 2.0.0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1395
 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1396
 * @param string $role Role name.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1397
 * @param string $display_name Display name for role.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1398
 * @param array $capabilities List of capabilities, e.g. array( 'edit_posts' => true, 'delete_posts' => false );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1399
 * @return WP_Role|null WP_Role object if role is added, null if already exists.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1400
 */
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1401
function add_role( $role, $display_name, $capabilities = array() ) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1402
	global $wp_roles;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1403
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1404
	if ( ! isset( $wp_roles ) )
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1405
		$wp_roles = new WP_Roles();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1406
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1407
	return $wp_roles->add_role( $role, $display_name, $capabilities );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1408
}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1409
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1410
/**
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1411
 * Remove role, if it exists.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1412
 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1413
 * @see WP_Roles::remove_role() Uses method to remove role.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1414
 * @since 2.0.0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1415
 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1416
 * @param string $role Role name.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1417
 */
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1418
function remove_role( $role ) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1419
	global $wp_roles;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1420
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1421
	if ( ! isset( $wp_roles ) )
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1422
		$wp_roles = new WP_Roles();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1423
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1424
	$wp_roles->remove_role( $role );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1425
}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1426
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1427
/**
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1428
 * Retrieve a list of super admins.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1429
 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1430
 * @since 3.0.0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1431
 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1432
 * @uses $super_admins Super admins global variable, if set.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1433
 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1434
 * @return array List of super admin logins
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1435
 */
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1436
function get_super_admins() {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1437
	global $super_admins;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1438
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1439
	if ( isset($super_admins) )
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1440
		return $super_admins;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1441
	else
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1442
		return get_site_option( 'site_admins', array('admin') );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1443
}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1444
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1445
/**
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1446
 * Determine if user is a site admin.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1447
 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1448
 * @since 3.0.0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1449
 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1450
 * @param int $user_id (Optional) The ID of a user. Defaults to the current user.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1451
 * @return bool True if the user is a site admin.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1452
 */
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1453
function is_super_admin( $user_id = false ) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1454
	if ( ! $user_id || $user_id == get_current_user_id() )
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1455
		$user = wp_get_current_user();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1456
	else
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1457
		$user = get_userdata( $user_id );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1458
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1459
	if ( ! $user || ! $user->exists() )
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1460
		return false;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1461
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1462
	if ( is_multisite() ) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1463
		$super_admins = get_super_admins();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1464
		if ( is_array( $super_admins ) && in_array( $user->user_login, $super_admins ) )
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1465
			return true;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1466
	} else {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1467
		if ( $user->has_cap('delete_users') )
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1468
			return true;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1469
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1470
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1471
	return false;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1472
}