[ Index ] |
PHP Cross Reference of BuddyPress |
[Summary view] [Print] [Text view]
1 <?php 2 /** 3 * BuddyPress XProfile Classes. 4 * 5 * @package BuddyPress 6 * @subpackage XProfileClasses 7 * @since 1.0.0 8 */ 9 10 // Exit if accessed directly. 11 defined( 'ABSPATH' ) || exit; 12 13 /** 14 * Class to help set up XProfile Groups. 15 * 16 * @since 1.0.0 17 */ 18 class BP_XProfile_Group { 19 20 /** 21 * Field group ID. 22 * 23 * @since 1.1.0 24 * @var int ID of field group. 25 */ 26 public $id = null; 27 28 /** 29 * Field group name. 30 * 31 * @since 1.1.0 32 * @var string Name of field group. 33 */ 34 public $name; 35 36 /** 37 * Field group Description. 38 * 39 * @since 1.1.0 40 * @var string Description of field group. 41 */ 42 public $description; 43 44 /** 45 * Group deletion boolean. 46 * 47 * @since 1.1.0 48 * @var bool Can this group be deleted? 49 */ 50 public $can_delete; 51 52 /** 53 * Group order. 54 * 55 * @since 1.1.0 56 * @var int Group order relative to other groups. 57 */ 58 public $group_order; 59 60 /** 61 * Group fields. 62 * 63 * @since 1.1.0 64 * @var array Fields of group. 65 */ 66 public $fields; 67 68 /** 69 * Initialize and/or populate profile field group. 70 * 71 * @since 1.1.0 72 * 73 * @param int|null $id Field group ID. 74 */ 75 public function __construct( $id = null ) { 76 if ( ! empty( $id ) ) { 77 $this->populate( $id ); 78 } 79 } 80 81 /** 82 * Populate a profile field group. 83 * 84 * @since 1.0.0 85 * 86 * @global $wpdb $wpdb 87 * 88 * @param int $id Field group ID. 89 * @return boolean 90 */ 91 public function populate( $id ) { 92 93 // Get this group. 94 $group = self::get( array( 95 'profile_group_id' => $id 96 ) ); 97 98 // Bail if group not found. 99 if ( empty( $group ) ) { 100 return false; 101 } 102 103 // Get the first array element. 104 $group = reset( $group ); 105 106 // Set object properties. 107 $this->id = $group->id; 108 $this->name = $group->name; 109 $this->description = $group->description; 110 $this->can_delete = $group->can_delete; 111 $this->group_order = $group->group_order; 112 } 113 114 /** 115 * Save a profile field group. 116 * 117 * @since 1.1.0 118 * 119 * @global object $wpdb 120 * 121 * @return boolean 122 */ 123 public function save() { 124 global $wpdb; 125 126 // Filter the field group attributes. 127 $this->name = apply_filters( 'xprofile_group_name_before_save', $this->name, $this->id ); 128 $this->description = apply_filters( 'xprofile_group_description_before_save', $this->description, $this->id ); 129 130 /** 131 * Fires before the current group instance gets saved. 132 * 133 * Please use this hook to filter the properties above. Each part will be passed in. 134 * 135 * @since 1.0.0 136 * 137 * @param BP_XProfile_Group $this Current instance of the group being saved. Passed by reference. 138 */ 139 do_action_ref_array( 'xprofile_group_before_save', array( &$this ) ); 140 141 $bp = buddypress(); 142 143 // Update or insert. 144 if ( ! empty( $this->id ) ) { 145 $sql = $wpdb->prepare( "UPDATE {$bp->profile->table_name_groups} SET name = %s, description = %s WHERE id = %d", $this->name, $this->description, $this->id ); 146 } else { 147 $sql = $wpdb->prepare( "INSERT INTO {$bp->profile->table_name_groups} (name, description, can_delete) VALUES (%s, %s, 1)", $this->name, $this->description ); 148 } 149 150 // Attempt to insert or update. 151 $query = $wpdb->query( $sql ); 152 153 // Bail if query fails. If `$query` is 0, it means the save was successful, but no fields were updated. 154 if ( false === $query || is_wp_error( $query ) ) { 155 return false; 156 } 157 158 // If not set, update the ID in the group object. 159 if ( empty( $this->id ) ) { 160 $this->id = $wpdb->insert_id; 161 } 162 163 /** 164 * Fires after the current group instance gets saved. 165 * 166 * @since 1.0.0 167 * 168 * @param BP_XProfile_Group $this Current instance of the group being saved. Passed by reference. 169 */ 170 do_action_ref_array( 'xprofile_group_after_save', array( &$this ) ); 171 172 return $this->id; 173 } 174 175 /** 176 * Delete a profile field group 177 * 178 * @since 1.1.0 179 * 180 * @global object $wpdb 181 * 182 * @return boolean 183 */ 184 public function delete() { 185 global $wpdb; 186 187 // Bail if field group cannot be deleted. 188 if ( empty( $this->can_delete ) ) { 189 return false; 190 } 191 192 /** 193 * Fires before the current group instance gets deleted. 194 * 195 * @since 2.0.0 196 * 197 * @param BP_XProfile_Group $this Current instance of the group being deleted. Passed by reference. 198 */ 199 do_action_ref_array( 'xprofile_group_before_delete', array( &$this ) ); 200 201 $bp = buddypress(); 202 $sql = $wpdb->prepare( "DELETE FROM {$bp->profile->table_name_groups} WHERE id = %d", $this->id ); 203 $deleted = $wpdb->query( $sql ); 204 205 // Delete field group. 206 if ( empty( $deleted ) || is_wp_error( $deleted ) ) { 207 return false; 208 } 209 210 // Remove the group's fields. 211 if ( BP_XProfile_Field::delete_for_group( $this->id ) ) { 212 213 // Remove profile data for the groups fields. 214 if ( ! empty( $this->fields ) ) { 215 for ( $i = 0, $count = count( $this->fields ); $i < $count; ++$i ) { 216 BP_XProfile_ProfileData::delete_for_field( $this->fields[$i]->id ); 217 } 218 } 219 } 220 221 /** 222 * Fires after the current group instance gets deleted. 223 * 224 * @since 2.0.0 225 * 226 * @param BP_XProfile_Group $this Current instance of the group being deleted. Passed by reference. 227 */ 228 do_action_ref_array( 'xprofile_group_after_delete', array( &$this ) ); 229 230 return true; 231 } 232 233 /** Static Methods ********************************************************/ 234 235 /** 236 * Populates the BP_XProfile_Group object with profile field groups, fields, 237 * and field data. 238 * 239 * @since 1.2.0 240 * @since 2.4.0 Introduced `$member_type` argument. 241 * @since 8.0.0 Introduced `$hide_field_types` & `$signup_fields_only` arguments. 242 * 243 * @global object $wpdb WordPress DB access object. 244 * 245 * @param array $args { 246 * Array of optional arguments. 247 * @type int $profile_group_id Limit results to a single profile group. 248 * @type int $user_id Required if you want to load a specific user's data. 249 * Default: displayed user's ID. 250 * @type array|string $member_type Limit fields by those restricted to a given member type, or array of 251 * member types. If `$user_id` is provided, the value of `$member_type` 252 * will be overridden by the member types of the provided user. The 253 * special value of 'any' will return only those fields that are 254 * unrestricted by member type - i.e., those applicable to any type. 255 * @type bool $hide_empty_groups True to hide groups that don't have any fields. Default: false. 256 * @type bool $hide_empty_fields True to hide fields where the user has not provided data. 257 * Default: false. 258 * @type bool $fetch_fields Whether to fetch each group's fields. Default: false. 259 * @type bool $fetch_field_data Whether to fetch data for each field. Requires a $user_id. 260 * Default: false. 261 * @type int[]|bool $exclude_groups Comma-separated list or array of group IDs to exclude. 262 * @type int[]|bool $exclude_fields Comma-separated list or array of field IDs to exclude. 263 * @type string[] $hide_field_types List of field types to hide form loop. Default: empty array. 264 * @type bool $signup_fields_only Whether to only return signup fields. Default: false. 265 * @type bool $update_meta_cache Whether to pre-fetch xprofilemeta for all retrieved groups, fields, 266 * and data. Default: true. 267 * } 268 * @return array $groups 269 */ 270 public static function get( $args = array() ) { 271 global $wpdb; 272 273 // Parse arguments. 274 $r = bp_parse_args( 275 $args, 276 array( 277 'profile_group_id' => false, 278 'user_id' => bp_displayed_user_id(), 279 'member_type' => false, 280 'hide_empty_groups' => false, 281 'hide_empty_fields' => false, 282 'fetch_fields' => false, 283 'fetch_field_data' => false, 284 'fetch_visibility_level' => false, 285 'exclude_groups' => false, 286 'exclude_fields' => false, 287 'hide_field_types' => array(), 288 'update_meta_cache' => true, 289 'signup_fields_only' => false, 290 ) 291 ); 292 293 // Keep track of object IDs for cache-priming. 294 $object_ids = array( 295 'group' => array(), 296 'field' => array(), 297 'data' => array(), 298 ); 299 300 $bp = buddypress(); 301 302 $group_ids = self::get_group_ids( $r ); 303 304 // Get all group data. 305 $groups = self::get_group_data( $group_ids ); 306 307 // Bail if not also getting fields. 308 if ( empty( $r['fetch_fields'] ) ) { 309 return $groups; 310 } 311 312 // Get the group ids from the groups we found. 313 $group_ids = wp_list_pluck( $groups, 'id' ); 314 315 // Store for meta cache priming. 316 $object_ids['group'] = $group_ids; 317 318 // Bail if no groups found. 319 if ( empty( $group_ids ) ) { 320 return $groups; 321 } 322 323 $field_ids = self::get_group_field_ids( $group_ids, $r ); 324 325 foreach( $groups as $group ) { 326 $group->fields = array(); 327 } 328 329 // Bail if no fields. 330 if ( empty( $field_ids ) ) { 331 return $groups; 332 } 333 334 $field_ids = array_map( 'intval', $field_ids ); 335 336 // Prime the field cache. 337 $uncached_field_ids = bp_get_non_cached_ids( $field_ids, 'bp_xprofile_fields' ); 338 if ( ! empty( $uncached_field_ids ) ) { 339 $_uncached_field_ids = implode( ',', array_map( 'intval', $uncached_field_ids ) ); 340 $uncached_fields = $wpdb->get_results( "SELECT * FROM {$bp->profile->table_name_fields} WHERE id IN ({$_uncached_field_ids})" ); 341 foreach ( $uncached_fields as $uncached_field ) { 342 $fid = intval( $uncached_field->id ); 343 wp_cache_set( $fid, $uncached_field, 'bp_xprofile_fields' ); 344 } 345 } 346 347 // Pull field objects from the cache. 348 $fields = array(); 349 foreach ( $field_ids as $field_id ) { 350 if ( true === $r['signup_fields_only'] && ! in_array( $field_id, bp_xprofile_get_signup_field_ids(), true ) ) { 351 continue; 352 } 353 354 $_field = xprofile_get_field( $field_id, null, false ); 355 356 if ( in_array( $_field->type, $r['hide_field_types'], true ) ) { 357 continue; 358 } 359 360 $fields[] = $_field; 361 } 362 363 // Store field IDs for meta cache priming. 364 $object_ids['field'] = $field_ids; 365 366 // Maybe fetch field data. 367 if ( ! empty( $r['fetch_field_data'] ) ) { 368 $field_type_objects = wp_list_pluck( $fields, 'type_obj', 'id' ); 369 370 // Get field data for user ID. 371 if ( ! empty( $field_ids ) && ! empty( $r['user_id'] ) ) { 372 $field_data = BP_XProfile_ProfileData::get_data_for_user( $r['user_id'], $field_ids, $field_type_objects ); 373 } 374 375 // Remove data-less fields, if necessary. 376 if ( ! empty( $r['hide_empty_fields'] ) && ! empty( $field_ids ) && ! empty( $field_data ) ) { 377 378 // Loop through the results and find the fields that have data. 379 foreach( (array) $field_data as $data ) { 380 381 // Empty fields may contain a serialized empty array. 382 $maybe_value = maybe_unserialize( $data->value ); 383 384 // Valid field values of 0 or '0' get caught by empty(), so we have an extra check for these. See #BP5731. 385 if ( ( ! empty( $maybe_value ) || '0' == $maybe_value ) && false !== $key = array_search( $data->field_id, $field_ids ) ) { 386 387 // Fields that have data get removed from the list. 388 unset( $field_ids[ $key ] ); 389 } 390 } 391 392 // The remaining members of $field_ids are empty. Remove them. 393 foreach( $fields as $field_key => $field ) { 394 if ( in_array( $field->id, $field_ids ) ) { 395 unset( $fields[ $field_key ] ); 396 } 397 } 398 399 // Reset indexes. 400 $fields = array_values( $fields ); 401 } 402 403 // Field data was found. 404 if ( ! empty( $fields ) && ! empty( $field_data ) && ! is_wp_error( $field_data ) ) { 405 406 // Loop through fields. 407 foreach( (array) $fields as $field_key => $field ) { 408 409 // Loop through the data in each field. 410 foreach( (array) $field_data as $data ) { 411 412 // Assign correct data value to the field. 413 if ( $field->id == $data->field_id ) { 414 $fields[ $field_key ]->data = new stdClass; 415 $fields[ $field_key ]->data->value = $data->value; 416 $fields[ $field_key ]->data->id = $data->id; 417 } 418 419 // Store for meta cache priming. 420 $object_ids['data'][] = $data->id; 421 } 422 } 423 } 424 } 425 426 // Prime the meta cache, if necessary. 427 if ( ! empty( $r['update_meta_cache'] ) ) { 428 bp_xprofile_update_meta_cache( $object_ids ); 429 } 430 431 // Maybe fetch visibility levels. 432 if ( ! empty( $r['fetch_visibility_level'] ) ) { 433 $fields = self::fetch_visibility_level( $r['user_id'], $fields ); 434 } 435 436 // Merge the field array back in with the group array. 437 foreach( (array) $groups as $group ) { 438 // Indexes may have been shifted after previous deletions, so we get a 439 // fresh one each time through the loop. 440 $index = array_search( $group, $groups ); 441 442 foreach( (array) $fields as $field ) { 443 if ( $group->id === $field->group_id ) { 444 $groups[ $index ]->fields[] = $field; 445 } 446 } 447 448 // When we unset fields above, we may have created empty groups. 449 // Remove them, if necessary. 450 if ( empty( $group->fields ) && ! empty( $r['hide_empty_groups'] ) ) { 451 unset( $groups[ $index ] ); 452 } 453 454 // Reset indexes. 455 $groups = array_values( $groups ); 456 } 457 458 return $groups; 459 } 460 461 /** 462 * Gets group IDs, based on passed parameters. 463 * 464 * @since 5.0.0 465 * 466 * @param array $args { 467 * Array of optional arguments: 468 * @type int $profile_group_id Limit results to a single profile group. Default false. 469 * @type array $exclude_groups Comma-separated list or array of group IDs to exclude. Default false. 470 * @type bool $hide_empty_groups True to hide groups that don't have any fields. Default: false. 471 * } 472 * @return array 473 */ 474 public static function get_group_ids( $args = array() ) { 475 global $wpdb; 476 477 $r = array_merge( 478 array( 479 'profile_group_id' => false, 480 'exclude_groups' => false, 481 'hide_empty_groups' => false, 482 ), 483 $args 484 ); 485 486 $bp = buddypress(); 487 488 if ( ! empty( $r['profile_group_id'] ) ) { 489 $where_sql = $wpdb->prepare( 'WHERE g.id = %d', $r['profile_group_id'] ); 490 } elseif ( $r['exclude_groups'] ) { 491 $exclude = join( ',', wp_parse_id_list( $r['exclude_groups'] ) ); 492 $where_sql = "WHERE g.id NOT IN ({$exclude})"; 493 } else { 494 $where_sql = ''; 495 } 496 497 // Include or exclude empty groups. 498 if ( ! empty( $r['hide_empty_groups'] ) ) { 499 $group_ids_sql = "SELECT DISTINCT g.id FROM {$bp->profile->table_name_groups} g INNER JOIN {$bp->profile->table_name_fields} f ON g.id = f.group_id {$where_sql} ORDER BY g.group_order ASC"; 500 } else { 501 $group_ids_sql = "SELECT DISTINCT g.id FROM {$bp->profile->table_name_groups} g {$where_sql} ORDER BY g.group_order ASC"; 502 } 503 504 $cached = bp_core_get_incremented_cache( $group_ids_sql, 'bp_xprofile_groups' ); 505 if ( false === $cached ) { 506 $group_ids = $wpdb->get_col( $group_ids_sql ); 507 bp_core_set_incremented_cache( $group_ids_sql, 'bp_xprofile_groups', $group_ids ); 508 } else { 509 $group_ids = $cached; 510 } 511 512 return array_map( 'intval', $group_ids ); 513 } 514 515 /** 516 * Gets group field IDs, based on passed parameters. 517 * 518 * @since 5.0.0 519 * 520 * @param array $group_ids Array of group IDs. 521 * @param array $args { 522 * Array of optional arguments: 523 * @type array $exclude_fields Comma-separated list or array of field IDs to exclude. 524 * Default empty. 525 * @type int $user_id Limit results to fields associated with a given user's 526 * member type. Default empty. 527 * @type array|string $member_type Limit fields by those restricted to a given member type, or array of 528 * member types. If `$user_id` is provided, the value of `$member_type` 529 * is honored. 530 * } 531 * @return array 532 */ 533 public static function get_group_field_ids( $group_ids, $args = array() ) { 534 global $wpdb; 535 536 $r = array_merge( 537 array( 538 'exclude_fields' => false, 539 'user_id' => false, 540 'member_type' => false, 541 ), 542 $args 543 ); 544 545 $bp = buddypress(); 546 547 // Setup IN query from group IDs. 548 if ( empty( $group_ids ) ) { 549 $group_ids = array( 0 ); 550 } 551 $group_ids_in = implode( ',', array_map( 'intval', $group_ids ) ); 552 553 // Support arrays and comma-separated strings. 554 $exclude_fields_cs = wp_parse_id_list( $r['exclude_fields'] ); 555 556 // Visibility - Handled here so as not to be overridden by sloppy use of the 557 // exclude_fields parameter. See bp_xprofile_get_hidden_fields_for_user(). 558 $hidden_user_fields = bp_xprofile_get_hidden_fields_for_user( $r['user_id'] ); 559 $exclude_fields_cs = array_merge( $exclude_fields_cs, $hidden_user_fields ); 560 $exclude_fields_cs = implode( ',', $exclude_fields_cs ); 561 562 // Set up NOT IN query for excluded field IDs. 563 if ( ! empty( $exclude_fields_cs ) ) { 564 $exclude_fields_sql = "AND id NOT IN ({$exclude_fields_cs})"; 565 } else { 566 $exclude_fields_sql = ''; 567 } 568 569 // Set up IN query for included field IDs. 570 $include_field_ids = array(); 571 572 // Member-type restrictions. 573 if ( bp_get_member_types() ) { 574 if ( $r['user_id'] || false !== $r['member_type'] ) { 575 $member_types = $r['member_type']; 576 if ( $r['user_id'] ) { 577 $member_types = bp_get_member_type( $r['user_id'], false ); 578 if ( empty( $member_types ) ) { 579 $member_types = array( 'null' ); 580 } 581 } 582 583 $member_types_fields = BP_XProfile_Field::get_fields_for_member_type( $member_types ); 584 $include_field_ids += array_keys( $member_types_fields ); 585 } 586 } 587 588 $in_sql = ''; 589 if ( ! empty( $include_field_ids ) ) { 590 $include_field_ids_cs = implode( ',', array_map( 'intval', $include_field_ids ) ); 591 $in_sql = " AND id IN ({$include_field_ids_cs}) "; 592 } 593 594 $field_ids_sql = "SELECT id FROM {$bp->profile->table_name_fields} WHERE group_id IN ( {$group_ids_in} ) AND parent_id = 0 {$exclude_fields_sql} {$in_sql} ORDER BY field_order"; 595 596 $cached = bp_core_get_incremented_cache( $field_ids_sql, 'bp_xprofile_groups' ); 597 if ( false === $cached ) { 598 $field_ids = $wpdb->get_col( $field_ids_sql ); 599 bp_core_set_incremented_cache( $field_ids_sql, 'bp_xprofile_groups', $field_ids ); 600 } else { 601 $field_ids = $cached; 602 } 603 604 return array_map( 'intval', $field_ids ); 605 } 606 607 /** 608 * Get data about a set of groups, based on IDs. 609 * 610 * @since 2.0.0 611 * 612 * @param array $group_ids Array of IDs. 613 * @return array 614 */ 615 protected static function get_group_data( $group_ids ) { 616 global $wpdb; 617 618 // Bail if no group IDs are passed. 619 if ( empty( $group_ids ) ) { 620 return array(); 621 } 622 623 // Setup empty arrays. 624 $groups = array(); 625 $uncached_gids = array(); 626 627 // Loop through groups and look for cached & uncached data. 628 foreach ( $group_ids as $group_id ) { 629 630 // If cached data is found, use it. 631 $group_data = wp_cache_get( $group_id, 'bp_xprofile_groups' ); 632 if ( false !== $group_data ) { 633 $groups[ $group_id ] = $group_data; 634 635 // Otherwise leave a placeholder so we don't lose the order. 636 } else { 637 $groups[ $group_id ] = ''; 638 639 // Add to the list of items to be queried. 640 $uncached_gids[] = $group_id; 641 } 642 } 643 644 // Fetch uncached data from the DB if necessary. 645 if ( ! empty( $uncached_gids ) ) { 646 647 // Setup IN query for uncached group data. 648 $uncached_gids_sql = implode( ',', wp_parse_id_list( $uncached_gids ) ); 649 650 // Get table name to query. 651 $table_name = buddypress()->profile->table_name_groups; 652 653 // Fetch data, preserving order. 654 $queried_gdata = $wpdb->get_results( "SELECT * FROM {$table_name} WHERE id IN ({$uncached_gids_sql}) ORDER BY FIELD( id, {$uncached_gids_sql} )"); 655 656 // Make sure query returned valid data. 657 if ( ! empty( $queried_gdata ) && ! is_wp_error( $queried_gdata ) ) { 658 659 // Put queried data into the placeholders created earlier, 660 // and add it to the cache. 661 foreach ( (array) $queried_gdata as $gdata ) { 662 663 // Add group to groups array. 664 $groups[ $gdata->id ] = $gdata; 665 666 // Cache previously uncached group data. 667 wp_cache_set( $gdata->id, $gdata, 'bp_xprofile_groups' ); 668 } 669 } 670 } 671 672 // Integer casting. 673 foreach ( (array) $groups as $key => $data ) { 674 $groups[ $key ]->id = (int) $groups[ $key ]->id; 675 $groups[ $key ]->group_order = (int) $groups[ $key ]->group_order; 676 $groups[ $key ]->can_delete = (int) $groups[ $key ]->can_delete; 677 } 678 679 // Reset indexes & return. 680 return array_values( $groups ); 681 } 682 683 /** 684 * Validate field group when form submitted. 685 * 686 * @since 1.0.0 687 * 688 * @global string $message 689 * 690 * @return boolean 691 */ 692 public static function admin_validate() { 693 global $message; 694 695 // Validate Form. 696 if ( empty( $_POST['group_name'] ) ) { 697 $message = __( 'Please make sure you give the group a name.', 'buddypress' ); 698 return false; 699 } else { 700 return true; 701 } 702 } 703 704 /** 705 * Update field group position. 706 * 707 * @since 1.5.0 708 * 709 * @global $wpdb $wpdb 710 * 711 * @param int $field_group_id ID of the group the field belongs to. 712 * @param int $position Field group position. 713 * @return boolean 714 */ 715 public static function update_position( $field_group_id, $position ) { 716 global $wpdb; 717 718 if ( ! is_numeric( $position ) ) { 719 return false; 720 } 721 722 // Purge profile field group and group query caches. 723 wp_cache_delete( 'all', 'bp_xprofile_groups' ); 724 bp_core_reset_incrementor( 'bp_xprofile_groups' ); 725 726 $bp = buddypress(); 727 728 return $wpdb->query( $wpdb->prepare( "UPDATE {$bp->profile->table_name_groups} SET group_order = %d WHERE id = %d", $position, $field_group_id ) ); 729 } 730 731 /** 732 * Fetch the field visibility level for the fields returned by the query. 733 * 734 * @since 1.6.0 735 * 736 * @param int $user_id The profile owner's user_id. 737 * @param array $fields The database results returned by the get() query. 738 * @return array $fields The database results, with field_visibility added 739 */ 740 public static function fetch_visibility_level( $user_id = 0, $fields = array() ) { 741 742 // Get the user's visibility level preferences. 743 $visibility_levels = bp_get_user_meta( $user_id, 'bp_xprofile_visibility_levels', true ); 744 745 foreach( (array) $fields as $key => $field ) { 746 747 // Does the admin allow this field to be customized? 748 $visibility = bp_xprofile_get_meta( $field->id, 'field', 'allow_custom_visibility' ); 749 $allow_custom = (bool) ( 'disabled' !== $visibility ); 750 751 // Look to see if the user has set the visibility for this field. 752 if ( ( true === $allow_custom ) && isset( $visibility_levels[ $field->id ] ) ) { 753 $field_visibility = $visibility_levels[ $field->id ]; 754 755 // If no admin-set default is saved, fall back on a global default. 756 } else { 757 $fallback_visibility = bp_xprofile_get_meta( $field->id, 'field', 'default_visibility' ); 758 759 /** 760 * Filters the XProfile default visibility level for a field. 761 * 762 * @since 1.6.0 763 * 764 * @param string $value Default visibility value. 765 */ 766 $field_visibility = ! empty( $fallback_visibility ) 767 ? $fallback_visibility 768 : apply_filters( 'bp_xprofile_default_visibility_level', 'public' ); 769 } 770 771 $fields[ $key ]->visibility_level = $field_visibility; 772 } 773 774 return $fields; 775 } 776 777 /** 778 * Fetch the admin-set preferences for all fields. 779 * 780 * @since 1.6.0 781 * 782 * @return array $default_visibility_levels An array, keyed by field_id, of default 783 * visibility level + allow_custom 784 * (whether the admin allows this 785 * field to be set by user) 786 */ 787 public static function fetch_default_visibility_levels() { 788 global $wpdb; 789 790 $default_visibility_levels = wp_cache_get( 'default_visibility_levels', 'bp_xprofile' ); 791 792 if ( false === $default_visibility_levels ) { 793 $bp = buddypress(); 794 795 $levels = $wpdb->get_results( "SELECT object_id, meta_key, meta_value FROM {$bp->profile->table_name_meta} WHERE object_type = 'field' AND ( meta_key = 'default_visibility' OR meta_key = 'allow_custom_visibility' )" ); 796 797 // Arrange so that the field id is the key and the visibility level the value. 798 $default_visibility_levels = array(); 799 foreach ( $levels as $level ) { 800 switch ( $level->meta_key ) { 801 case 'default_visibility' : 802 $default_visibility_levels[ $level->object_id ]['default'] = $level->meta_value; 803 break; 804 case 'allow_custom_visibility' : 805 $default_visibility_levels[ $level->object_id ]['allow_custom'] = $level->meta_value; 806 break; 807 } 808 } 809 810 wp_cache_set( 'default_visibility_levels', $default_visibility_levels, 'bp_xprofile' ); 811 } 812 813 return $default_visibility_levels; 814 } 815 816 /** Admin Output **********************************************************/ 817 818 /** 819 * Output the admin area field group form. 820 * 821 * @since 1.0.0 822 * 823 * @global string $message 824 */ 825 public function render_admin_form() { 826 global $message; 827 828 // Users Admin URL. 829 $users_url = bp_get_admin_url( 'users.php' ); 830 831 // URL to cancel to. 832 $cancel_url = add_query_arg( array( 833 'page' => 'bp-profile-setup' 834 ), $users_url ); 835 836 // New field group. 837 if ( empty( $this->id ) ) { 838 $title = __( 'Add New Field Group', 'buddypress' ); 839 $button = __( 'Save', 'buddypress' ); 840 $action = add_query_arg( array( 841 'page' => 'bp-profile-setup', 842 'mode' => 'add_group' 843 ), $users_url ); 844 845 // Existing field group. 846 } else { 847 $title = __( 'Edit Field Group', 'buddypress' ); 848 $button = __( 'Update', 'buddypress' ); 849 $action = add_query_arg( array( 850 'page' => 'bp-profile-setup', 851 'mode' => 'edit_group', 852 'group_id' => (int) $this->id 853 ), $users_url ); 854 855 if ( $this->can_delete ) { 856 // Delete Group URL. 857 $delete_url = wp_nonce_url( add_query_arg( array( 858 'page' => 'bp-profile-setup', 859 'mode' => 'delete_group', 860 'group_id' => (int) $this->id 861 ), $users_url ), 'bp_xprofile_delete_group' ); 862 } 863 } ?> 864 865 <div class="wrap"> 866 867 <h1 class="wp-heading-inline"><?php echo esc_html( $title ); ?></h1> 868 <hr class="wp-header-end"> 869 870 <?php if ( ! empty( $message ) ) : ?> 871 872 <div id="message" class="error fade notice is-dismissible"> 873 <p><?php echo esc_html( $message ); ?></p> 874 </div> 875 876 <?php endif; ?> 877 878 <form id="bp-xprofile-add-field-group" action="<?php echo esc_url( $action ); ?>" method="post"> 879 <div id="poststuff"> 880 <div id="post-body" class="metabox-holder columns-<?php echo ( 1 == get_current_screen()->get_columns() ) ? '1' : '2'; ?>"> 881 <div id="post-body-content"> 882 <div id="titlediv"> 883 <div class="titlewrap"> 884 <label id="title-prompt-text" for="title"><?php esc_html_e( 'Field Group Name (required)', 'buddypress') ?></label> 885 <input type="text" name="group_name" id="title" value="<?php echo esc_attr( $this->name ); ?>" autocomplete="off" /> 886 </div> 887 </div> 888 <div class="postbox"> 889 <h2><?php esc_html_e( 'Field Group Description', 'buddypress' ); ?></h2> 890 <div class="inside"> 891 <label for="group_description" class="screen-reader-text"><?php 892 /* translators: accessibility text */ 893 esc_html_e( 'Add description', 'buddypress' ); 894 ?></label> 895 <textarea name="group_description" id="group_description" rows="8" cols="60"><?php echo esc_textarea( $this->description ); ?></textarea> 896 </div> 897 </div> 898 899 <?php 900 901 /** 902 * Fires after the XProfile group description field is rendered in wp-admin. 903 * 904 * @since 2.6.0 905 * 906 * @param BP_XProfile_Group $this Current XProfile group. 907 */ 908 do_action( 'xprofile_group_admin_after_description', $this ); ?> 909 910 </div><!-- #post-body-content --> 911 912 <div id="postbox-container-1" class="postbox-container"> 913 914 <?php 915 916 /** 917 * Fires before XProfile Group submit metabox. 918 * 919 * @since 2.1.0 920 * 921 * @param BP_XProfile_Group $this Current XProfile group. 922 */ 923 do_action( 'xprofile_group_before_submitbox', $this ); ?> 924 925 <div id="submitdiv" class="postbox"> 926 <h2><?php esc_html_e( 'Submit', 'buddypress' ); ?></h2> 927 <div class="inside"> 928 <div id="submitcomment" class="submitbox"> 929 <div id="major-publishing-actions"> 930 931 <?php 932 933 // Nonce fields. 934 wp_nonce_field( 'bp_xprofile_admin_group', 'bp_xprofile_admin_group' ); 935 936 /** 937 * Fires at the beginning of the XProfile Group publishing actions section. 938 * 939 * @since 2.1.0 940 * 941 * @param BP_XProfile_Group $this Current XProfile group. 942 */ 943 do_action( 'xprofile_group_submitbox_start', $this ); ?> 944 945 <input type="hidden" name="group_order" id="group_order" value="<?php echo esc_attr( $this->group_order ); ?>" /> 946 <div id="publishing-action"> 947 <input type="submit" name="save_group" value="<?php echo esc_attr( $button ); ?>" class="button-primary"/> 948 </div> 949 <div id="delete-action"> 950 <?php if ( ! empty( $this->id ) && isset( $delete_url ) ) : ?> 951 <a href="<?php echo esc_url( $delete_url ); ?>" class="submitdelete deletion"><?php esc_html_e( 'Delete Group', 'buddypress' ); ?></a> 952 <?php endif; ?> 953 954 <div><a href="<?php echo esc_url( $cancel_url ); ?>" class="deletion"><?php esc_html_e( 'Cancel', 'buddypress' ); ?></a></div> 955 </div> 956 <div class="clear"></div> 957 </div> 958 </div> 959 </div> 960 </div> 961 962 <?php 963 964 /** 965 * Fires after XProfile Group submit metabox. 966 * 967 * @since 2.1.0 968 * 969 * @param BP_XProfile_Group $this Current XProfile group. 970 */ 971 do_action( 'xprofile_group_after_submitbox', $this ); ?> 972 973 </div> 974 </div> 975 </div> 976 </form> 977 </div> 978 979 <?php 980 } 981 }
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 |