web/wp-admin/includes/user.php
branchwordpress
changeset 109 03b0d1493584
child 132 4d4862461b8d
equal deleted inserted replaced
-1:000000000000 109:03b0d1493584
       
     1 <?php
       
     2 /**
       
     3  * WordPress user administration API.
       
     4  *
       
     5  * @package WordPress
       
     6  * @subpackage Administration
       
     7  */
       
     8 
       
     9 /**
       
    10  * Creates a new user from the "Users" form using $_POST information.
       
    11  *
       
    12  * It seems that the first half is for backwards compatibility, but only
       
    13  * has the ability to alter the user's role. Wordpress core seems to
       
    14  * use this function only in the second way, running edit_user() with
       
    15  * no id so as to create a new user.
       
    16  *
       
    17  * @since 2.0
       
    18  *
       
    19  * @param int $user_id Optional. User ID.
       
    20  * @return null|WP_Error|int Null when adding user, WP_Error or User ID integer when no parameters.
       
    21  */
       
    22 function add_user() {
       
    23 	if ( func_num_args() ) { // The hackiest hack that ever did hack
       
    24 		global $current_user, $wp_roles;
       
    25 		$user_id = (int) func_get_arg( 0 );
       
    26 
       
    27 		if ( isset( $_POST['role'] ) ) {
       
    28 			// Don't let anyone with 'edit_users' (admins) edit their own role to something without it.
       
    29 			if( $user_id != $current_user->id || $wp_roles->role_objects[$_POST['role']]->has_cap( 'edit_users' ) ) {
       
    30 				// If the new role isn't editable by the logged-in user die with error
       
    31 				$editable_roles = get_editable_roles();
       
    32 				if (!$editable_roles[$_POST['role']])
       
    33 					wp_die(__('You can&#8217;t give users that role.'));
       
    34 
       
    35 				$user = new WP_User( $user_id );
       
    36 				$user->set_role( $_POST['role'] );
       
    37 			}
       
    38 		}
       
    39 	} else {
       
    40 		add_action( 'user_register', 'add_user' ); // See above
       
    41 		return edit_user();
       
    42 	}
       
    43 }
       
    44 
       
    45 /**
       
    46  * Edit user settings based on contents of $_POST
       
    47  *
       
    48  * Used on user-edit.php and profile.php to manage and process user options, passwords etc.
       
    49  *
       
    50  * @since 2.0
       
    51  *
       
    52  * @param int $user_id Optional. User ID.
       
    53  * @return int user id of the updated user
       
    54  */
       
    55 function edit_user( $user_id = 0 ) {
       
    56 	global $current_user, $wp_roles, $wpdb;
       
    57 	if ( $user_id != 0 ) {
       
    58 		$update = true;
       
    59 		$user->ID = (int) $user_id;
       
    60 		$userdata = get_userdata( $user_id );
       
    61 		$user->user_login = $wpdb->escape( $userdata->user_login );
       
    62 	} else {
       
    63 		$update = false;
       
    64 		$user = '';
       
    65 	}
       
    66 
       
    67 	if ( isset( $_POST['user_login'] ))
       
    68 		$user->user_login = esc_html( trim( $_POST['user_login'] ));
       
    69 
       
    70 	$pass1 = $pass2 = '';
       
    71 	if ( isset( $_POST['pass1'] ))
       
    72 		$pass1 = $_POST['pass1'];
       
    73 	if ( isset( $_POST['pass2'] ))
       
    74 		$pass2 = $_POST['pass2'];
       
    75 
       
    76 	if ( isset( $_POST['role'] ) && current_user_can( 'edit_users' ) ) {
       
    77 
       
    78 		// Don't let anyone with 'edit_users' (admins) edit their own role to something without it.
       
    79 		if( $user_id != $current_user->id || $wp_roles->role_objects[$_POST['role']]->has_cap( 'edit_users' ))
       
    80 			$user->role = $_POST['role'];
       
    81 
       
    82 		// If the new role isn't editable by the logged-in user die with error
       
    83 		$editable_roles = get_editable_roles();
       
    84 		if (!$editable_roles[$_POST['role']])
       
    85 			wp_die(__('You can&#8217;t give users that role.'));
       
    86 	}
       
    87 
       
    88 	if ( isset( $_POST['email'] ))
       
    89 		$user->user_email = esc_html( trim( $_POST['email'] ));
       
    90 	if ( isset( $_POST['url'] ) ) {
       
    91 		if ( empty ( $_POST['url'] ) || $_POST['url'] == 'http://' ) {
       
    92 			$user->user_url = '';
       
    93 		} else {
       
    94 			$user->user_url = esc_url( trim( $_POST['url'] ));
       
    95 			$user->user_url = preg_match('/^(https?|ftps?|mailto|news|irc|gopher|nntp|feed|telnet):/is', $user->user_url) ? $user->user_url : 'http://'.$user->user_url;
       
    96 		}
       
    97 	}
       
    98 	if ( isset( $_POST['first_name'] ))
       
    99 		$user->first_name = esc_html( trim( $_POST['first_name'] ));
       
   100 	if ( isset( $_POST['last_name'] ))
       
   101 		$user->last_name = esc_html( trim( $_POST['last_name'] ));
       
   102 	if ( isset( $_POST['nickname'] ))
       
   103 		$user->nickname = esc_html( trim( $_POST['nickname'] ));
       
   104 	if ( isset( $_POST['display_name'] ))
       
   105 		$user->display_name = esc_html( trim( $_POST['display_name'] ));
       
   106 	if ( isset( $_POST['description'] ))
       
   107 		$user->description = trim( $_POST['description'] );
       
   108 	if ( isset( $_POST['jabber'] ))
       
   109 		$user->jabber = esc_html( trim( $_POST['jabber'] ));
       
   110 	if ( isset( $_POST['aim'] ))
       
   111 		$user->aim = esc_html( trim( $_POST['aim'] ));
       
   112 	if ( isset( $_POST['yim'] ))
       
   113 		$user->yim = esc_html( trim( $_POST['yim'] ));
       
   114 	if ( !$update )
       
   115 		$user->rich_editing = 'true';  // Default to true for new users.
       
   116 	else if ( isset( $_POST['rich_editing'] ) )
       
   117 		$user->rich_editing = $_POST['rich_editing'];
       
   118 	else
       
   119 		$user->rich_editing = 'true';
       
   120 
       
   121 	$user->comment_shortcuts = isset( $_POST['comment_shortcuts'] )? $_POST['comment_shortcuts'] : '';
       
   122 
       
   123 	$user->use_ssl = 0;
       
   124 	if ( !empty($_POST['use_ssl']) )
       
   125 		$user->use_ssl = 1;
       
   126 
       
   127 	if ( !$update )
       
   128 		$user->admin_color = 'fresh';  // Default to fresh for new users.
       
   129 	else if ( isset( $_POST['admin_color'] ) )
       
   130 		$user->admin_color = $_POST['admin_color'];
       
   131 	else
       
   132 		$user->admin_color = 'fresh';
       
   133 
       
   134 	$errors = new WP_Error();
       
   135 
       
   136 	/* checking that username has been typed */
       
   137 	if ( $user->user_login == '' )
       
   138 		$errors->add( 'user_login', __( '<strong>ERROR</strong>: Please enter a username.' ));
       
   139 
       
   140 	/* checking the password has been typed twice */
       
   141 	do_action_ref_array( 'check_passwords', array ( $user->user_login, & $pass1, & $pass2 ));
       
   142 
       
   143 	if ( $update ) {
       
   144 		if ( empty($pass1) && !empty($pass2) )
       
   145 			$errors->add( 'pass', __( '<strong>ERROR</strong>: You entered your new password only once.' ), array( 'form-field' => 'pass1' ) );
       
   146 		elseif ( !empty($pass1) && empty($pass2) )
       
   147 			$errors->add( 'pass', __( '<strong>ERROR</strong>: You entered your new password only once.' ), array( 'form-field' => 'pass2' ) );
       
   148 	} else {
       
   149 		if ( empty($pass1) )
       
   150 			$errors->add( 'pass', __( '<strong>ERROR</strong>: Please enter your password.' ), array( 'form-field' => 'pass1' ) );
       
   151 		elseif ( empty($pass2) )
       
   152 			$errors->add( 'pass', __( '<strong>ERROR</strong>: Please enter your password twice.' ), array( 'form-field' => 'pass2' ) );
       
   153 	}
       
   154 
       
   155 	/* Check for "\" in password */
       
   156 	if ( false !== strpos( stripslashes($pass1), "\\" ) )
       
   157 		$errors->add( 'pass', __( '<strong>ERROR</strong>: Passwords may not contain the character "\\".' ), array( 'form-field' => 'pass1' ) );
       
   158 
       
   159 	/* checking the password has been typed twice the same */
       
   160 	if ( $pass1 != $pass2 )
       
   161 		$errors->add( 'pass', __( '<strong>ERROR</strong>: Please enter the same password in the two password fields.' ), array( 'form-field' => 'pass1' ) );
       
   162 
       
   163 	if (!empty ( $pass1 ))
       
   164 		$user->user_pass = $pass1;
       
   165 
       
   166 	if ( !$update && !validate_username( $user->user_login ) )
       
   167 		$errors->add( 'user_login', __( '<strong>ERROR</strong>: This username is invalid. Please enter a valid username.' ));
       
   168 
       
   169 	if (!$update && username_exists( $user->user_login ))
       
   170 		$errors->add( 'user_login', __( '<strong>ERROR</strong>: This username is already registered. Please choose another one.' ));
       
   171 
       
   172 	/* checking e-mail address */
       
   173 	if ( empty ( $user->user_email ) ) {
       
   174 		$errors->add( 'empty_email', __( '<strong>ERROR</strong>: Please enter an e-mail address.' ), array( 'form-field' => 'email' ) );
       
   175 	} elseif (!is_email( $user->user_email ) ) {
       
   176 		$errors->add( 'invalid_email', __( '<strong>ERROR</strong>: The e-mail address isn&#8217;t correct.' ), array( 'form-field' => 'email' ) );
       
   177 	} elseif ( ( $owner_id = email_exists($user->user_email) ) && $owner_id != $user->ID ) {
       
   178 		$errors->add( 'email_exists', __('<strong>ERROR</strong>: This email is already registered, please choose another one.'), array( 'form-field' => 'email' ) );
       
   179 	}
       
   180 
       
   181 	// Allow plugins to return there own errors.
       
   182 	do_action_ref_array('user_profile_update_errors', array ( &$errors, $update, &$user ) );
       
   183 
       
   184 	if ( $errors->get_error_codes() )
       
   185 		return $errors;
       
   186 
       
   187 	if ( $update ) {
       
   188 		$user_id = wp_update_user( get_object_vars( $user ));
       
   189 	} else {
       
   190 		$user_id = wp_insert_user( get_object_vars( $user ));
       
   191 		wp_new_user_notification( $user_id, isset($_POST['send_password']) ? $pass1 : '' );
       
   192 	}
       
   193 	return $user_id;
       
   194 }
       
   195 
       
   196 /**
       
   197  * {@internal Missing Short Description}}
       
   198  *
       
   199  * {@internal Missing Long Description}}
       
   200  *
       
   201  * @since unknown
       
   202  *
       
   203  * @return array List of user IDs.
       
   204  */
       
   205 function get_author_user_ids() {
       
   206 	global $wpdb;
       
   207 	$level_key = $wpdb->prefix . 'user_level';
       
   208 	return $wpdb->get_col( $wpdb->prepare("SELECT user_id FROM $wpdb->usermeta WHERE meta_key = %s AND meta_value != '0'", $level_key) );
       
   209 }
       
   210 
       
   211 /**
       
   212  * {@internal Missing Short Description}}
       
   213  *
       
   214  * {@internal Missing Long Description}}
       
   215  *
       
   216  * @since unknown
       
   217  *
       
   218  * @param int $user_id User ID.
       
   219  * @return array|bool List of editable authors. False if no editable users.
       
   220  */
       
   221 function get_editable_authors( $user_id ) {
       
   222 	global $wpdb;
       
   223 
       
   224 	$editable = get_editable_user_ids( $user_id );
       
   225 
       
   226 	if( !$editable ) {
       
   227 		return false;
       
   228 	} else {
       
   229 		$editable = join(',', $editable);
       
   230 		$authors = $wpdb->get_results( "SELECT * FROM $wpdb->users WHERE ID IN ($editable) ORDER BY display_name" );
       
   231 	}
       
   232 
       
   233 	return apply_filters('get_editable_authors', $authors);
       
   234 }
       
   235 
       
   236 /**
       
   237  * {@internal Missing Short Description}}
       
   238  *
       
   239  * {@internal Missing Long Description}}
       
   240  *
       
   241  * @since unknown
       
   242  *
       
   243  * @param int $user_id User ID.
       
   244  * @param bool $exclude_zeros Optional, default is true. Whether to exclude zeros.
       
   245  * @return unknown
       
   246  */
       
   247 function get_editable_user_ids( $user_id, $exclude_zeros = true, $post_type = 'post' ) {
       
   248 	global $wpdb;
       
   249 
       
   250 	$user = new WP_User( $user_id );
       
   251 
       
   252 	if ( ! $user->has_cap("edit_others_{$post_type}s") ) {
       
   253 		if ( $user->has_cap("edit_{$post_type}s") || $exclude_zeros == false )
       
   254 			return array($user->id);
       
   255 		else
       
   256 			return array();
       
   257 	}
       
   258 
       
   259 	$level_key = $wpdb->prefix . 'user_level';
       
   260 
       
   261 	$query = $wpdb->prepare("SELECT user_id FROM $wpdb->usermeta WHERE meta_key = %s", $level_key);
       
   262 	if ( $exclude_zeros )
       
   263 		$query .= " AND meta_value != '0'";
       
   264 
       
   265 	return $wpdb->get_col( $query );
       
   266 }
       
   267 
       
   268 /**
       
   269  * Fetch a filtered list of user roles that the current user is
       
   270  * allowed to edit.
       
   271  *
       
   272  * Simple function who's main purpose is to allow filtering of the
       
   273  * list of roles in the $wp_roles object so that plugins can remove
       
   274  * innappropriate ones depending on the situation or user making edits.
       
   275  * Specifically because without filtering anyone with the edit_users
       
   276  * capability can edit others to be administrators, even if they are
       
   277  * only editors or authors. This filter allows admins to delegate
       
   278  * user management.
       
   279  *
       
   280  * @since 2.8
       
   281  *
       
   282  * @return unknown
       
   283  */
       
   284 function get_editable_roles() {
       
   285 	global $wp_roles;
       
   286 
       
   287 	$all_roles = $wp_roles->roles;
       
   288 	$editable_roles = apply_filters('editable_roles', $all_roles);
       
   289 
       
   290 	return $editable_roles;
       
   291 }
       
   292 
       
   293 /**
       
   294  * {@internal Missing Short Description}}
       
   295  *
       
   296  * {@internal Missing Long Description}}
       
   297  *
       
   298  * @since unknown
       
   299  *
       
   300  * @return unknown
       
   301  */
       
   302 function get_nonauthor_user_ids() {
       
   303 	global $wpdb;
       
   304 	$level_key = $wpdb->prefix . 'user_level';
       
   305 
       
   306 	return $wpdb->get_col( $wpdb->prepare("SELECT user_id FROM $wpdb->usermeta WHERE meta_key = %s AND meta_value = '0'", $level_key) );
       
   307 }
       
   308 
       
   309 /**
       
   310  * Retrieve editable posts from other users.
       
   311  *
       
   312  * @since unknown
       
   313  *
       
   314  * @param int $user_id User ID to not retrieve posts from.
       
   315  * @param string $type Optional, defaults to 'any'. Post type to retrieve, can be 'draft' or 'pending'.
       
   316  * @return array List of posts from others.
       
   317  */
       
   318 function get_others_unpublished_posts($user_id, $type='any') {
       
   319 	global $wpdb;
       
   320 
       
   321 	$editable = get_editable_user_ids( $user_id );
       
   322 
       
   323 	if ( in_array($type, array('draft', 'pending')) )
       
   324 		$type_sql = " post_status = '$type' ";
       
   325 	else
       
   326 		$type_sql = " ( post_status = 'draft' OR post_status = 'pending' ) ";
       
   327 
       
   328 	$dir = ( 'pending' == $type ) ? 'ASC' : 'DESC';
       
   329 
       
   330 	if( !$editable ) {
       
   331 		$other_unpubs = '';
       
   332 	} else {
       
   333 		$editable = join(',', $editable);
       
   334 		$other_unpubs = $wpdb->get_results( $wpdb->prepare("SELECT ID, post_title, post_author FROM $wpdb->posts WHERE post_type = 'post' AND $type_sql AND post_author IN ($editable) AND post_author != %d ORDER BY post_modified $dir", $user_id) );
       
   335 	}
       
   336 
       
   337 	return apply_filters('get_others_drafts', $other_unpubs);
       
   338 }
       
   339 
       
   340 /**
       
   341  * Retrieve drafts from other users.
       
   342  *
       
   343  * @since unknown
       
   344  *
       
   345  * @param int $user_id User ID.
       
   346  * @return array List of drafts from other users.
       
   347  */
       
   348 function get_others_drafts($user_id) {
       
   349 	return get_others_unpublished_posts($user_id, 'draft');
       
   350 }
       
   351 
       
   352 /**
       
   353  * Retrieve pending review posts from other users.
       
   354  *
       
   355  * @since unknown
       
   356  *
       
   357  * @param int $user_id User ID.
       
   358  * @return array List of posts with pending review post type from other users.
       
   359  */
       
   360 function get_others_pending($user_id) {
       
   361 	return get_others_unpublished_posts($user_id, 'pending');
       
   362 }
       
   363 
       
   364 /**
       
   365  * Retrieve user data and filter it.
       
   366  *
       
   367  * @since unknown
       
   368  *
       
   369  * @param int $user_id User ID.
       
   370  * @return object WP_User object with user data.
       
   371  */
       
   372 function get_user_to_edit( $user_id ) {
       
   373 	$user = new WP_User( $user_id );
       
   374 	$user->user_login   = esc_attr($user->user_login);
       
   375 	$user->user_email   = esc_attr($user->user_email);
       
   376 	$user->user_url     = esc_url($user->user_url);
       
   377 	$user->first_name   = esc_attr($user->first_name);
       
   378 	$user->last_name    = esc_attr($user->last_name);
       
   379 	$user->display_name = esc_attr($user->display_name);
       
   380 	$user->nickname     = esc_attr($user->nickname);
       
   381 	$user->aim          = isset( $user->aim ) && !empty( $user->aim ) ? esc_attr($user->aim) : '';
       
   382 	$user->yim          = isset( $user->yim ) && !empty( $user->yim ) ? esc_attr($user->yim) : '';
       
   383 	$user->jabber       = isset( $user->jabber ) && !empty( $user->jabber ) ? esc_attr($user->jabber) : '';
       
   384 	$user->description  = isset( $user->description ) && !empty( $user->description ) ? esc_html($user->description) : '';
       
   385 
       
   386 	return $user;
       
   387 }
       
   388 
       
   389 /**
       
   390  * Retrieve the user's drafts.
       
   391  *
       
   392  * @since unknown
       
   393  *
       
   394  * @param int $user_id User ID.
       
   395  * @return array
       
   396  */
       
   397 function get_users_drafts( $user_id ) {
       
   398 	global $wpdb;
       
   399 	$query = $wpdb->prepare("SELECT ID, post_title FROM $wpdb->posts WHERE post_type = 'post' AND post_status = 'draft' AND post_author = %d ORDER BY post_modified DESC", $user_id);
       
   400 	$query = apply_filters('get_users_drafts', $query);
       
   401 	return $wpdb->get_results( $query );
       
   402 }
       
   403 
       
   404 /**
       
   405  * Remove user and optionally reassign posts and links to another user.
       
   406  *
       
   407  * If the $reassign parameter is not assigned to an User ID, then all posts will
       
   408  * be deleted of that user. The action 'delete_user' that is passed the User ID
       
   409  * being deleted will be run after the posts are either reassigned or deleted.
       
   410  * The user meta will also be deleted that are for that User ID.
       
   411  *
       
   412  * @since unknown
       
   413  *
       
   414  * @param int $id User ID.
       
   415  * @param int $reassign Optional. Reassign posts and links to new User ID.
       
   416  * @return bool True when finished.
       
   417  */
       
   418 function wp_delete_user($id, $reassign = 'novalue') {
       
   419 	global $wpdb;
       
   420 
       
   421 	$id = (int) $id;
       
   422 	$user = new WP_User($id);
       
   423 
       
   424 	// allow for transaction statement
       
   425 	do_action('delete_user', $id);
       
   426 
       
   427 	if ($reassign == 'novalue') {
       
   428 		$post_ids = $wpdb->get_col( $wpdb->prepare("SELECT ID FROM $wpdb->posts WHERE post_author = %d", $id) );
       
   429 
       
   430 		if ($post_ids) {
       
   431 			foreach ($post_ids as $post_id)
       
   432 				wp_delete_post($post_id);
       
   433 		}
       
   434 
       
   435 		// Clean links
       
   436 		$link_ids = $wpdb->get_col( $wpdb->prepare("SELECT link_id FROM $wpdb->links WHERE link_owner = %d", $id) );
       
   437 
       
   438 		if ( $link_ids ) {
       
   439 			foreach ( $link_ids as $link_id )
       
   440 				wp_delete_link($link_id);
       
   441 		}
       
   442 
       
   443 	} else {
       
   444 		$reassign = (int) $reassign;
       
   445 		$wpdb->query( $wpdb->prepare("UPDATE $wpdb->posts SET post_author = %d WHERE post_author = %d", $reassign, $id) );
       
   446 		$wpdb->query( $wpdb->prepare("UPDATE $wpdb->links SET link_owner = %d WHERE link_owner = %d", $reassign, $id) );
       
   447 	}
       
   448 
       
   449 	// FINALLY, delete user
       
   450 
       
   451 	$wpdb->query( $wpdb->prepare("DELETE FROM $wpdb->usermeta WHERE user_id = %d", $id) );
       
   452 	$wpdb->query( $wpdb->prepare("DELETE FROM $wpdb->users WHERE ID = %d", $id) );
       
   453 
       
   454 	wp_cache_delete($id, 'users');
       
   455 	wp_cache_delete($user->user_login, 'userlogins');
       
   456 	wp_cache_delete($user->user_email, 'useremail');
       
   457 	wp_cache_delete($user->user_nicename, 'userslugs');
       
   458 
       
   459 	// allow for commit transaction
       
   460 	do_action('deleted_user', $id);
       
   461 
       
   462 	return true;
       
   463 }
       
   464 
       
   465 /**
       
   466  * Remove all capabilities from user.
       
   467  *
       
   468  * @since unknown
       
   469  *
       
   470  * @param int $id User ID.
       
   471  */
       
   472 function wp_revoke_user($id) {
       
   473 	$id = (int) $id;
       
   474 
       
   475 	$user = new WP_User($id);
       
   476 	$user->remove_all_caps();
       
   477 }
       
   478 
       
   479 if ( !class_exists('WP_User_Search') ) :
       
   480 /**
       
   481  * WordPress User Search class.
       
   482  *
       
   483  * @since unknown
       
   484  * @author Mark Jaquith
       
   485  */
       
   486 class WP_User_Search {
       
   487 
       
   488 	/**
       
   489 	 * {@internal Missing Description}}
       
   490 	 *
       
   491 	 * @since unknown
       
   492 	 * @access private
       
   493 	 * @var unknown_type
       
   494 	 */
       
   495 	var $results;
       
   496 
       
   497 	/**
       
   498 	 * {@internal Missing Description}}
       
   499 	 *
       
   500 	 * @since unknown
       
   501 	 * @access private
       
   502 	 * @var unknown_type
       
   503 	 */
       
   504 	var $search_term;
       
   505 
       
   506 	/**
       
   507 	 * Page number.
       
   508 	 *
       
   509 	 * @since unknown
       
   510 	 * @access private
       
   511 	 * @var int
       
   512 	 */
       
   513 	var $page;
       
   514 
       
   515 	/**
       
   516 	 * Role name that users have.
       
   517 	 *
       
   518 	 * @since unknown
       
   519 	 * @access private
       
   520 	 * @var string
       
   521 	 */
       
   522 	var $role;
       
   523 
       
   524 	/**
       
   525 	 * Raw page number.
       
   526 	 *
       
   527 	 * @since unknown
       
   528 	 * @access private
       
   529 	 * @var int|bool
       
   530 	 */
       
   531 	var $raw_page;
       
   532 
       
   533 	/**
       
   534 	 * Amount of users to display per page.
       
   535 	 *
       
   536 	 * @since unknown
       
   537 	 * @access public
       
   538 	 * @var int
       
   539 	 */
       
   540 	var $users_per_page = 50;
       
   541 
       
   542 	/**
       
   543 	 * {@internal Missing Description}}
       
   544 	 *
       
   545 	 * @since unknown
       
   546 	 * @access private
       
   547 	 * @var unknown_type
       
   548 	 */
       
   549 	var $first_user;
       
   550 
       
   551 	/**
       
   552 	 * {@internal Missing Description}}
       
   553 	 *
       
   554 	 * @since unknown
       
   555 	 * @access private
       
   556 	 * @var int
       
   557 	 */
       
   558 	var $last_user;
       
   559 
       
   560 	/**
       
   561 	 * {@internal Missing Description}}
       
   562 	 *
       
   563 	 * @since unknown
       
   564 	 * @access private
       
   565 	 * @var unknown_type
       
   566 	 */
       
   567 	var $query_limit;
       
   568 
       
   569 	/**
       
   570 	 * {@internal Missing Description}}
       
   571 	 *
       
   572 	 * @since unknown
       
   573 	 * @access private
       
   574 	 * @var unknown_type
       
   575 	 */
       
   576 	var $query_sort;
       
   577 
       
   578 	/**
       
   579 	 * {@internal Missing Description}}
       
   580 	 *
       
   581 	 * @since unknown
       
   582 	 * @access private
       
   583 	 * @var unknown_type
       
   584 	 */
       
   585 	var $query_from_where;
       
   586 
       
   587 	/**
       
   588 	 * {@internal Missing Description}}
       
   589 	 *
       
   590 	 * @since unknown
       
   591 	 * @access private
       
   592 	 * @var int
       
   593 	 */
       
   594 	var $total_users_for_query = 0;
       
   595 
       
   596 	/**
       
   597 	 * {@internal Missing Description}}
       
   598 	 *
       
   599 	 * @since unknown
       
   600 	 * @access private
       
   601 	 * @var bool
       
   602 	 */
       
   603 	var $too_many_total_users = false;
       
   604 
       
   605 	/**
       
   606 	 * {@internal Missing Description}}
       
   607 	 *
       
   608 	 * @since unknown
       
   609 	 * @access private
       
   610 	 * @var unknown_type
       
   611 	 */
       
   612 	var $search_errors;
       
   613 
       
   614 	/**
       
   615 	 * {@internal Missing Description}}
       
   616 	 *
       
   617 	 * @since unknown
       
   618 	 * @access private
       
   619 	 * @var unknown_type
       
   620 	 */
       
   621 	var $paging_text;
       
   622 
       
   623 	/**
       
   624 	 * PHP4 Constructor - Sets up the object properties.
       
   625 	 *
       
   626 	 * @since unknown
       
   627 	 *
       
   628 	 * @param string $search_term Search terms string.
       
   629 	 * @param int $page Optional. Page ID.
       
   630 	 * @param string $role Role name.
       
   631 	 * @return WP_User_Search
       
   632 	 */
       
   633 	function WP_User_Search ($search_term = '', $page = '', $role = '') {
       
   634 		$this->search_term = $search_term;
       
   635 		$this->raw_page = ( '' == $page ) ? false : (int) $page;
       
   636 		$this->page = (int) ( '' == $page ) ? 1 : $page;
       
   637 		$this->role = $role;
       
   638 
       
   639 		$this->prepare_query();
       
   640 		$this->query();
       
   641 		$this->prepare_vars_for_template_usage();
       
   642 		$this->do_paging();
       
   643 	}
       
   644 
       
   645 	/**
       
   646 	 * {@internal Missing Short Description}}
       
   647 	 *
       
   648 	 * {@internal Missing Long Description}}
       
   649 	 *
       
   650 	 * @since unknown
       
   651 	 * @access public
       
   652 	 */
       
   653 	function prepare_query() {
       
   654 		global $wpdb;
       
   655 		$this->first_user = ($this->page - 1) * $this->users_per_page;
       
   656 		$this->query_limit = $wpdb->prepare(" LIMIT %d, %d", $this->first_user, $this->users_per_page);
       
   657 		$this->query_sort = ' ORDER BY user_login';
       
   658 		$search_sql = '';
       
   659 		if ( $this->search_term ) {
       
   660 			$searches = array();
       
   661 			$search_sql = 'AND (';
       
   662 			foreach ( array('user_login', 'user_nicename', 'user_email', 'user_url', 'display_name') as $col )
       
   663 				$searches[] = $col . " LIKE '%$this->search_term%'";
       
   664 			$search_sql .= implode(' OR ', $searches);
       
   665 			$search_sql .= ')';
       
   666 		}
       
   667 
       
   668 		$this->query_from_where = "FROM $wpdb->users";
       
   669 		if ( $this->role )
       
   670 			$this->query_from_where .= $wpdb->prepare(" INNER JOIN $wpdb->usermeta ON $wpdb->users.ID = $wpdb->usermeta.user_id WHERE $wpdb->usermeta.meta_key = '{$wpdb->prefix}capabilities' AND $wpdb->usermeta.meta_value LIKE %s", '%' . $this->role . '%');
       
   671 		else
       
   672 			$this->query_from_where .= " WHERE 1=1";
       
   673 		$this->query_from_where .= " $search_sql";
       
   674 
       
   675 	}
       
   676 
       
   677 	/**
       
   678 	 * {@internal Missing Short Description}}
       
   679 	 *
       
   680 	 * {@internal Missing Long Description}}
       
   681 	 *
       
   682 	 * @since unknown
       
   683 	 * @access public
       
   684 	 */
       
   685 	function query() {
       
   686 		global $wpdb;
       
   687 		$this->results = $wpdb->get_col('SELECT ID ' . $this->query_from_where . $this->query_sort . $this->query_limit);
       
   688 
       
   689 		if ( $this->results )
       
   690 			$this->total_users_for_query = $wpdb->get_var('SELECT COUNT(ID) ' . $this->query_from_where); // no limit
       
   691 		else
       
   692 			$this->search_errors = new WP_Error('no_matching_users_found', __('No matching users were found!'));
       
   693 	}
       
   694 
       
   695 	/**
       
   696 	 * {@internal Missing Short Description}}
       
   697 	 *
       
   698 	 * {@internal Missing Long Description}}
       
   699 	 *
       
   700 	 * @since unknown
       
   701 	 * @access public
       
   702 	 */
       
   703 	function prepare_vars_for_template_usage() {
       
   704 		$this->search_term = stripslashes($this->search_term); // done with DB, from now on we want slashes gone
       
   705 	}
       
   706 
       
   707 	/**
       
   708 	 * {@internal Missing Short Description}}
       
   709 	 *
       
   710 	 * {@internal Missing Long Description}}
       
   711 	 *
       
   712 	 * @since unknown
       
   713 	 * @access public
       
   714 	 */
       
   715 	function do_paging() {
       
   716 		if ( $this->total_users_for_query > $this->users_per_page ) { // have to page the results
       
   717 			$args = array();
       
   718 			if( ! empty($this->search_term) )
       
   719 				$args['usersearch'] = urlencode($this->search_term);
       
   720 			if( ! empty($this->role) )
       
   721 				$args['role'] = urlencode($this->role);
       
   722 
       
   723 			$this->paging_text = paginate_links( array(
       
   724 				'total' => ceil($this->total_users_for_query / $this->users_per_page),
       
   725 				'current' => $this->page,
       
   726 				'base' => 'users.php?%_%',
       
   727 				'format' => 'userspage=%#%',
       
   728 				'add_args' => $args
       
   729 			) );
       
   730 			if ( $this->paging_text ) {
       
   731 				$this->paging_text = sprintf( '<span class="displaying-num">' . __( 'Displaying %s&#8211;%s of %s' ) . '</span>%s',
       
   732 					number_format_i18n( ( $this->page - 1 ) * $this->users_per_page + 1 ),
       
   733 					number_format_i18n( min( $this->page * $this->users_per_page, $this->total_users_for_query ) ),
       
   734 					number_format_i18n( $this->total_users_for_query ),
       
   735 					$this->paging_text
       
   736 				);
       
   737 			}
       
   738 		}
       
   739 	}
       
   740 
       
   741 	/**
       
   742 	 * {@internal Missing Short Description}}
       
   743 	 *
       
   744 	 * {@internal Missing Long Description}}
       
   745 	 *
       
   746 	 * @since unknown
       
   747 	 * @access public
       
   748 	 *
       
   749 	 * @return unknown
       
   750 	 */
       
   751 	function get_results() {
       
   752 		return (array) $this->results;
       
   753 	}
       
   754 
       
   755 	/**
       
   756 	 * Displaying paging text.
       
   757 	 *
       
   758 	 * @see do_paging() Builds paging text.
       
   759 	 *
       
   760 	 * @since unknown
       
   761 	 * @access public
       
   762 	 */
       
   763 	function page_links() {
       
   764 		echo $this->paging_text;
       
   765 	}
       
   766 
       
   767 	/**
       
   768 	 * Whether paging is enabled.
       
   769 	 *
       
   770 	 * @see do_paging() Builds paging text.
       
   771 	 *
       
   772 	 * @since unknown
       
   773 	 * @access public
       
   774 	 *
       
   775 	 * @return bool
       
   776 	 */
       
   777 	function results_are_paged() {
       
   778 		if ( $this->paging_text )
       
   779 			return true;
       
   780 		return false;
       
   781 	}
       
   782 
       
   783 	/**
       
   784 	 * Whether there are search terms.
       
   785 	 *
       
   786 	 * @since unknown
       
   787 	 * @access public
       
   788 	 *
       
   789 	 * @return bool
       
   790 	 */
       
   791 	function is_search() {
       
   792 		if ( $this->search_term )
       
   793 			return true;
       
   794 		return false;
       
   795 	}
       
   796 }
       
   797 endif;
       
   798 
       
   799 add_action('admin_init', 'default_password_nag_handler');
       
   800 function default_password_nag_handler($errors = false) {
       
   801 	global $user_ID;
       
   802 	if ( ! get_usermeta($user_ID, 'default_password_nag') ) //Short circuit it.
       
   803 		return;
       
   804 
       
   805 	//get_user_setting = JS saved UI setting. else no-js-falback code.
       
   806 	if ( 'hide' == get_user_setting('default_password_nag') || isset($_GET['default_password_nag']) && '0' == $_GET['default_password_nag'] ) {
       
   807 		delete_user_setting('default_password_nag');
       
   808 		update_usermeta($user_ID, 'default_password_nag', false);
       
   809 	}
       
   810 }
       
   811 
       
   812 add_action('profile_update', 'default_password_nag_edit_user', 10, 2);
       
   813 function default_password_nag_edit_user($user_ID, $old_data) {
       
   814 	global $user_ID;
       
   815 	if ( ! get_usermeta($user_ID, 'default_password_nag') ) //Short circuit it.
       
   816 		return;
       
   817 
       
   818 	$new_data = get_userdata($user_ID);
       
   819 
       
   820 	if ( $new_data->user_pass != $old_data->user_pass ) { //Remove the nag if the password has been changed.
       
   821 		delete_user_setting('default_password_nag');
       
   822 		update_usermeta($user_ID, 'default_password_nag', false);
       
   823 	}
       
   824 }
       
   825 
       
   826 add_action('admin_notices', 'default_password_nag');
       
   827 function default_password_nag() {
       
   828 	global $user_ID;
       
   829 	if ( ! get_usermeta($user_ID, 'default_password_nag') )
       
   830 		return;
       
   831 
       
   832 	echo '<div class="error default-password-nag"><p>';
       
   833 	printf(__("Notice: you're using the auto-generated password for your account. Would you like to change it to something you'll remember easier?<br />
       
   834 			  <a href='%s'>Yes, Take me to my profile page</a> | <a href='%s' id='default-password-nag-no'>No Thanks, Do not remind me again.</a>"), admin_url('profile.php') . '#password', '?default_password_nag=0');
       
   835 	echo '</p></div>';
       
   836 }
       
   837 
       
   838 ?>