1 && $optgroup_label != '' && !empty($optgroup3)) { $optgroup_start = array(array('label' => $optgroup_label, 'value' => NULL, 'optgroup' => 'start')); $optgroup_end = array(array('label' => $optgroup_label, 'value' => NULL, 'optgroup' => 'end')); $optgroup3 = array_merge($optgroup_start, $optgroup3, $optgroup_end); } $options = array_merge($options, $optgroup3); } } else { $optgroup1 = uwp_string_to_options($optgroup, $translated); $options = array_merge($options, $optgroup1); } } } else { $options = uwp_string_to_options($option_values, $translated); } return $options; } /** * Converts string value to options array. * Used in select, multiselect and radio fields. * * @since 1.0.0 * @package userswp * * @param string $input Input String * @param bool $translated Do you want to translate the output? * * @return array Options array. */ function uwp_string_to_options($input = '', $translated = false) { $return = array(); if ($input != '') { $input = trim($input); $input = rtrim($input, ","); $input = ltrim($input, ","); $input = trim($input); } $input_arr = explode(',', $input); if (!empty($input_arr)) { foreach ($input_arr as $input_str) { $input_str = trim(stripslashes($input_str)); if (strpos($input_str, "/") !== false) { $input_str = explode("/", $input_str, 2); $label = trim($input_str[0]); if ($translated && $label != '') { $label = __($label, 'userswp'); } $label = ucfirst($label); $value = trim($input_str[1]); } else { if ($translated && $input_str != '') { $input_str = __($input_str, 'userswp'); } $label = ucfirst($input_str); $value = $input_str; } if ($label != '') { $return[] = array('label' => $label, 'value' => $value, 'optgroup' => NULL); } } } return $return; } /** * Resizes thumbnail image. * * @since 1.0.0 * @package userswp * * @param string $thumb_image_name * @param string $image * @param int $x x-coordinate of source point. * @param int $y y-coordinate of source point. * @param int $src_w Source width. * @param int $src_h Source height. * @param float $scale Image scale ratio. * * @return mixed Resized image. */ function uwp_resizeThumbnailImage($thumb_image_name, $image, $x, $y, $src_w, $src_h, $scale, $wp_error = false) { uwp_set_php_limits(); // Ignore image creation warnings @ini_set('gd.jpeg_ignore_warning', 1); $newImageWidth = ceil($src_w * $scale); $newImageHeight = ceil($src_h * $scale); /** @noinspection PhpUnusedLocalVariableInspection */ list($imagewidth, $imageheight, $imageType) = getimagesize($image); $imageType = image_type_to_mime_type($imageType); if (function_exists('wp_crop_image')) { $wp_crop = ! in_array($imageType, array('image/gif', 'image/pjpeg', 'image/jpeg', 'image/jpg', 'image/png', 'image/x-png', 'image/webp')) ? true : false; $wp_crop = apply_filters('uwp_resize_image_use_wp_crop_image', $wp_crop, $imageType, $image, $thumb_image_name, $x, $y, $src_w, $src_h, $scale); if ($wp_crop) { $cropped = wp_crop_image($image, $x, $y, $src_w, $src_h, $newImageWidth, $newImageHeight, false, $thumb_image_name); if ($wp_error && is_wp_error($cropped)) { return $cropped; } return $thumb_image_name; } } $newImage = imagecreatetruecolor($newImageWidth, $newImageHeight); $source = false; switch ($imageType) { case "image/gif": $source = imagecreatefromgif($image); break; case "image/pjpeg": case "image/jpeg": case "image/jpg": $source = imagecreatefromjpeg($image); break; case "image/png": case "image/x-png": $source = imagecreatefrompng($image); if (apply_filters('uwp_keep_png_transperent', true, $thumb_image_name, $image, $x, $y, $src_w, $src_h)) { $background = imagecolorallocate($newImage, 0, 0, 0); imagecolortransparent($newImage, $background); imagealphablending($newImage, false); imagesavealpha($newImage, true); } break; case "image/webp": if (function_exists('imagecreatefromwebp')) { $source = imagecreatefromwebp($image); imagealphablending($newImage, false); imagesavealpha($newImage, true); } break; } imagecopyresampled($newImage, $source, 0, 0, $x, $y, $newImageWidth, $newImageHeight, $src_w, $src_h); $quality = apply_filters('uwp_resize_thumb_quality', 100); switch ($imageType) { case "image/gif": imagegif($newImage, $thumb_image_name); break; case "image/pjpeg": case "image/jpeg": case "image/jpg": imagejpeg($newImage, $thumb_image_name, $quality); break; case "image/png": case "image/x-png": imagepng($newImage, $thumb_image_name); break; case "image/webp": if (function_exists('imagewebp')) { imagewebp($newImage, $thumb_image_name, $quality); } else { imagepng($newImage, $thumb_image_name); } break; } chmod($thumb_image_name, 0777); imagedestroy($newImage); imagedestroy($source); return $thumb_image_name; } /** * Try to set higher limits on the fly */ function uwp_set_php_limits() { error_reporting(0); // try to set higher limits for import $max_input_time = ini_get('max_input_time'); $max_execution_time = ini_get('max_execution_time'); $memory_limit = ini_get('memory_limit'); if ($max_input_time !== 0 && $max_input_time != -1 && (! $max_input_time || $max_input_time < 3000)) { ini_set('max_input_time', 3000); } if ($max_execution_time !== 0 && (! $max_execution_time || $max_execution_time < 3000)) { ini_set('max_execution_time', 3000); } if ($memory_limit && str_replace('M', '', $memory_limit)) { if (str_replace('M', '', $memory_limit) < 256) { ini_set('memory_limit', '256M'); } } ini_set('auto_detect_line_endings', true); } /** * Logs the error message. * * @since 1.0.0 * @package userswp * * @param array|object|string $log Error message. * * @return void */ function uwp_error_log($log) { /* * A filter to override the debugging setting for function uwp_error_log(). */ $should_log = apply_filters('uwp_log_errors', uwp_get_option('enable_uwp_error_log', 0)); if (1 == $should_log) { if (is_array($log) || is_object($log)) { error_log(print_r($log, true)); } else { error_log($log); } } } function uwp_get_excluded_users_list() { $args = array( 'fields' => 'ID', 'meta_query' => array( 'relation' => 'OR', array( 'key' => 'uwp_mod', 'value' => 'email_unconfirmed', 'compare' => '==' ), array( 'key' => 'uwp_hide_from_listing', 'value' => 1, 'compare' => '==' ) ) ); $inactive_users = new WP_User_Query($args); $exclude_users = $inactive_users->get_results(); $excluded_globally = uwp_get_option('users_excluded_from_list'); if (!empty($excluded_globally)) { if (is_array($excluded_globally)) { $exclude_users = array_merge($exclude_users, $excluded_globally); } else { $excluded_users = str_replace(' ', '', $excluded_globally); $users_array = explode(',', $excluded_users); $exclude_users = array_merge($exclude_users, $users_array); } } return $exclude_users; } /** * Retrieves a list of users with optional filtering, searching, and sorting. * * @since 1.0.0 * @package userswp * * @param array $roles Optional. Array of user roles to filter by. Default empty array. * @return array { * Array of users and pagination data. * * @type array $users Array of WP_User objects. * @type int $total_users Total number of users found. * } */ function get_uwp_users_list( $roles = array() ) { global $wpdb; // Sanitize and validate input parameters $keyword = false; if ( isset( $_GET['uwps'] ) && ! empty( $_GET['uwps'] ) ) { $keyword = sanitize_text_field( wp_unslash( $_GET['uwps'] ) ); } // Get pagination parameter with proper fallback $paged = 1; if ( isset( $_GET['paged'] ) && ! empty( $_GET['paged'] ) ) { $paged = absint( $_GET['paged'] ); } elseif ( is_front_page() ) { $page_var = get_query_var( 'page' ); $paged = absint( $page_var ) > 0 ? absint( $page_var ) : 1; } else { $paged_var = get_query_var( 'paged' ); $paged = absint( $paged_var ) > 0 ? absint( $paged_var ) : 1; } // Get number of items per page $number = absint( uwp_get_option( 'users_no_of_items', 10 ) ); $number = $number > 0 ? $number : 10; // Get search where clause from filters $where = ''; $where = apply_filters( 'uwp_users_search_where', $where, $keyword ); // Get excluded users list $exclude_users = uwp_get_excluded_users_list(); $exclude_users = apply_filters( 'uwp_excluded_users_from_list', $exclude_users, $where, $keyword ); $exclude_users = ! empty( $exclude_users ) ? array_unique( $exclude_users ) : array(); // Initialize sorting parameters $exclude_query = ' '; $order_by = 'uwp_meta_value'; $order = 'ASC'; $meta_key = ''; // Get and sanitize sort parameter $sort_by = ''; if ( isset( $_GET['uwp_sort_by'] ) && ! empty( $_GET['uwp_sort_by'] ) ) { $sort_by = sanitize_text_field( wp_unslash( $_GET['uwp_sort_by'] ) ); } // Process sorting parameters if ( ! empty( $sort_by ) ) { // Handle special cases for newer/older if ( 'newer' === $sort_by ) { $order_by = 'user_registered'; $order = 'DESC'; } elseif ( 'older' === $sort_by ) { $order_by = 'user_registered'; $order = 'ASC'; } else { // Handle _asc and _desc suffixes if ( substr( $sort_by, -4 ) === '_asc' ) { $order_by = substr( $sort_by, 0, -4 ); $order = 'ASC'; } elseif ( substr( $sort_by, -5 ) === '_desc' ) { $order_by = substr( $sort_by, 0, -5 ); $order = 'DESC'; } else { // Default to ASC if no suffix $order_by = $sort_by; $order = 'ASC'; } } } // Build exclude query for excluded users if ( ! empty( $exclude_users ) ) { $exclude_users_list = implode( ',', array_map( 'absint', $exclude_users ) ); $exclude_query = 'AND ' . $wpdb->users . '.ID NOT IN (' . $exclude_users_list . ')'; } $users = array(); // Check if we have search criteria if ( $keyword || $where ) { // Build search query based on whether we have custom where clause if ( empty( $where ) ) { // Standard search query with keyword $search_term = '%' . $wpdb->esc_like( $keyword ) . '%'; $user_query = $wpdb->prepare( "SELECT DISTINCT SQL_CALC_FOUND_ROWS {$wpdb->users}.* FROM {$wpdb->users} LEFT JOIN {$wpdb->usermeta} AS first_name_meta ON ( {$wpdb->users}.ID = first_name_meta.user_id AND first_name_meta.meta_key = 'first_name' ) LEFT JOIN {$wpdb->usermeta} AS last_name_meta ON ( {$wpdb->users}.ID = last_name_meta.user_id AND last_name_meta.meta_key = 'last_name' ) LEFT JOIN {$wpdb->usermeta} AS nickname_meta ON ( {$wpdb->users}.ID = nickname_meta.user_id AND nickname_meta.meta_key = 'nickname' ) WHERE 1=1 {$exclude_query} AND ( first_name_meta.meta_value LIKE %s OR last_name_meta.meta_value LIKE %s OR nickname_meta.meta_value LIKE %s OR user_login LIKE %s OR user_nicename LIKE %s OR display_name LIKE %s ) ORDER BY display_name ASC", $search_term, $search_term, $search_term, $search_term, $search_term, $search_term ); } else { // Custom where clause with uwp_usermeta table $usermeta_table = get_usermeta_table_prefix() . 'uwp_usermeta'; $keyword_query = ''; if ( $keyword ) { $search_term = '%' . $wpdb->esc_like( $keyword ) . '%'; $keyword_query = $wpdb->prepare( " AND (( {$wpdb->usermeta}.meta_key = 'first_name' AND {$wpdb->usermeta}.meta_value LIKE %s ) OR ( {$wpdb->usermeta}.meta_key = 'last_name' AND {$wpdb->usermeta}.meta_value LIKE %s ) OR ( {$wpdb->usermeta}.meta_key = 'nickname' AND {$wpdb->usermeta}.meta_value LIKE %s ) OR user_login LIKE %s OR user_nicename LIKE %s OR display_name LIKE %s)", $search_term, $search_term, $search_term, $search_term, $search_term, $search_term ); } $user_query = "SELECT DISTINCT SQL_CALC_FOUND_ROWS {$wpdb->users}.* FROM {$wpdb->users} INNER JOIN {$wpdb->usermeta} ON ( {$wpdb->users}.ID = {$wpdb->usermeta}.user_id ) INNER JOIN {$usermeta_table} ON ( {$wpdb->users}.ID = {$usermeta_table}.user_id ) WHERE 1=1 {$keyword_query} {$exclude_query} {$where} ORDER BY display_name ASC"; } // Execute search query $user_results = $wpdb->get_results( $user_query ); // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching $get_users = wp_list_pluck( $user_results, 'ID' ); // Filter by roles if specified if ( ! empty( $roles ) && is_array( $roles ) ) { $role_users = get_users( array( 'role__in' => $roles, 'fields' => array( 'ID' ) ) ); $role_user_ids = wp_list_pluck( $role_users, 'ID' ); if ( ! empty( $get_users ) && ! empty( $role_user_ids ) ) { $get_users = array_intersect( $get_users, $role_user_ids ); } } // Process results if we have users if ( ! empty( $get_users ) && is_array( $get_users ) ) { // Prepare WP_User_Query arguments $args = array( 'include' => $get_users, 'number' => $number, 'paged' => $paged, ); // Add exclude users if any if ( ! empty( $exclude_users ) ) { $args['exclude'] = $exclude_users; } // Add meta_key if specified if ( ! empty( $meta_key ) ) { $args['meta_key'] = $meta_key; } // Handle sorting if ( ! empty( $order_by ) && ! empty( $order ) ) { if ( in_array( $order_by, array( 'first_name', 'last_name' ), true ) ) { $args['meta_key'] = $order_by; $args['orderby'] = 'meta_value'; $args['order'] = $order; } else { $args['orderby'] = $order_by; $args['order'] = $order; } } // Execute WP_User_Query $uwp_users_query = new WP_User_Query( $args ); $users['users'] = $uwp_users_query->get_results(); $users['total_users'] = $uwp_users_query->get_total(); } else { $users['users'] = array(); $users['total_users'] = 0; } } else { // No search criteria - get all users with optional role filtering $args = array( 'number' => $number, 'paged' => $paged, ); // Add exclude users if any if ( ! empty( $exclude_users ) ) { $args['exclude'] = $exclude_users; } // Filter by roles if specified if ( ! empty( $roles ) && is_array( $roles ) ) { $args['role__in'] = $roles; } // Add meta_key if specified if ( ! empty( $meta_key ) ) { $args['meta_key'] = $meta_key; } // Handle sorting if ( ! empty( $order_by ) && ! empty( $order ) ) { if ( in_array( $order_by, array( 'first_name', 'last_name' ), true ) ) { $args['meta_key'] = $order_by; $args['orderby'] = 'meta_value'; $args['order'] = $order; } else { $args['orderby'] = $order_by; $args['order'] = $order; } } // Execute WP_User_Query $uwp_users_query = new WP_User_Query( $args ); $users['users'] = $uwp_users_query->get_results(); $users['total_users'] = $uwp_users_query->get_total(); } return $users; } /** * Returns the Users page layout class based on the setting. * * @since 1.0.0 * @package userswp * * @return string Layout class. */ function uwp_get_layout_class($layout, $count_only = false) { if (!$layout) { if (uwp_get_option("design_style", 'bootstrap')) { $value = '3col'; } else { $value = 'list'; } $layout = uwp_get_option('users_default_layout', $value); } switch ($layout) { case "list": $class = "uwp_listview"; $bs_class = "row-cols-md-1"; $col_count = 1; break; case "2col": $class = "uwp_gridview uwp_gridview_2col"; $bs_class = "row-cols-md-2"; $col_count = 2; break; case "3col": $class = "uwp_gridview uwp_gridview_3col"; $bs_class = "row-cols-md-3"; $col_count = 3; break; case "4col": $class = "uwp_gridview uwp_gridview_4col"; $bs_class = "row-cols-md-4"; $col_count = 4; break; case "5col": $class = "uwp_gridview uwp_gridview_5col"; $bs_class = "row-cols-md-5"; $col_count = 5; break; default: $class = "uwp_listview"; $bs_class = "row-cols-md-3"; $col_count = 1; } if ($count_only) { return $col_count; } if (uwp_get_option("design_style", 'bootstrap')) { return $bs_class; } return $class; } add_filter('uwp_users_list_ul_extra_class', 'uwp_get_layout_class', 10, 1); add_filter('get_user_option_metaboxhidden_nav-menus', 'uwp_always_nav_menu_visibility', 10, 3); /** * Filters nav menu visibility option value. * * @since 1.0.0 * @package userswp * * @param mixed $result Value for the user's option. * @param string $option Name of the option being retrieved. * @param WP_User $user WP_User object of the user whose option is being retrieved. * * @return array Filtered value. */ function uwp_always_nav_menu_visibility($result, $option, $user) { if (is_array($result) && in_array('add-users-wp-nav-menu', $result)) { $result = array_diff($result, array('add-users-wp-nav-menu')); } return $result; } // Privacy add_filter('uwp_account_page_title', 'uwp_account_privacy_page_title', 10, 2); /** * Adds Privacy tab title in Account page. * * @since 1.0.0 * @package userswp * * @param string $title Privacy title. * @param string $type Tab type. * * @return string Title. */ function uwp_account_privacy_page_title($title, $type) { if ($type == 'privacy') { $title = __('Privacy', 'userswp'); } elseif ($type == 'notifications') { $title = __('E-Mail Notifications', 'userswp'); } elseif ($type == 'delete-account') { $title = __('Delete Account', 'userswp'); } elseif ($type == 'change-password') { $title = __('Change Password', 'userswp'); } elseif ($type == 'wp2fa') { $title = __('Two-factor Authentication Settings', 'userswp'); } return $title; } add_action('uwp_account_menu_display', 'uwp_add_account_menu_links'); /** * Prints "Edit account" page subtab / submenu links. Ex: Privacy * * @since 1.0.0 * @package userswp * * @return void */ function uwp_add_account_menu_links() { global $aui_bs5; if (isset($_GET['type'])) { $type = strip_tags(esc_sql($_GET['type'])); } else { $type = 'account'; } $account_page = uwp_get_page_id('account_page', false); $account_page_link = get_permalink($account_page); $account_available_tabs = uwp_account_get_available_tabs(); if (!is_array($account_available_tabs) && count($account_available_tabs) > 0) { return; } $legacy = '