HEX
Server: LiteSpeed
System: Linux node612.namehero.net 4.18.0-553.121.1.lve.el8.x86_64 #1 SMP Thu Apr 30 16:40:41 UTC 2026 x86_64
User: dfwparty (1186)
PHP: 8.3.31
Disabled: NONE
Upload Files
File: /home/dfwparty/dfwchat.net/wp-content/plugins/buddyboss-platform/bp-xprofile/bp-xprofile-admin.php
<?php
/**
 * BuddyPress XProfile Admin.
 *
 * Legacy admin UI (field list, add/edit/delete screens, AJAX reorder,
 * admin tabs) removed — now managed via Settings 2.0.
 *
 * Only runtime hooks remain: repeater-field migration helpers that fire
 * on `xprofile_group_before_save` / `xprofile_group_after_save`.
 *
 * @package BuddyBoss\XProfile
 * @since BuddyPress 1.0.0
 */

// Exit if accessed directly.
defined( 'ABSPATH' ) || exit;

/**
 * Creates the administration interface menus and checks to see if the DB
 * tables are set up.
 *
 * @since BuddyPress 1.0.0
 *
 * @return bool
 */
function xprofile_add_admin_menu() {
	global $submenu;

	// Bail if current user cannot moderate community.
	if ( ! bp_current_user_can( 'bp_moderate' ) ) {
		return false;
	}

	// Register the menu item pointing directly to the React Settings 2.0 page.
	// Direct visits to the legacy `?page=bp-profile-setup` are caught upstream
	// by `bb_redirect_bp_settings_before_permission_check()` at
	// `admin_menu @ PHP_INT_MAX` so they don't 403.
	$settings_url = function_exists( 'bb_get_feature_settings_url' )
		? bb_get_feature_settings_url( 'members', 'profile_fields' )
		: admin_url( 'admin.php?page=bb-settings&tab=members&panel=profile_fields' );

	$submenu['buddyboss-platform'][] = array(
		__( 'Profiles', 'buddyboss' ),
		'bp_moderate',
		$settings_url,
	);
}
add_action( bp_core_admin_hook(), 'xprofile_add_admin_menu' );

// Load the xprofile user admin.
add_action( 'bp_init', array( 'BP_XProfile_User_Admin', 'register_xprofile_user_admin' ), 11 );

/**
 * Save repeater option temporary before save group details.
 *
 * @since BuddyBoss 2.3.70
 *
 * @param object|BP_XProfile_Group $xprofile Current instance of the group being saved.
 */
function bb_xprofile_before_save_xprofile_group_details( $xprofile ) {
	// Save the previous data to use later.
	$is_repeater_enabled = BP_XProfile_Group::get_group_meta( $xprofile->id, 'is_repeater_enabled' );
	bp_update_option( 'xprofile_group_' . $xprofile->id, $is_repeater_enabled );
}
add_action( 'xprofile_group_before_save', 'bb_xprofile_before_save_xprofile_group_details', 11, 1 );

/**
 * Migrating the user simple data's to repeater fields data's.
 *
 * @since BuddyBoss 2.3.70
 *
 * @param object|BP_XProfile_Group $xprofile Current instance of the group being saved.
 */
function bb_xprofile_migrate_simple_to_repeater_fields_data( $xprofile ) {
	global $wpdb, $bp, $bb_background_updater;

	$repeater_enabled = isset( $_POST['group_is_repeater'] ) && 'on' == $_POST['group_is_repeater'] ? 'on' : 'off';
	$previous_value   = bp_get_option( 'xprofile_group_' . $xprofile->id );

	if (
		'on' === $repeater_enabled &&
		'on' !== $previous_value &&
		! empty( $xprofile->id )
	) {
		$repeater_template_fields = bp_get_repeater_template_field_ids( $xprofile->id );

		// Check if clone fields not created then create it.
		$repeater_fields = bp_get_repeater_clone_field_ids_all( $xprofile->id );
		if ( empty( $repeater_fields ) ) {
			$user_field_set_count = bp_get_profile_field_set_count( $xprofile->id, get_current_user_id() );
			bp_get_repeater_clone_field_ids_subset( $xprofile->id, $user_field_set_count );
		}

		if ( ! empty( $repeater_template_fields ) ) {
			$repeater_template_fields_in = "'" . implode( "','", $repeater_template_fields ) . "'";

			$user_ids = $wpdb->get_col( "SELECT DISTINCT user_id FROM {$bp->profile->table_name_data} WHERE field_id IN ({$repeater_template_fields_in})" );

			if ( ! empty( $user_ids ) ) {

				$min_count = (int) apply_filters( 'bb_xprofile_migrate_repeater_queue_min_count', 10 );
				if ( $min_count && count( $user_ids ) > $min_count ) {

					$chunk_user_ids = array_chunk( $user_ids, $min_count );
					if ( ! empty( $chunk_user_ids ) ) {
						foreach ( $chunk_user_ids as $chunked_user_ids ) {
							$bb_background_updater->data(
								array(
									'type'     => 'xprofile',
									'group'    => 'xprofile_simple_field_to_repeater',
									'priority' => 5,
									'callback' => 'bb_xprofile_mapping_simple_to_repeater_fields_data',
									'args'     => array( $chunked_user_ids, $xprofile->id ),
								)
							);
							$bb_background_updater->save();
						}
					}

					$bb_background_updater->dispatch();
				} else {
					bb_xprofile_mapping_simple_to_repeater_fields_data( $user_ids, $xprofile->id );
				}
			}
		}
	}

	// Delete the option.
	bp_delete_option( 'xprofile_group_' . $xprofile->id );
}
add_action( 'xprofile_group_after_save', 'bb_xprofile_migrate_simple_to_repeater_fields_data', 11, 1 );

/**
 * Prepare data to insert into repeater fields.
 *
 * @since BuddyBoss 2.3.70
 *
 * @param array $user_ids Array of user ID's.
 * @param int   $group_id Xprofile group ID.
 */
function bb_xprofile_mapping_simple_to_repeater_fields_data( $user_ids, $group_id ) {
	if ( ! empty( $user_ids ) ) {
		foreach ( $user_ids as $user_id ) {
			$clone_fields = bp_get_repeater_clone_field_ids_subset( $group_id, 1 );
			if ( ! empty( $clone_fields ) ) {
				foreach ( $clone_fields as $clone_field_id ) {
					$data              = xprofile_get_field_data( $clone_field_id, $user_id );
					$template_field_id = bp_xprofile_get_meta( $clone_field_id, 'field', '_cloned_from', true );
					if ( empty( $data ) && ! empty( $template_field_id ) && null !== bb_xprofile_get_field_type( $template_field_id ) ) {
						xprofile_set_field_data( $clone_field_id, $user_id, xprofile_get_field_data( $template_field_id, $user_id ) );
					}
				}
			}
		}
	}
}