options()->get( 'account_hide_in_directory_default' ); if ( $option == 'Yes' ) { $default = true; } $default = apply_filters( 'um_member_directory_hide_in_members_default', $default ); return $default; } /** * Getting member directory post ID via hash * Hash is unique attr, which we use visible at frontend * * @param string $hash * * @return bool|int */ function get_directory_by_hash( $hash ) { global $wpdb; $directory_id = $wpdb->get_var( $wpdb->prepare( "SELECT ID FROM {$wpdb->posts} WHERE SUBSTRING( MD5( ID ), 11, 5 ) = %s", $hash ) ); if ( empty( $directory_id ) ) { return false; } return (int) $directory_id; } /** * @param $id * * @return bool|string */ function get_directory_hash( $id ) { $hash = substr( md5( $id ), 10, 5 ); return $hash; } /** * Get view Type template * @param string $type * * @return string */ function get_type_basename( $type ) { return apply_filters( "um_member_directory_{$type}_type_template_basename", '' ); } /** * Tag conversion for member directory * * @param string $string * @param array $array * * @return string */ function convert_tags( $string, $array ) { $search = array( '{total_users}', ); $replace = array( $array['total_users'], ); $string = str_replace( $search, $replace, $string ); return $string; } /** * Members page allowed? * * can be disabled by "Enable Members Directory" option * */ function access_members() { if ( UM()->options()->get( 'members_page' ) == 0 && um_is_core_page( 'members' ) ) { um_redirect_home(); } } /** * @param $value * @param $key * @param $post_id * * @return array */ public function before_save_data( $value, $key, $post_id ) { $post = get_post( $post_id ); if ( 'um_directory' === $post->post_type ) { if ( ! empty( $value ) && in_array( $key, array( '_um_view_types', '_um_roles', '_um_roles_can_search', '_um_roles_can_filter' ), true ) ) { $value = array_keys( $value ); } elseif ( '_um_search_filters' === $key ) { $temp_value = array(); if ( ! empty( $value ) ) { foreach ( $value as $k ) { $filter_type = $this->filter_types[ $k ]; if ( ! empty( $filter_type ) ) { if ( 'slider' === $filter_type ) { if ( ! empty( $_POST[ $k ] ) ) { if ( count( $_POST[ $k ] ) > 1 ) { $temp_value[ $k ] = array_map( 'intval', $_POST[ $k ] ); } else { $temp_value[ $k ] = (int) $_POST[ $k ]; } } } elseif ( 'timepicker' === $filter_type || 'datepicker' === $filter_type ) { if ( ! empty( $_POST[ $k . '_from' ] ) && ! empty( $_POST[ $k . '_to' ] ) ) { $temp_value[ $k ] = array( sanitize_text_field( $_POST[ $k . '_from' ] ), sanitize_text_field( $_POST[ $k . '_to' ] ), ); } } elseif ( 'select' === $filter_type ) { if ( ! empty( $_POST[ $k ] ) ) { if ( is_array( $_POST[ $k ] ) ) { $temp_value[ $k ] = array_map( 'trim', $_POST[ $k ] ); } else { $temp_value[ $k ] = array( trim( $_POST[ $k ] ) ); } $temp_value[ $k ] = array_map( 'sanitize_text_field', $temp_value[ $k ] ); } } else { if ( ! empty( $_POST[ $k ] ) ) { $temp_value[ $k ] = trim( sanitize_text_field( $_POST[ $k ] ) ); } } } } } $value = $temp_value; } elseif ( '_um_sorting_fields' === $key ) { if ( ! empty( $value['other_data'] ) ) { $other_data = $value['other_data']; unset( $value['other_data'] ); foreach ( $value as $k => &$row ) { if ( ! empty( $other_data[ $k ]['meta_key'] ) ) { $metakey = sanitize_text_field( $other_data[ $k ]['meta_key'] ); if ( ! empty( $metakey ) ) { if ( ! empty( $other_data[ $k ]['label'] ) ) { $metalabel = wp_strip_all_tags( $other_data[ $k ]['label'] ); } if ( ! empty( $other_data[ $k ]['data_type'] ) ) { $data_type = sanitize_text_field( $other_data[ $k ]['data_type'] ); } if ( ! empty( $other_data[ $k ]['order'] ) ) { $order = sanitize_text_field( $other_data[ $k ]['order'] ); } $row = array( $metakey => $metakey, 'label' => ! empty( $metalabel ) ? $metalabel : $metakey, 'type' => ! empty( $data_type ) ? $data_type : '', 'order' => ! empty( $order ) ? $order : '', ); } } } } } elseif ( '_um_sortby_custom' === $key ) { $value = sanitize_text_field( $value ); } elseif ( '_um_sortby_custom_label' === $key ) { $value = wp_strip_all_tags( $value ); } elseif ( '_um_sortby_custom_type' === $key ) { $value = sanitize_text_field( $value ); } elseif ( '_um_sortby_custom_order' === $key ) { $value = sanitize_text_field( $value ); } } return $value; } /** * */ function init_variables() { // Types $this->view_types = apply_filters( 'um_member_directory_views', array( 'grid' => array( 'title' => __( 'Grid', 'ultimate-member' ), 'icon' => 'um-faicon-th' ), 'list' => array( 'title' => __( 'List', 'ultimate-member' ), 'icon' => 'um-faicon-list' ), ) ); // Sort $this->sort_fields = apply_filters( 'um_members_directory_sort_fields', array( 'user_registered_desc' => __( 'New users first', 'ultimate-member' ), 'user_registered_asc' => __( 'Old users first', 'ultimate-member' ), 'username' => __( 'Username', 'ultimate-member' ), 'nickname' => __( 'Nickname', 'ultimate-member' ), 'first_name' => __( 'First name', 'ultimate-member' ), 'last_name' => __( 'Last name', 'ultimate-member' ), 'display_name' => __( 'Display name', 'ultimate-member' ), 'last_first_name' => __( 'Last & First name', 'ultimate-member' ), 'last_login' => __( 'Last login', 'ultimate-member' ), ) ); $this->sorting_supported_fields = apply_filters( 'um_members_directory_custom_field_types_supported_sorting', array( 'number' ) ); $this->sort_data_types = array( 'CHAR' => __( 'CHAR', 'ultimate-member' ), 'NUMERIC' => __( 'NUMERIC', 'ultimate-member' ), 'BINARY' => __( 'BINARY', 'ultimate-member' ), 'DATE' => __( 'DATE', 'ultimate-member' ), 'DATETIME' => __( 'DATETIME', 'ultimate-member' ), 'DECIMAL' => __( 'DECIMAL', 'ultimate-member' ), 'SIGNED' => __( 'SIGNED', 'ultimate-member' ), 'TIME' => __( 'TIME', 'ultimate-member' ), 'UNSIGNED' => __( 'UNSIGNED', 'ultimate-member' ), ); $this->sort_data_types = apply_filters( 'um_members_directory_sort_data_types', $this->sort_data_types ); if ( ! empty( UM()->builtin()->saved_fields ) ) { foreach ( UM()->builtin()->saved_fields as $key => $data ) { if ( $key == '_um_last_login' ) { continue; } if ( isset( $data['type'] ) && in_array( $data['type'], $this->sorting_supported_fields ) ) { if ( isset( $data['title'] ) && array_search( sprintf( __( '%s DESC', 'ultimate-member' ), $data['title'] ), $this->sort_fields ) !== false ) { $data['title'] = $data['title'] . ' (' . $key . ')'; } $title = isset( $data['title'] ) ? $data['title'] : ( isset( $data['label'] ) ? $data['label'] : '' ); if ( empty( $title ) ) { continue; } $this->sort_fields[ $key . '_desc' ] = sprintf( __( '%s DESC', 'ultimate-member' ), $title ); $this->sort_fields[ $key . '_asc' ] = sprintf( __( '%s ASC', 'ultimate-member' ), $title ); } } } asort( $this->sort_fields ); $this->default_sorting = apply_filters( 'um_members_directory_default_sort', array_merge( $this->sort_fields, array( 'random' => __( 'Random', 'ultimate-member' ), 'other' => __( 'Other (Custom Field)', 'ultimate-member' ), ) ) ); asort( $this->default_sorting ); // Filters $this->filter_fields = array( 'country' => __( 'Country', 'ultimate-member' ), 'gender' => __( 'Gender', 'ultimate-member' ), 'languages' => __( 'Languages', 'ultimate-member' ), 'role' => __( 'Roles', 'ultimate-member' ), 'birth_date' => __( 'Age', 'ultimate-member' ), 'last_login' => __( 'Last Login', 'ultimate-member' ), 'user_registered' => __( 'User Registered', 'ultimate-member' ), 'first_name' => __( 'First Name', 'ultimate-member' ), 'last_name' => __( 'Last Name', 'ultimate-member' ), 'nickname' => __( 'Nickname', 'ultimate-member' ), 'secondary_user_email' => __( 'Secondary E-mail Address', 'ultimate-member' ), 'description' => __( 'Biography', 'ultimate-member' ), 'phone_number' => __( 'Phone Number', 'ultimate-member' ), 'mobile_number' => __( 'Mobile Number', 'ultimate-member' ), ); $this->filter_supported_fields = apply_filters( 'um_members_directory_custom_field_types_supported_filter', array( 'date', 'time', 'select', 'multiselect', 'radio', 'checkbox', 'rating', 'text', 'textarea', 'number' ) ); if ( ! empty( UM()->builtin()->saved_fields ) ) { foreach ( UM()->builtin()->saved_fields as $key => $data ) { if ( $key == '_um_last_login' ) { continue; } if ( isset( $data['type'] ) && in_array( $data['type'], $this->filter_supported_fields ) ) { if ( isset( $data['title'] ) && array_search( $data['title'], $this->filter_fields ) !== false ) { $data['title'] = $data['title'] . ' (' . $key . ')'; } $title = isset( $data['title'] ) ? $data['title'] : ( isset( $data['label'] ) ? $data['label'] : '' ); if ( empty( $title ) ) { continue; } $this->filter_fields[ $key ] = $title; } } } $this->filter_fields = apply_filters( 'um_members_directory_filter_fields', $this->filter_fields ); ksort( $this->filter_fields ); $this->filter_types = apply_filters( 'um_members_directory_filter_types', array( 'country' => 'select', 'gender' => 'select', 'languages' => 'select', 'role' => 'select', 'birth_date' => 'slider', 'last_login' => 'datepicker', 'user_registered' => 'datepicker', 'first_name' => 'text', 'last_name' => 'text', 'nickname' => 'text', 'secondary_user_email' => 'text', 'description' => 'text', 'phone_number' => 'text', 'mobile_number' => 'text', ) ); $fields = UM()->builtin()->all_user_fields; $custom_fields_types = array_flip( array_keys( $this->filter_fields ) ); foreach ( $custom_fields_types as $key => &$value ) { if ( ! isset( $fields[ $key ] ) ) { unset( $custom_fields_types[ $key ] ); } else { switch ( $fields[ $key ]['type'] ) { default: $value = apply_filters( 'um_custom_field_filter_type', 'select', $fields[ $key ] ); break; case 'text': case 'textarea': $value = 'text'; break; case 'date': $value = 'datepicker'; break; case 'time': $value = 'timepicker'; break; case 'select': case 'multiselect': case 'radio': case 'checkbox': $value = 'select'; break; case 'number': case 'rating': $value = 'slider'; break; } } } $this->filter_types = array_merge( $custom_fields_types, $this->filter_types ); } /** * Render member's directory * filters selectboxes * * @param string $filter * @param array $directory_data * @param mixed $default_value * @param bool $admin * * @return string $filter */ function show_filter( $filter, $directory_data, $default_value = false, $admin = false ) { if ( empty( $this->filter_types[ $filter ] ) ) { return ''; } if ( $default_value === false ) { $default_filters = array(); if ( ! empty( $directory_data['search_filters'] ) ) { $default_filters = maybe_unserialize( $directory_data['search_filters'] ); } if ( ! empty( $default_filters[ $filter ] ) && $this->filter_types[ $filter ] != 'select' ) { return ''; } } $field_key = $filter; if ( $filter == 'last_login' ) { $field_key = '_um_last_login'; } if ( $filter == 'role' ) { $field_key = 'role_select'; } $fields = UM()->builtin()->all_user_fields; if ( isset( $fields[ $field_key ] ) ) { $attrs = $fields[ $field_key ]; } else { /** * UM hook * * @type filter * @title um_custom_search_field_{$filter} * @description Custom search settings by $filter * @input_vars * [{"var":"$settings","type":"array","desc":"Search Settings"}] * @change_log * ["Since: 2.0"] * @usage * * @example * */ $attrs = apply_filters( "um_custom_search_field_{$filter}", array(), $field_key ); } // skip private invisible fields if ( ! um_can_view_field( $attrs ) ) { return ''; } /** * UM hook * * @type filter * @title um_search_fields * @description Filter all search fields * @input_vars * [{"var":"$settings","type":"array","desc":"Search Fields"}] * @change_log * ["Since: 2.0"] * @usage * * @example * */ $attrs = apply_filters( 'um_search_fields', $attrs, $field_key, $directory_data['form_id'] ); $unique_hash = substr( md5( $directory_data['form_id'] ), 10, 5 ); ob_start(); switch ( $this->filter_types[ $filter ] ) { default: { do_action( "um_member_directory_filter_type_{$this->filter_types[ $filter ]}", $filter, $directory_data, $unique_hash, $attrs, $default_value ); break; } case 'text': { $label = ''; if ( isset( $attrs['label'] ) ) { $label = $attrs['label']; } elseif ( ! isset( $attrs['label'] ) && isset( $attrs['title'] ) ) { $label = $attrs['title']; } $filter_from_url = ! empty( $_GET[ 'filter_' . $filter . '_' . $unique_hash ] ) ? sanitize_text_field( $_GET[ 'filter_' . $filter . '_' . $unique_hash ] ) : $default_value; ?> get_col( $wpdb->prepare( "SELECT DISTINCT meta_value FROM $wpdb->usermeta WHERE meta_key = %s AND meta_value != ''", $attrs['metakey'] ) ); } else { $users_roles = count_users(); $values_array = ( ! empty( $users_roles['avail_roles'] ) && is_array( $users_roles['avail_roles'] ) ) ? array_keys( array_filter( $users_roles['avail_roles'] ) ) : array(); } if ( ! empty( $values_array ) && in_array( $attrs['type'], array( 'select', 'multiselect', 'checkbox', 'radio' ) ) ) { $values_array = array_map( 'maybe_unserialize', $values_array ); $temp_values = array(); foreach ( $values_array as $values ) { if ( is_array( $values ) ) { $temp_values = array_merge( $temp_values, $values ); } else { $temp_values[] = $values; } } $values_array = array_unique( $temp_values ); } if ( $attrs['metakey'] != 'online_status' && empty( $values_array ) ) { ob_get_clean(); return ''; } if ( isset( $attrs['metakey'] ) && strstr( $attrs['metakey'], 'role_' ) ) { $shortcode_roles = get_post_meta( $directory_data['form_id'], '_um_roles', true ); $um_roles = UM()->roles()->get_roles( false ); if ( ! empty( $shortcode_roles ) && is_array( $shortcode_roles ) ) { $attrs['options'] = array(); foreach ( $um_roles as $key => $value ) { if ( in_array( $key, $shortcode_roles ) ) { $attrs['options'][ $key ] = $value; } } } else { $attrs['options'] = array(); foreach ( $um_roles as $key => $value ) { $attrs['options'][ $key ] = $value; } } } $custom_dropdown = ''; if ( ! empty( $attrs['custom_dropdown_options_source'] ) ) { $attrs['custom'] = true; if ( ! empty( $attrs['parent_dropdown_relationship'] ) ) { $custom_dropdown .= ' data-member-directory="yes"'; $custom_dropdown .= ' data-um-parent="' . esc_attr( $attrs['parent_dropdown_relationship'] ) . '"'; if ( isset( $_GET[ 'filter_' . $attrs['parent_dropdown_relationship'] . '_' . $unique_hash ] ) ) { $_POST['parent_option_name'] = $attrs['parent_dropdown_relationship']; $parent_option_value = sanitize_text_field( $_GET[ 'filter_' . $attrs['parent_dropdown_relationship'] . '_' . $unique_hash ] ); $_POST['parent_option'] = explode( '||', $parent_option_value ); } } $attrs['custom_dropdown_options_source'] = wp_unslash( $attrs['custom_dropdown_options_source'] ); $ajax_source = apply_filters( "um_custom_dropdown_options_source__{$filter}", $attrs['custom_dropdown_options_source'], $attrs ); $custom_dropdown .= ' data-um-ajax-source="' . esc_attr( $ajax_source ) . '" '; $attrs['options'] = UM()->fields()->get_options_from_callback( $attrs, $attrs['type'] ); } else { /** * UM hook * * @type filter * @title um_select_option_value * @description Enable options pair by field $data * @input_vars * [{"var":"$options_pair","type":"null","desc":"Enable pairs"}, * {"var":"$data","type":"array","desc":"Field Data"}] */ $option_pairs = apply_filters( 'um_select_options_pair', null, $attrs ); } if ( $attrs['metakey'] != 'online_status' ) { if ( $attrs['metakey'] != 'role_select' && $attrs['metakey'] != 'mycred_rank' && empty( $custom_dropdown ) && empty( $option_pairs ) ) { $attrs['options'] = array_intersect( array_map( 'stripslashes', array_map( 'trim', $attrs['options'] ) ), $values_array ); } elseif ( ! empty( $custom_dropdown ) ) { $attrs['options'] = array_intersect_key( array_map( 'trim', $attrs['options'] ), array_flip( $values_array ) ); } else { $attrs['options'] = array_intersect_key( array_map( 'trim', $attrs['options'] ), array_flip( $values_array ) ); } } $attrs['options'] = apply_filters( 'um_member_directory_filter_select_options', $attrs['options'], $values_array, $attrs ); if ( empty( $attrs['options'] ) || ! is_array( $attrs['options'] ) ) { ob_get_clean(); return ''; } if ( ! empty( $attrs['custom_dropdown_options_source'] ) && ! empty( $attrs['parent_dropdown_relationship'] ) ) { $attrs['options'] = array(); } if ( isset( $attrs['label'] ) ) { $attrs['label'] = strip_tags( $attrs['label'] ); } if ( ! empty( $default_filters[ $filter ] ) ) { $attrs['options'] = array_intersect( $attrs['options'], $default_filters[ $filter ] ); } ksort( $attrs['options'] ); $attrs['options'] = apply_filters( 'um_member_directory_filter_select_options_sorted', $attrs['options'], $attrs ); $label = ''; if ( isset( $attrs['label'] ) ) { $label = $attrs['label']; } elseif ( ! isset( $attrs['label'] ) && isset( $attrs['title'] ) ) { $label = $attrs['title']; } ?> slider_filters_range( $filter, $directory_data ); if ( $range ) { list( $single_placeholder, $plural_placeholder ) = $this->slider_range_placeholder( $filter, $attrs ); ?>
datepicker_filters_range( $filter ); $label = ! empty( $attrs['label'] ) ? $attrs['label'] : $attrs['title']; if ( $range ) { ?> timepicker_filters_range( $filter ); $label = ! empty( $attrs['label'] ) ? $attrs['label'] : $attrs['title']; switch ( $attrs['format'] ) { case 'g:i a': $js_format = 'h:i a'; break; case 'g:i A': $js_format = 'h:i A'; break; case 'H:i': $js_format = 'HH:i'; break; } if ( $range ) { ?> get_row( $wpdb->prepare( "SELECT MIN( CONVERT( meta_value, DECIMAL ) ) as min_meta, MAX( CONVERT( meta_value, DECIMAL ) ) as max_meta, COUNT( DISTINCT meta_value ) as amount FROM {$wpdb->usermeta} WHERE meta_key = %s", $filter ), ARRAY_A ); if ( isset( $meta['min_meta'] ) && isset( $meta['max_meta'] ) && isset( $meta['amount'] ) && $meta['amount'] > 1 ) { $range = array( (float) $meta['min_meta'], (float) $meta['max_meta'] ); } $range = apply_filters( 'um_member_directory_filter_slider_common', $range, $directory_data, $filter ); $range = apply_filters( "um_member_directory_filter_{$filter}_slider", $range, $directory_data ); break; } case 'birth_date': { // $meta = $wpdb->get_col( // "SELECT meta_value // FROM {$wpdb->usermeta} // WHERE meta_key = 'birth_date' AND // meta_value != ''" // ); // // if ( empty( $meta ) || count( $meta ) < 2 ) { // $range = false; // } elseif ( is_array( $meta ) ) { // $birth_dates = array_filter( array_map( 'strtotime', $meta ), 'is_numeric' ); // sort( $birth_dates ); // $min_meta = array_shift( $birth_dates ); // $max_meta = array_pop( $birth_dates ); // $range = array( $this->borndate( $max_meta ), $this->borndate( $min_meta ) ); // } $meta = $wpdb->get_row( "SELECT MIN( meta_value ) as min_meta, MAX( meta_value ) as max_meta, COUNT( DISTINCT meta_value ) as amount FROM {$wpdb->usermeta} WHERE meta_key = 'birth_date' AND meta_value != ''", ARRAY_A ); if ( isset( $meta['min_meta'] ) && isset( $meta['max_meta'] ) && isset( $meta['amount'] ) && $meta['amount'] > 1 ) { $range = array( $this->borndate( strtotime( $meta['max_meta'] ) ), $this->borndate( strtotime( $meta['min_meta'] ) ) ); } break; } } return $range; } /** * @param $filter * * @return mixed */ function slider_range_placeholder( $filter, $attrs ) { switch ( $filter ) { default: { $label = ! empty( $attrs['label'] ) ? $attrs['label'] : $filter; $label = ucwords( str_replace( array( 'um_', '_' ), array( '', ' ' ), $label ) ); $placeholders = apply_filters( 'um_member_directory_filter_slider_range_placeholder', false, $filter ); if ( ! $placeholders ) { switch ( $attrs['type'] ) { default: $placeholders = array( "$label: {value}", "$label: {min_range} - {max_range}", ); break; case 'rating': $placeholders = array( "$label: {value}" . __( ' stars', 'ultimate-member' ), "$label: {min_range} - {max_range}" . __( ' stars', 'ultimate-member' ) ); break; } } break; } case 'birth_date': { $placeholders = array( __( 'Age: {value} years old', 'ultimate-member' ), __( 'Age: {min_range} - {max_range} years old', 'ultimate-member' ) ); break; } } return $placeholders; } /** * @param $filter * * @return mixed */ function datepicker_filters_range( $filter ) { global $wpdb; switch ( $filter ) { default: { global $wpdb; $meta = $wpdb->get_col( $wpdb->prepare( "SELECT DISTINCT meta_value FROM {$wpdb->usermeta} WHERE meta_key = %s ORDER BY meta_value DESC", $filter ) ); if ( empty( $meta ) || count( $meta ) === 1 ) { $range = false; } elseif ( ! empty( $meta ) ) { $range = array( strtotime( min( $meta ) ), strtotime( max( $meta ) ) ); } $range = apply_filters( "um_member_directory_filter_{$filter}_datepicker", $range ); break; } case 'last_login': { $meta = $wpdb->get_col( "SELECT DISTINCT meta_value FROM {$wpdb->usermeta} WHERE meta_key='_um_last_login' ORDER BY meta_value DESC" ); if ( empty( $meta ) || count( $meta ) === 1 ) { $range = false; } elseif ( ! empty( $meta ) ) { $range = array( min( $meta ), max( $meta ) ); } break; } case 'user_registered': { $meta = $wpdb->get_col( "SELECT DISTINCT user_registered FROM {$wpdb->users} ORDER BY user_registered DESC" ); if ( empty( $meta ) || count( $meta ) === 1 ) { $range = false; } elseif ( ! empty( $meta ) ) { $range = array( strtotime( min( $meta ) ), strtotime( max( $meta ) ) ); } break; } } return $range; } /** * @param $filter * * @return mixed */ function timepicker_filters_range( $filter ) { switch ( $filter ) { default: { global $wpdb; $meta = $wpdb->get_col( $wpdb->prepare( "SELECT DISTINCT meta_value FROM {$wpdb->usermeta} WHERE meta_key = %s ORDER BY meta_value DESC", $filter ) ); $meta = array_filter( $meta ); if ( empty( $meta ) || count( $meta ) === 1 ) { $range = false; } elseif ( ! empty( $meta ) ) { $range = array( min( $meta ), max( $meta ) ); } $range = apply_filters( "um_member_directory_filter_{$filter}_timepicker", $range ); break; } } return $range; } /** * @param $borndate * * @return false|string */ function borndate( $borndate ) { if ( date('m', $borndate) > date('m') || date('m', $borndate) == date('m') && date('d', $borndate ) > date('d')) { return (date('Y') - date('Y', $borndate ) - 1); } return (date('Y') - date('Y', $borndate)); } /** * Handle members can view restrictions */ function restriction_options() { $this->hide_not_approved(); $this->hide_by_role(); $this->hide_by_account_settings(); do_action( 'um_member_directory_restrictions_handle_extend' ); } /** * */ function hide_not_approved() { if ( UM()->roles()->um_user_can( 'can_edit_everyone' ) ) { return; } $this->query_args['meta_query'] = array_merge( $this->query_args['meta_query'], array( array( 'key' => 'um_member_directory_data', 'value' => 's:14:"account_status";s:8:"approved";', 'compare' => 'LIKE' ) ) ); } /** * */ function hide_by_role() { if ( ! is_user_logged_in() ) { return; } $roles = um_user( 'can_view_roles' ); $roles = maybe_unserialize( $roles ); if ( UM()->roles()->um_user_can( 'can_view_all' ) && empty( $roles ) ) { return; } if ( ! empty( $this->query_args['role__in'] ) ) { $this->query_args['role__in'] = is_array( $this->query_args['role__in'] ) ? $this->query_args['role__in'] : array( $this->query_args['role__in'] ); $this->query_args['role__in'] = array_intersect( $this->query_args['role__in'], $roles ); } else { $this->query_args['role__in'] = $roles; } } /** * */ function hide_by_account_settings() { if ( ! UM()->options()->get( 'account_hide_in_directory' ) ) { return; } if ( UM()->roles()->um_user_can( 'can_edit_everyone' ) ) { return; } $this->query_args['meta_query'] = array_merge( $this->query_args['meta_query'], array( array( 'key' => 'um_member_directory_data', 'value' => 's:15:"hide_in_members";b:0;', 'compare' => 'LIKE' ) ) ); } /** * Handle "General Options" metabox settings * * @param array $directory_data */ function general_options( $directory_data ) { $this->show_selected_roles( $directory_data ); $this->show_only_with_avatar( $directory_data ); $this->show_only_with_cover( $directory_data ); $this->show_only_these_users( $directory_data ); $this->exclude_these_users( $directory_data ); do_action( 'um_member_directory_general_options_handle_extend', $directory_data ); } /** * Handle "User Roles to Display" option * * @param array $directory_data */ function show_selected_roles( $directory_data ) { // add roles to appear in directory if ( ! empty( $directory_data['roles'] ) ) { //since WP4.4 use 'role__in' argument if ( ! empty( $this->query_args['role__in'] ) ) { $this->query_args['role__in'] = is_array( $this->query_args['role__in'] ) ? $this->query_args['role__in'] : array( $this->query_args['role__in'] ); $this->query_args['role__in'] = array_intersect( $this->query_args['role__in'], maybe_unserialize( $directory_data['roles'] ) ); } else { $this->query_args['role__in'] = maybe_unserialize( $directory_data['roles'] ); } } } /** * Handle "Only show members who have uploaded a profile photo" option * * @param array $directory_data */ function show_only_with_avatar( $directory_data ) { if ( $directory_data['has_profile_photo'] == 1 ) { $this->query_args['meta_query'] = array_merge( $this->query_args['meta_query'], array( array( 'key' => 'um_member_directory_data', 'value' => 's:13:"profile_photo";b:1;', 'compare' => 'LIKE' ) ) ); } } /** * Handle "Only show members who have uploaded a cover photo" option * * @param array $directory_data */ function show_only_with_cover( $directory_data ) { if ( $directory_data['has_cover_photo'] == 1 ) { $this->query_args['meta_query'] = array_merge( $this->query_args['meta_query'], array( array( 'key' => 'um_member_directory_data', 'value' => 's:11:"cover_photo";b:1;', 'compare' => 'LIKE' ) ) ); } } /** * Handle "Only show specific users (Enter one username per line)" option * * @param array $directory_data */ function show_only_these_users( $directory_data ) { if ( ! empty( $directory_data['show_these_users'] ) ) { $show_these_users = maybe_unserialize( $directory_data['show_these_users'] ); if ( is_array( $show_these_users ) && ! empty( $show_these_users ) ) { $users_array = array(); foreach ( $show_these_users as $username ) { if ( false !== ( $exists_id = username_exists( $username ) ) ) { $users_array[] = $exists_id; } } if ( ! empty( $users_array ) ) { $this->query_args['include'] = $users_array; } } } } /** * Handle "Exclude specific users (Enter one username per line)" option * * @param array $directory_data */ function exclude_these_users( $directory_data ) { if ( ! empty( $directory_data['exclude_these_users'] ) ) { $exclude_these_users = maybe_unserialize( $directory_data['exclude_these_users'] ); if ( is_array( $exclude_these_users ) && ! empty( $exclude_these_users ) ) { $users_array = array(); foreach ( $exclude_these_users as $username ) { if ( false !== ( $exists_id = username_exists( $username ) ) ) { $users_array[] = $exists_id; } } if ( ! empty( $users_array ) ) { $this->query_args['exclude'] = $users_array; } } } } /** * Handle "Pagination Options" metabox settings * * @param array $directory_data */ function pagination_options( $directory_data ) { // number of profiles for mobile $profiles_per_page = $directory_data['profiles_per_page']; if ( UM()->mobile()->isMobile() && isset( $directory_data['profiles_per_page_mobile'] ) ) { $profiles_per_page = $directory_data['profiles_per_page_mobile']; } $this->query_args['number'] = ( ! empty( $directory_data['max_users'] ) && $directory_data['max_users'] <= $profiles_per_page ) ? $directory_data['max_users'] : $profiles_per_page; $this->query_args['paged'] = ! empty( $_POST['page'] ) ? absint( $_POST['page'] ) : 1; } /** * Add sorting attributes for \WP_Users_Query * * @param array $directory_data Member Directory options */ function sorting_query( $directory_data ) { // sort members by $this->query_args['order'] = 'ASC'; $sortby = ! empty( $_POST['sorting'] ) ? sanitize_text_field( $_POST['sorting'] ) : $directory_data['sortby']; $sortby = ( $sortby == 'other' ) ? $directory_data['sortby_custom'] : $sortby; $custom_sort = array(); if ( ! empty( $directory_data['sorting_fields'] ) ) { $sorting_fields = maybe_unserialize( $directory_data['sorting_fields'] ); foreach ( $sorting_fields as $field ) { if ( is_array( $field ) ) { $field_keys = array_keys( $field ); $custom_sort[] = $field_keys[0]; } } } $numeric_sorting_keys = array(); if ( ! empty( UM()->builtin()->saved_fields ) ) { foreach ( UM()->builtin()->saved_fields as $key => $data ) { if ( $key == '_um_last_login' ) { continue; } if ( isset( $data['type'] ) && 'number' === $data['type'] ) { if ( array_key_exists( $key . '_desc', $this->sort_fields ) ) { $numeric_sorting_keys[] = $key . '_desc'; } if ( array_key_exists( $key . '_asc', $this->sort_fields ) ) { $numeric_sorting_keys[] = $key . '_asc'; } } } } if ( 'username' == $sortby ) { $this->query_args['orderby'] = 'user_login'; $this->query_args['order'] = 'ASC'; } elseif ( 'display_name' == $sortby ) { $display_name = UM()->options()->get( 'display_name' ); if ( $display_name == 'username' ) { $this->query_args['orderby'] = 'user_login'; $this->query_args['order'] = 'ASC'; } else { $this->query_args['meta_query'][] = array( 'relation' => 'OR', 'full_name' => array( 'key' => 'full_name', 'compare' => 'EXISTS' ), array( 'key' => 'full_name', 'compare' => 'NOT EXISTS' ) ); $this->query_args['orderby'] = 'full_name, display_name'; $this->query_args['order'] = 'ASC'; } } elseif ( in_array( $sortby, array( 'last_name', 'first_name', 'nickname' ) ) ) { $this->query_args['meta_query'] = array_merge( $this->query_args['meta_query'], array( $sortby . '_c' => array( 'key' => $sortby, 'compare' => 'EXISTS', ), ) ); $this->query_args['orderby'] = array( $sortby . '_c' => 'ASC' ); unset( $this->query_args['order'] ); } elseif ( $sortby == 'last_login' ) { $this->query_args['orderby'] = array( 'um_last_login' => 'DESC' ); $this->query_args['meta_query'][] = array( 'relation' => 'OR', array( 'key' => '_um_last_login', 'compare' => 'EXISTS', ), 'um_last_login' => array( 'key' => '_um_last_login', 'compare' => 'NOT EXISTS', ), ); unset( $this->query_args['order'] ); } elseif ( $sortby == 'last_first_name' ) { $this->query_args['meta_query'][] = array( 'last_name_c' => array( 'key' => 'last_name', 'compare' => 'EXISTS', ), 'first_name_c' => array( 'key' => 'first_name', 'compare' => 'EXISTS', ), ); $this->query_args['orderby'] = array( 'last_name_c' => 'ASC', 'first_name_c' => 'ASC' ); unset( $this->query_args['order'] ); } elseif ( count( $numeric_sorting_keys ) && in_array( $sortby, $numeric_sorting_keys ) ) { $order = 'DESC'; if ( strstr( $sortby, '_desc' ) ) { $sortby = str_replace( '_desc', '', $sortby ); $order = 'DESC'; } if ( strstr( $sortby, '_asc' ) ) { $sortby = str_replace( '_asc', '', $sortby ); $order = 'ASC'; } $this->query_args['meta_query'] = array_merge( $this->query_args['meta_query'], array( array( 'relation' => 'OR', array( 'key' => $sortby, 'compare' => 'EXISTS', 'type' => 'NUMERIC', ), $sortby . '_ns' => array( 'key' => $sortby, 'compare' => 'NOT EXISTS', 'type' => 'NUMERIC', ), ), ) ); $this->query_args['orderby'] = array( $sortby . '_ns' => $order, 'user_registered' => 'DESC' ); unset( $this->query_args['order'] ); } elseif ( ( ! empty( $directory_data['sortby_custom'] ) && $sortby == $directory_data['sortby_custom'] ) || in_array( $sortby, $custom_sort ) ) { $custom_sort_order = ! empty( $directory_data['sortby_custom_order'] ) ? $directory_data['sortby_custom_order'] : 'ASC'; $meta_query = new \WP_Meta_Query(); $custom_sort_type = ! empty( $directory_data['sortby_custom_type'] ) ? $meta_query->get_cast_for_type( $directory_data['sortby_custom_type'] ) : 'CHAR'; if ( ! empty( $directory_data['sorting_fields'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification -- already verified here $sorting = sanitize_text_field( $_POST['sorting'] ); $sorting_fields = maybe_serialize( $directory_data['sorting_fields'] ); foreach ( $sorting_fields as $field ) { if ( isset( $field[ $sorting ] ) ) { $custom_sort_type = ! empty( $field['type'] ) ? $meta_query->get_cast_for_type( $field['type'] ) : 'CHAR'; $custom_sort_order = $field['order']; } } } /** * Filters the sorting MySQL type in member directory custom sorting query. * * Note: Possible MySQL types are BINARY|CHAR|DATE|DATETIME|SIGNED|UNSIGNED|TIME|DECIMAL * * @since 2.1.3 * @hook um_member_directory_custom_sorting_type * * @param {string} $custom_sort_type MySQL type to cast meta_value. 'CHAR' is default. * @param {string} $sortby meta_key used for sorting. * @param {array} $directory_data Member directory data. * * @return {string} MySQL type to cast meta_value. * @example