[ Index ] |
PHP Cross Reference of BuddyPress |
[Summary view] [Print] [Text view]
1 <?php 2 /** 3 * Core component classes. 4 * 5 * @package BuddyPress 6 * @subpackage Core 7 * @since 1.0.0 8 */ 9 10 // Exit if accessed directly. 11 defined( 'ABSPATH' ) || exit; 12 13 /** 14 * Fetch data about a BuddyPress user. 15 * 16 * BP_Core_User class can be used by any component. It will fetch useful 17 * details for any user when provided with a user_id. 18 * 19 * Example: 20 * $user = new BP_Core_User( $user_id ); 21 * $user_avatar = $user->avatar; 22 * $user_email = $user->email; 23 * $user_status = $user->status; 24 * etc. 25 */ 26 class BP_Core_User { 27 28 /** 29 * ID of the user which the object relates to. 30 * 31 * @var integer 32 */ 33 public $id; 34 35 /** 36 * The URL to the full size of the avatar for the user. 37 * 38 * @var string 39 */ 40 public $avatar; 41 42 /** 43 * The URL to the thumb size of the avatar for the user. 44 * 45 * @var string 46 */ 47 public $avatar_thumb; 48 49 /** 50 * The URL to the mini size of the avatar for the user. 51 * 52 * @var string 53 */ 54 public $avatar_mini; 55 56 /** 57 * The full name of the user. 58 * 59 * @var string 60 */ 61 public $fullname; 62 63 /** 64 * The email for the user. 65 * 66 * @var string 67 */ 68 public $email; 69 70 /** 71 * The absolute url for the user's profile. 72 * 73 * @var string 74 */ 75 public $user_url; 76 77 /** 78 * The HTML for the user link, with the link text being the user's full name. 79 * 80 * @var string 81 */ 82 public $user_link; 83 84 /** 85 * Contains a formatted string when the last time the user was active. 86 * 87 * Example: "active 2 hours and 50 minutes ago" 88 * 89 * @var string 90 */ 91 public $last_active; 92 93 /* Extras */ 94 95 /** 96 * The total number of "Friends" the user has on site. 97 * 98 * @var integer 99 */ 100 public $total_friends; 101 102 /** 103 * The total number of blog posts posted by the user. 104 * 105 * @var integer 106 * @deprecated No longer used 107 */ 108 public $total_blogs; 109 110 /** 111 * The total number of groups the user is a part of. 112 * 113 * Example: "1 group", "2 groups" 114 * 115 * @var string 116 */ 117 public $total_groups; 118 119 /** 120 * Profile information for the specific user. 121 * 122 * @since 1.2.0 123 * @var array 124 */ 125 public $profile_data; 126 127 /** Public Methods *******************************************************/ 128 129 /** 130 * Class constructor. 131 * 132 * @param integer $user_id The ID for the user being queried. 133 * @param bool $populate_extras Whether to fetch extra information such as 134 * group/friendship counts or not. Default: false. 135 */ 136 public function __construct( $user_id, $populate_extras = false ) { 137 if ( !empty( $user_id ) ) { 138 $this->id = $user_id; 139 $this->populate(); 140 141 if ( !empty( $populate_extras ) ) { 142 $this->populate_extras(); 143 } 144 } 145 } 146 147 /** 148 * Populate the instantiated class with data based on the User ID provided. 149 */ 150 public function populate() { 151 152 if ( bp_is_active( 'xprofile' ) ) 153 $this->profile_data = $this->get_profile_data(); 154 155 if ( !empty( $this->profile_data ) ) { 156 $full_name_field_name = bp_xprofile_fullname_field_name(); 157 158 $this->user_url = bp_core_get_user_domain( $this->id, $this->profile_data['user_nicename'], $this->profile_data['user_login'] ); 159 $this->fullname = esc_attr( $this->profile_data[$full_name_field_name]['field_data'] ); 160 $this->user_link = "<a href='{$this->user_url}'>{$this->fullname}</a>"; 161 $this->email = esc_attr( $this->profile_data['user_email'] ); 162 } else { 163 $this->user_url = bp_core_get_user_domain( $this->id ); 164 $this->user_link = bp_core_get_userlink( $this->id ); 165 $this->fullname = esc_attr( bp_core_get_user_displayname( $this->id ) ); 166 $this->email = esc_attr( bp_core_get_user_email( $this->id ) ); 167 } 168 169 $this->avatar = bp_core_fetch_avatar( 170 array( 171 'item_id' => $this->id, 172 'type' => 'full', 173 'alt' => sprintf( 174 /* translators: %s: member name */ 175 __( 'Profile photo of %s', 'buddypress' ), 176 $this->fullname 177 ) 178 ) 179 ); 180 181 $this->avatar_thumb = bp_core_fetch_avatar( 182 array( 183 'item_id' => $this->id, 184 'type' => 'thumb', 185 'alt' => sprintf( 186 /* translators: %s: member name */ 187 __( 'Profile photo of %s', 'buddypress' ), 188 $this->fullname 189 ) 190 ) 191 ); 192 193 $this->avatar_mini = bp_core_fetch_avatar( 194 array( 195 'item_id' => $this->id, 196 'type' => 'thumb', 197 'alt' => sprintf( 198 /* translators: %s: member name */ 199 __( 'Profile photo of %s', 'buddypress' ), 200 $this->fullname 201 ), 202 'width' => 30, 203 'height' => 30 204 ) 205 ); 206 207 /* translators: %s: human time diff of the last time the user was active on the site. */ 208 $this->last_active = bp_core_get_last_activity( bp_get_user_last_activity( $this->id ), _x( 'Active %s', 'last time the user was active', 'buddypress' ) ); 209 } 210 211 /** 212 * Populates extra fields such as group and friendship counts. 213 */ 214 public function populate_extras() { 215 216 if ( bp_is_active( 'friends' ) ) { 217 $this->total_friends = BP_Friends_Friendship::total_friend_count( $this->id ); 218 } 219 220 if ( bp_is_active( 'groups' ) ) { 221 $this->total_groups = BP_Groups_Member::total_group_count( $this->id ); 222 $this->total_groups = sprintf( 223 /* translators: %s: total groups count */ 224 _n( '%d group', '%d groups', $this->total_groups, 'buddypress' ), 225 $this->total_groups 226 ); 227 } 228 } 229 230 /** 231 * Fetch xprofile data for the current user. 232 * 233 * @see BP_XProfile_ProfileData::get_all_for_user() for description of 234 * return value. 235 * 236 * @return array See {@link BP_XProfile_Profile_Data::get_all_for_user()}. 237 */ 238 public function get_profile_data() { 239 return BP_XProfile_ProfileData::get_all_for_user( $this->id ); 240 } 241 242 /** Static Methods ********************************************************/ 243 244 /** 245 * Get a list of users that match the query parameters. 246 * 247 * Since BuddyPress 1.7, use {@link BP_User_Query} instead. 248 * 249 * @deprecated 1.7.0 Use {@link BP_User_Query}. 250 * 251 * @see BP_User_Query for a description of parameters, most of which 252 * are used there in the same way. 253 * 254 * @param string $type See {@link BP_User_Query}. 255 * @param int $limit See {@link BP_User_Query}. Default: 0. 256 * @param int $page See {@link BP_User_Query}. Default: 1. 257 * @param int $user_id See {@link BP_User_Query}. Default: 0. 258 * @param mixed $include See {@link BP_User_Query}. Default: false. 259 * @param string|bool $search_terms See {@link BP_User_Query}. 260 * Default: false. 261 * @param bool $populate_extras See {@link BP_User_Query}. 262 * Default: true. 263 * @param mixed $exclude See {@link BP_User_Query}. Default: false. 264 * @param string|bool $meta_key See {@link BP_User_Query}. 265 * Default: false. 266 * @param string|bool $meta_value See {@link BP_User_Query}. 267 * Default: false. 268 * @return false|array { 269 * @type int $total_users Total number of users matched by query 270 * params. 271 * @type array $paged_users The current page of users matched by 272 * query params. 273 * } 274 */ 275 public static function get_users( $type, $limit = 0, $page = 1, $user_id = 0, $include = false, $search_terms = false, $populate_extras = true, $exclude = false, $meta_key = false, $meta_value = false ) { 276 global $wpdb; 277 278 _deprecated_function( __METHOD__, '1.7', 'BP_User_Query' ); 279 280 $bp = buddypress(); 281 282 $sql = array(); 283 284 $sql['select_main'] = "SELECT DISTINCT u.ID as id, u.user_registered, u.user_nicename, u.user_login, u.display_name, u.user_email"; 285 286 if ( 'active' == $type || 'online' == $type || 'newest' == $type ) { 287 $sql['select_active'] = ", um.meta_value as last_activity"; 288 } 289 290 if ( 'popular' == $type ) { 291 $sql['select_popular'] = ", um.meta_value as total_friend_count"; 292 } 293 294 if ( 'alphabetical' == $type ) { 295 $sql['select_alpha'] = ", pd.value as fullname"; 296 } 297 298 if ( $meta_key ) { 299 $sql['select_meta'] = ", umm.meta_key"; 300 301 if ( $meta_value ) { 302 $sql['select_meta'] .= ", umm.meta_value"; 303 } 304 } 305 306 $sql['from'] = "FROM {$wpdb->users} u LEFT JOIN {$wpdb->usermeta} um ON um.user_id = u.ID"; 307 308 // We search against xprofile fields, so we must join the table. 309 if ( $search_terms && bp_is_active( 'xprofile' ) ) { 310 $sql['join_profiledata_search'] = "LEFT JOIN {$bp->profile->table_name_data} spd ON u.ID = spd.user_id"; 311 } 312 313 // Alphabetical sorting is done by the xprofile Full Name field. 314 if ( 'alphabetical' == $type ) { 315 $sql['join_profiledata_alpha'] = "LEFT JOIN {$bp->profile->table_name_data} pd ON u.ID = pd.user_id"; 316 } 317 318 if ( $meta_key ) { 319 $sql['join_meta'] = "LEFT JOIN {$wpdb->usermeta} umm ON umm.user_id = u.ID"; 320 } 321 322 $sql['where'] = 'WHERE ' . bp_core_get_status_sql( 'u.' ); 323 324 if ( 'active' == $type || 'online' == $type || 'newest' == $type ) { 325 $sql['where_active'] = $wpdb->prepare( "AND um.meta_key = %s", bp_get_user_meta_key( 'last_activity' ) ); 326 } 327 328 if ( 'popular' == $type ) { 329 $sql['where_popular'] = $wpdb->prepare( "AND um.meta_key = %s", bp_get_user_meta_key( 'total_friend_count' ) ); 330 } 331 332 if ( 'online' == $type ) { 333 $sql['where_online'] = "AND DATE_ADD( um.meta_value, INTERVAL 5 MINUTE ) >= UTC_TIMESTAMP()"; 334 } 335 336 if ( 'alphabetical' == $type ) { 337 $sql['where_alpha'] = "AND pd.field_id = 1"; 338 } 339 340 if ( !empty( $exclude ) ) { 341 $exclude = implode( ',', wp_parse_id_list( $exclude ) ); 342 $sql['where_exclude'] = "AND u.ID NOT IN ({$exclude})"; 343 } 344 345 // Passing an $include value of 0 or '0' will necessarily result in an empty set 346 // returned. The default value of false will hit the 'else' clause. 347 if ( 0 === $include || '0' === $include ) { 348 $sql['where_users'] = "AND 0 = 1"; 349 } else { 350 if ( !empty( $include ) ) { 351 $include = implode( ',', wp_parse_id_list( $include ) ); 352 $sql['where_users'] = "AND u.ID IN ({$include})"; 353 } elseif ( !empty( $user_id ) && bp_is_active( 'friends' ) ) { 354 $friend_ids = friends_get_friend_user_ids( $user_id ); 355 356 if ( !empty( $friend_ids ) ) { 357 $friend_ids = implode( ',', wp_parse_id_list( $friend_ids ) ); 358 $sql['where_friends'] = "AND u.ID IN ({$friend_ids})"; 359 360 // User has no friends, return false since there will be no users to fetch. 361 } else { 362 return false; 363 } 364 } 365 } 366 367 if ( !empty( $search_terms ) && bp_is_active( 'xprofile' ) ) { 368 $search_terms_like = '%' . bp_esc_like( $search_terms ) . '%'; 369 $sql['where_searchterms'] = $wpdb->prepare( "AND spd.value LIKE %s", $search_terms_like ); 370 } 371 372 if ( !empty( $meta_key ) ) { 373 $sql['where_meta'] = $wpdb->prepare( " AND umm.meta_key = %s", $meta_key ); 374 375 // If a meta value is provided, match it. 376 if ( $meta_value ) { 377 $sql['where_meta'] .= $wpdb->prepare( " AND umm.meta_value = %s", $meta_value ); 378 } 379 } 380 381 switch ( $type ) { 382 case 'active': case 'online': default: 383 $sql[] = "ORDER BY um.meta_value DESC"; 384 break; 385 case 'newest': 386 $sql[] = "ORDER BY u.ID DESC"; 387 break; 388 case 'alphabetical': 389 $sql[] = "ORDER BY pd.value ASC"; 390 break; 391 case 'random': 392 $sql[] = "ORDER BY rand()"; 393 break; 394 case 'popular': 395 $sql[] = "ORDER BY CONVERT(um.meta_value, SIGNED) DESC"; 396 break; 397 } 398 399 if ( !empty( $limit ) && !empty( $page ) ) { 400 $sql['pagination'] = $wpdb->prepare( "LIMIT %d, %d", intval( ( $page - 1 ) * $limit), intval( $limit ) ); 401 } 402 403 /** 404 * Filters the SQL used to query for paged users. 405 * 406 * @since 1.2.6 407 * 408 * @param string $value Concatenated SQL statement for the query. 409 * @param array $sql Array of SQL statement parts for the query. 410 */ 411 $paged_users_sql = apply_filters( 'bp_core_get_paged_users_sql', join( ' ', (array) $sql ), $sql ); 412 $paged_users = $wpdb->get_results( $paged_users_sql ); 413 414 // Re-jig the SQL so we can get the total user count. 415 unset( $sql['select_main'] ); 416 417 if ( !empty( $sql['select_active'] ) ) { 418 unset( $sql['select_active'] ); 419 } 420 421 if ( !empty( $sql['select_popular'] ) ) { 422 unset( $sql['select_popular'] ); 423 } 424 425 if ( !empty( $sql['select_alpha'] ) ) { 426 unset( $sql['select_alpha'] ); 427 } 428 429 if ( !empty( $sql['pagination'] ) ) { 430 unset( $sql['pagination'] ); 431 } 432 433 array_unshift( $sql, "SELECT COUNT(u.ID)" ); 434 435 /** 436 * Filters the SQL used to query for total users. 437 * 438 * @since 1.2.6 439 * 440 * @param string $value Concatenated SQL statement for the query. 441 * @param array $sql Array of SQL statement parts for the query. 442 */ 443 $total_users_sql = apply_filters( 'bp_core_get_total_users_sql', join( ' ', (array) $sql ), $sql ); 444 $total_users = $wpdb->get_var( $total_users_sql ); 445 446 /** 447 * Lets fetch some other useful data in a separate queries, this will be faster than querying the data for every user in a list. 448 * We can't add these to the main query above since only users who have this information will be returned (since the much of the data is in usermeta and won't support any type of directional join). 449 */ 450 if ( !empty( $populate_extras ) ) { 451 $user_ids = array(); 452 453 foreach ( (array) $paged_users as $user ) { 454 $user_ids[] = $user->id; 455 } 456 457 // Add additional data to the returned results. 458 $paged_users = BP_Core_User::get_user_extras( $paged_users, $user_ids, $type ); 459 } 460 461 return array( 'users' => $paged_users, 'total' => $total_users ); 462 } 463 464 465 /** 466 * Fetch the details for all users whose usernames start with the given letter. 467 * 468 * @global wpdb $wpdb WordPress database object. 469 * 470 * @param string $letter The letter the users names are to start with. 471 * @param int|null $limit The number of users we wish to retrive. 472 * @param int $page The page number we are currently on, used in conjunction 473 * with $limit to get the start position for the limit. 474 * @param bool $populate_extras If we should populate extra user fields. 475 * @param string $exclude Comma-separated IDs of users whose results 476 * aren't to be fetched. 477 * @return false|array False on error, otherwise associative array of results. 478 */ 479 public static function get_users_by_letter( $letter, $limit = null, $page = 1, $populate_extras = true, $exclude = '' ) { 480 global $wpdb; 481 482 $pag_sql = ''; 483 if ( $limit && $page ) { 484 $pag_sql = $wpdb->prepare( " LIMIT %d, %d", intval( ( $page - 1 ) * $limit), intval( $limit ) ); 485 } 486 487 // Multibyte compliance. 488 if ( function_exists( 'mb_strlen' ) ) { 489 if ( mb_strlen( $letter, 'UTF-8' ) > 1 || is_numeric( $letter ) || !$letter ) { 490 return false; 491 } 492 } else { 493 if ( strlen( $letter ) > 1 || is_numeric( $letter ) || !$letter ) { 494 return false; 495 } 496 } 497 498 $bp = buddypress(); 499 500 $letter_like = bp_esc_like( $letter ) . '%'; 501 $status_sql = bp_core_get_status_sql( 'u.' ); 502 503 if ( !empty( $exclude ) ) { 504 $exclude = implode( ',', wp_parse_id_list( $exclude ) ); 505 $exclude_sql = " AND u.id NOT IN ({$exclude})"; 506 } else { 507 $exclude_sql = ''; 508 } 509 510 /** 511 * Filters the SQL used to query for total user count by first letter. 512 * 513 * @since 1.0.0 514 * 515 * @param string $value SQL prepared statement for the user count query. 516 */ 517 $total_users_sql = apply_filters( 'bp_core_users_by_letter_count_sql', $wpdb->prepare( "SELECT COUNT(DISTINCT u.ID) FROM {$wpdb->users} u LEFT JOIN {$bp->profile->table_name_data} pd ON u.ID = pd.user_id LEFT JOIN {$bp->profile->table_name_fields} pf ON pd.field_id = pf.id WHERE {$status_sql} AND pf.name = %s {$exclude_sql} AND pd.value LIKE %s ORDER BY pd.value ASC", bp_xprofile_fullname_field_name(), $letter_like ) ); 518 519 /** 520 * Filters the SQL used to query for users by first letter. 521 * 522 * @since 1.0.0 523 * 524 * @param string $value SQL prepared statement for the user query. 525 */ 526 $paged_users_sql = apply_filters( 'bp_core_users_by_letter_sql', $wpdb->prepare( "SELECT DISTINCT u.ID as id, u.user_registered, u.user_nicename, u.user_login, u.user_email FROM {$wpdb->users} u LEFT JOIN {$bp->profile->table_name_data} pd ON u.ID = pd.user_id LEFT JOIN {$bp->profile->table_name_fields} pf ON pd.field_id = pf.id WHERE {$status_sql} AND pf.name = %s {$exclude_sql} AND pd.value LIKE %s ORDER BY pd.value ASC{$pag_sql}", bp_xprofile_fullname_field_name(), $letter_like ) ); 527 528 $total_users = $wpdb->get_var( $total_users_sql ); 529 $paged_users = $wpdb->get_results( $paged_users_sql ); 530 531 /** 532 * Lets fetch some other useful data in a separate queries, this will be 533 * faster than querying the data for every user in a list. We can't add 534 * these to the main query above since only users who have this 535 * information will be returned (since the much of the data is in 536 * usermeta and won't support any type of directional join) 537 */ 538 $user_ids = array(); 539 foreach ( (array) $paged_users as $user ) 540 $user_ids[] = (int) $user->id; 541 542 // Add additional data to the returned results. 543 if ( $populate_extras ) { 544 $paged_users = BP_Core_User::get_user_extras( $paged_users, $user_ids ); 545 } 546 547 return array( 'users' => $paged_users, 'total' => $total_users ); 548 } 549 550 /** 551 * Get details of specific users from the database. 552 * 553 * Use {@link BP_User_Query} with the 'user_ids' param instead. 554 * 555 * @global wpdb $wpdb WordPress database object. 556 * 557 * @param array $user_ids The user IDs of the users who we wish to 558 * fetch information on. 559 * @param int|null $limit The limit of results we want. 560 * @param int $page The page we are on for pagination. 561 * @param bool $populate_extras If we should populate extra user fields. 562 * @return array Associative array. 563 */ 564 public static function get_specific_users( $user_ids, $limit = null, $page = 1, $populate_extras = true ) { 565 global $wpdb; 566 567 $pag_sql = ''; 568 if ( $limit && $page ) 569 $pag_sql = $wpdb->prepare( " LIMIT %d, %d", intval( ( $page - 1 ) * $limit), intval( $limit ) ); 570 571 $user_ids = implode( ',', wp_parse_id_list( $user_ids ) ); 572 $status_sql = bp_core_get_status_sql(); 573 574 /** 575 * Filter the SQL string used for querying specific user count. 576 * 577 * This same filter name is used for the paged user SQL, and so should be avoided. 578 * Use 'bp_core_user_get_specific_users_count_sql' instead. 579 * 580 * @deprecated 2.3.0 581 * 582 * @param string $sql SQL string. 583 */ 584 $total_users_sql = apply_filters( 'bp_core_get_specific_users_count_sql', "SELECT COUNT(ID) FROM {$wpdb->users} WHERE {$status_sql} AND ID IN ({$user_ids})" ); 585 586 /** 587 * Filter the SQL string used for querying specific user count results. 588 * 589 * Use this instead of the deprecated 'bp_core_get_specific_users_count_sql'. 590 * 591 * @since 2.3.0 592 * 593 * @param string $sql SQL string. 594 * @param array $user_ids Array of IDs of specific users to fetch. 595 * @param int|null $limit Max number of records to return. Null for no limit. 596 * @param int $page The page we're on for pagination. 597 * @param bool $populate_extras Whether to populate extra user fields. 598 */ 599 $total_users_sql = apply_filters( 'bp_core_user_get_specific_users_count_sql', $total_users_sql, $user_ids, $limit, $page, $populate_extras ); 600 601 /** 602 * Filter the SQL string used for querying specific user paged results. 603 * 604 * This same filter name is used for the user count SQL, and so should be avoided. 605 * Use 'bp_core_user_get_specific_users_paged_sql' instead. 606 * 607 * @deprecated 2.3.0 608 * 609 * @param string $sql SQL string. 610 */ 611 $paged_users_sql = apply_filters( 'bp_core_get_specific_users_count_sql', "SELECT ID as id, user_registered, user_nicename, user_login, user_email FROM {$wpdb->users} WHERE {$status_sql} AND ID IN ({$user_ids}) {$pag_sql}" ); 612 613 /** 614 * Filter the SQL string used for querying specific user paged results. 615 * 616 * Use this instead of the deprecated 'bp_core_get_specific_users_count_sql'. 617 * 618 * @since 2.3.0 619 * 620 * @param string $sql SQL string. 621 * @param array $user_ids Array of IDs of specific users to fetch. 622 * @param int|null $limit Max number of records to return. Null for no limit. 623 * @param int $page The page we're on for pagination. 624 * @param bool $populate_extras Whether to populate extra user fields. 625 */ 626 $paged_users_sql = apply_filters( 'bp_core_user_get_specific_users_paged_sql', $paged_users_sql, $user_ids, $limit, $page, $populate_extras ); 627 628 $total_users = $wpdb->get_var( $total_users_sql ); 629 $paged_users = $wpdb->get_results( $paged_users_sql ); 630 631 /** 632 * Lets fetch some other useful data in a separate queries, this will be 633 * faster than querying the data for every user in a list. We can't add 634 * these to the main query above since only users who have this 635 * information will be returned (since the much of the data is in 636 * usermeta and won't support any type of directional join) 637 */ 638 639 // Add additional data to the returned results. 640 if ( !empty( $populate_extras ) ) { 641 $paged_users = BP_Core_User::get_user_extras( $paged_users, $user_ids ); 642 } 643 644 return array( 'users' => $paged_users, 'total' => $total_users ); 645 } 646 647 /** 648 * Find users who match on the value of an xprofile data. 649 * 650 * @global wpdb $wpdb WordPress database object. 651 * 652 * @param string $search_terms The terms to search the profile table 653 * value column for. 654 * @param int|null $limit The limit of results we want. 655 * @param int $page The page we are on for pagination. 656 * @param boolean $populate_extras If we should populate extra user fields. 657 * @return array Associative array. 658 */ 659 public static function search_users( $search_terms, $limit = null, $page = 1, $populate_extras = true ) { 660 global $wpdb; 661 662 $bp = buddypress(); 663 664 $user_ids = array(); 665 $pag_sql = $limit && $page ? $wpdb->prepare( " LIMIT %d, %d", intval( ( $page - 1 ) * intval( $limit ) ), intval( $limit ) ) : ''; 666 667 $search_terms_like = '%' . bp_esc_like( $search_terms ) . '%'; 668 $status_sql = bp_core_get_status_sql( 'u.' ); 669 670 /** 671 * Filters the SQL used to query for searched users count. 672 * 673 * @since 1.0.0 674 * 675 * @param string $value SQL statement for the searched users count query. 676 */ 677 $total_users_sql = apply_filters( 'bp_core_search_users_count_sql', $wpdb->prepare( "SELECT COUNT(DISTINCT u.ID) as id FROM {$wpdb->users} u LEFT JOIN {$bp->profile->table_name_data} pd ON u.ID = pd.user_id WHERE {$status_sql} AND pd.value LIKE %s ORDER BY pd.value ASC", $search_terms_like ), $search_terms ); 678 679 /** 680 * Filters the SQL used to query for searched users. 681 * 682 * @since 1.0.0 683 * 684 * @param string $value SQL statement for the searched users query. 685 */ 686 $paged_users_sql = apply_filters( 'bp_core_search_users_sql', $wpdb->prepare( "SELECT DISTINCT u.ID as id, u.user_registered, u.user_nicename, u.user_login, u.user_email FROM {$wpdb->users} u LEFT JOIN {$bp->profile->table_name_data} pd ON u.ID = pd.user_id WHERE {$status_sql} AND pd.value LIKE %s ORDER BY pd.value ASC{$pag_sql}", $search_terms_like ), $search_terms, $pag_sql ); 687 688 $total_users = $wpdb->get_var( $total_users_sql ); 689 $paged_users = $wpdb->get_results( $paged_users_sql ); 690 691 /** 692 * Lets fetch some other useful data in a separate queries, this will be faster than querying the data for every user in a list. 693 * We can't add these to the main query above since only users who have this information will be returned (since the much of the data is in usermeta and won't support any type of directional join) 694 */ 695 foreach ( (array) $paged_users as $user ) 696 $user_ids[] = $user->id; 697 698 // Add additional data to the returned results. 699 if ( $populate_extras ) 700 $paged_users = BP_Core_User::get_user_extras( $paged_users, $user_ids ); 701 702 return array( 'users' => $paged_users, 'total' => $total_users ); 703 } 704 705 /** 706 * Fetch extra user information, such as friend count and last profile update message. 707 * 708 * Accepts multiple user IDs to fetch data for. 709 * 710 * @global wpdb $wpdb WordPress database object. 711 * 712 * @param array $paged_users An array of stdClass containing the users. 713 * @param string $user_ids The user ids to select information about. 714 * @param string|bool $type The type of fields we wish to get. 715 * @return mixed False on error, otherwise associative array of results. 716 */ 717 public static function get_user_extras( &$paged_users, &$user_ids, $type = false ) { 718 global $wpdb; 719 720 $bp = buddypress(); 721 722 if ( empty( $user_ids ) ) 723 return $paged_users; 724 725 // Sanitize user IDs. 726 $user_ids = implode( ',', wp_parse_id_list( $user_ids ) ); 727 728 // Fetch the user's full name. 729 if ( bp_is_active( 'xprofile' ) && 'alphabetical' != $type ) { 730 $names = $wpdb->get_results( $wpdb->prepare( "SELECT pd.user_id as id, pd.value as fullname FROM {$bp->profile->table_name_fields} pf, {$bp->profile->table_name_data} pd WHERE pf.id = pd.field_id AND pf.name = %s AND pd.user_id IN ( {$user_ids} )", bp_xprofile_fullname_field_name() ) ); 731 for ( $i = 0, $count = count( $paged_users ); $i < $count; ++$i ) { 732 foreach ( (array) $names as $name ) { 733 if ( $name->id == $paged_users[$i]->id ) 734 $paged_users[$i]->fullname = $name->fullname; 735 } 736 } 737 } 738 739 // Fetch the user's total friend count. 740 if ( 'popular' != $type ) { 741 $friend_count = $wpdb->get_results( $wpdb->prepare( "SELECT user_id as id, meta_value as total_friend_count FROM {$wpdb->usermeta} WHERE meta_key = %s AND user_id IN ( {$user_ids} )", bp_get_user_meta_key( 'total_friend_count' ) ) ); 742 for ( $i = 0, $count = count( $paged_users ); $i < $count; ++$i ) { 743 foreach ( (array) $friend_count as $fcount ) { 744 if ( $fcount->id == $paged_users[$i]->id ) 745 $paged_users[$i]->total_friend_count = (int) $fcount->total_friend_count; 746 } 747 } 748 } 749 750 // Fetch whether or not the user is a friend. 751 if ( bp_is_active( 'friends' ) ) { 752 $friend_status = $wpdb->get_results( $wpdb->prepare( "SELECT initiator_user_id, friend_user_id, is_confirmed FROM {$bp->friends->table_name} WHERE (initiator_user_id = %d AND friend_user_id IN ( {$user_ids} ) ) OR (initiator_user_id IN ( {$user_ids} ) AND friend_user_id = %d )", bp_loggedin_user_id(), bp_loggedin_user_id() ) ); 753 for ( $i = 0, $count = count( $paged_users ); $i < $count; ++$i ) { 754 foreach ( (array) $friend_status as $status ) { 755 if ( $status->initiator_user_id == $paged_users[$i]->id || $status->friend_user_id == $paged_users[$i]->id ) 756 $paged_users[$i]->is_friend = $status->is_confirmed; 757 } 758 } 759 } 760 761 // Fetch the user's last_activity. 762 if ( 'active' != $type ) { 763 $user_activity = self::get_last_activity( $user_ids ); 764 for ( $i = 0, $count = count( $paged_users ); $i < $count; ++$i ) { 765 foreach ( (array) $user_activity as $activity ) { 766 if ( ! empty( $activity['user_id'] ) && (int) $activity['user_id'] === (int) $paged_users[$i]->id ) { 767 $paged_users[$i]->last_activity = $activity['date_recorded']; 768 } 769 } 770 } 771 } 772 773 // Fetch the user's latest update. 774 $user_update = $wpdb->get_results( $wpdb->prepare( "SELECT user_id as id, meta_value as latest_update FROM {$wpdb->usermeta} WHERE meta_key = %s AND user_id IN ( {$user_ids} )", bp_get_user_meta_key( 'bp_latest_update' ) ) ); 775 for ( $i = 0, $count = count( $paged_users ); $i < $count; ++$i ) { 776 foreach ( (array) $user_update as $update ) { 777 if ( $update->id == $paged_users[$i]->id ) 778 $paged_users[$i]->latest_update = $update->latest_update; 779 } 780 } 781 782 return $paged_users; 783 } 784 785 /** 786 * Get WordPress user details for a specified user. 787 * 788 * @since 3.0.0 Results might be from cache 789 * 790 * @param int $user_id User ID. 791 * @return false|object WP_User if successful, false on failure. 792 */ 793 public static function get_core_userdata( $user_id ) { 794 return WP_User::get_data_by( 'id', $user_id ); 795 } 796 797 /** 798 * Get last activity data for a user or set of users. 799 * 800 * @param int|array $user_id User IDs or multiple user IDs. 801 * @return false|array 802 */ 803 public static function get_last_activity( $user_id ) { 804 global $wpdb; 805 806 // Sanitize and remove empty values. 807 $user_ids = array_filter( wp_parse_id_list( $user_id ) ); 808 809 if ( empty( $user_ids ) ) { 810 return false; 811 } 812 813 $uncached_user_ids = bp_get_non_cached_ids( $user_ids, 'bp_last_activity' ); 814 if ( ! empty( $uncached_user_ids ) ) { 815 $bp = buddypress(); 816 817 $user_ids_sql = implode( ',', $uncached_user_ids ); 818 $user_count = count( $uncached_user_ids ); 819 820 $last_activities = $wpdb->get_results( $wpdb->prepare( "SELECT id, user_id, date_recorded FROM {$bp->members->table_name_last_activity} WHERE component = %s AND type = 'last_activity' AND user_id IN ({$user_ids_sql}) LIMIT {$user_count}", $bp->members->id ) ); 821 822 foreach ( $last_activities as $last_activity ) { 823 wp_cache_set( $last_activity->user_id, array( 824 'user_id' => $last_activity->user_id, 825 'date_recorded' => $last_activity->date_recorded, 826 'activity_id' => $last_activity->id, 827 ), 'bp_last_activity' ); 828 } 829 } 830 831 // Fetch all user data from the cache. 832 $retval = array(); 833 foreach ( $user_ids as $user_id ) { 834 $retval[ $user_id ] = wp_cache_get( $user_id, 'bp_last_activity' ); 835 836 if ( isset( $retval['user_id'] ) ) { 837 $retval[ $user_id ]['user_id'] = (int) $retval[ $user_id ]['user_id']; 838 } 839 if ( isset( $retval['activity_id'] ) ) { 840 $retval[ $user_id ]['activity_id'] = (int) $retval[ $user_id ]['activity_id']; 841 } 842 } 843 844 return $retval; 845 } 846 847 /** 848 * Set a user's last_activity value. 849 * 850 * Will create a new entry if it does not exist. Otherwise updates the 851 * existing entry. 852 * 853 * @since 2.0.0 854 * 855 * @param int $user_id ID of the user whose last_activity you are updating. 856 * @param string $time MySQL-formatted time string. 857 * @return bool True on success, false on failure. 858 */ 859 public static function update_last_activity( $user_id, $time ) { 860 global $wpdb; 861 862 $table_name = buddypress()->members->table_name_last_activity; 863 864 $activity = self::get_last_activity( $user_id ); 865 866 if ( ! empty( $activity[ $user_id ] ) ) { 867 $updated = $wpdb->update( 868 $table_name, 869 870 // Data to update. 871 array( 872 'date_recorded' => $time, 873 ), 874 875 // WHERE. 876 array( 877 'id' => $activity[ $user_id ]['activity_id'], 878 ), 879 880 // Data sanitization format. 881 array( 882 '%s', 883 ), 884 885 // WHERE sanitization format. 886 array( 887 '%d', 888 ) 889 ); 890 891 // Add new date to existing activity entry for caching. 892 $activity[ $user_id ]['date_recorded'] = $time; 893 894 } else { 895 $updated = $wpdb->insert( 896 $table_name, 897 898 // Data. 899 array( 900 'user_id' => $user_id, 901 'component' => buddypress()->members->id, 902 'type' => 'last_activity', 903 'action' => '', 904 'content' => '', 905 'primary_link' => '', 906 'item_id' => 0, 907 'date_recorded' => $time, 908 ), 909 910 // Data sanitization format. 911 array( 912 '%d', 913 '%s', 914 '%s', 915 '%s', 916 '%s', 917 '%s', 918 '%d', 919 '%s', 920 ) 921 ); 922 923 // Set up activity array for caching. 924 // View the foreach loop in the get_last_activity() method for format. 925 $activity = array(); 926 $activity[ $user_id ] = array( 927 'user_id' => $user_id, 928 'date_recorded' => $time, 929 'activity_id' => $wpdb->insert_id, 930 ); 931 } 932 933 // Set cache. 934 wp_cache_set( $user_id, $activity[ $user_id ], 'bp_last_activity' ); 935 936 /** 937 * Fires when a user's last_activity value has been updated. 938 * 939 * @since 2.7.0 940 * 941 * @param int $user_id ID of the user. 942 * @param string $time Last activity timestamp, in 'Y-m-d H:i:s' format. 943 */ 944 do_action( 'bp_core_user_updated_last_activity', $user_id, $time ); 945 946 return $updated; 947 } 948 949 /** 950 * Delete a user's last_activity value. 951 * 952 * @since 2.0.0 953 * 954 * @param int $user_id ID of the user whose activity should be deleted. 955 * @return bool True on success, false on failure or if no last_activity 956 * is found for the user. 957 */ 958 public static function delete_last_activity( $user_id ) { 959 global $wpdb; 960 961 $existing = self::get_last_activity( $user_id ); 962 963 if ( empty( $existing ) || empty( $existing[ $user_id ]['activity_id'] ) ) { 964 return false; 965 } 966 967 $deleted = $wpdb->delete( 968 buddypress()->members->table_name_last_activity, 969 970 // WHERE. 971 array( 972 'id' => $existing[ $user_id ]['activity_id'], 973 ), 974 975 // WHERE sanitization format. 976 array( 977 '%s', 978 ) 979 ); 980 981 wp_cache_delete( $user_id, 'bp_last_activity' ); 982 983 return $deleted; 984 } 985 }
title
Description
Body
title
Description
Body
title
Description
Body
title
Body
Generated: Thu Nov 21 01:00:57 2024 | Cross-referenced by PHPXref 0.7.1 |