diff --git a/assets/css/um-members.css b/assets/css/um-members.css
index 0fc1fdd9..09e4366d 100644
--- a/assets/css/um-members.css
+++ b/assets/css/um-members.css
@@ -372,8 +372,7 @@ a.um-edit-profile-btn {
font-size: 13px;
}
-.um-member a.um-follow-btn:before {content: "\f234"}
-.um-member a.um-unfollow-btn:before {content: "\f235"}
+
.um-member a.um-friend-btn:before {content: "\f234"}
.um-member a.um-unfriend-btn:before {content: "\f235"}
@@ -543,7 +542,7 @@ a.um-edit-profile-btn {
.um-members-list .um-member {
width:100% !important;
- padding: 15px 0;
+ padding: 15px 10px;
margin-bottom: 20px;
box-sizing: border-box;
}
diff --git a/assets/js/um-members.js b/assets/js/um-members.js
index 109cdb2f..abd74176 100644
--- a/assets/js/um-members.js
+++ b/assets/js/um-members.js
@@ -149,24 +149,25 @@ function um_ajax_get_members( directory, args ) {
* 1) Page - getting from directory data 'page'
* 2) Sort - getting from 'um-member-directory-sorting-options' field value
* 3) Search - getting from 'um-search-line' field value
- * 4) Filters - ?????
+ * 4) Filters - getting from URL data by 'um_get_data_for_directory' function
*
*/
var hash = um_members_get_hash( directory );
- var search = um_get_search( directory );
var page = um_get_current_page( directory );
+ var search = um_get_search( directory );
var sorting = um_get_sort( directory );
var local_date = new Date();
- var gmt_hours = -local_date.getTimezoneOffset()/60;
+ var gmt_hours = -local_date.getTimezoneOffset() / 60;
var request = {
directory_id: hash,
page: page,
search: search,
sorting: sorting,
+ gmt_offset: gmt_hours,
nonce: um_scripts.nonce
};
@@ -179,21 +180,21 @@ function um_ajax_get_members( directory, args ) {
var value_from = um_get_data_for_directory( directory, 'filter_' + filter_name + '_from' );
var value_to = um_get_data_for_directory( directory, 'filter_' + filter_name + '_to' );
- if ( typeof value != 'undefined' ) {
+ if ( typeof value_from != 'undefined' || typeof value_to != 'undefined' ) {
request[ filter_name ] = [ value_from, value_to ];
}
} else if ( filter.find( '.um-datepicker-filter' ).length ) {
var filter_name = filter.find( '.um-datepicker-filter' ).data('filter_name');
var value_from = um_get_data_for_directory( directory, 'filter_' + filter_name + '_from' );
var value_to = um_get_data_for_directory( directory, 'filter_' + filter_name + '_to' );
- if ( typeof value != 'undefined' ) {
+ if ( typeof value_from != 'undefined' || typeof value_to != 'undefined') {
request[ filter_name ] = [ value_from, value_to ];
}
} else if ( filter.find( '.um-timepicker-filter' ).length ) {
var filter_name = filter.find( '.um-timepicker-filter' ).data('filter_name');
var value_from = um_get_data_for_directory( directory, 'filter_' + filter_name + '_from' );
var value_to = um_get_data_for_directory( directory, 'filter_' + filter_name + '_to' );
- if ( typeof value != 'undefined' ) {
+ if ( typeof value_from != 'undefined' || typeof value_to != 'undefined' ) {
request[ filter_name ] = [ value_from, value_to ];
}
} else {
@@ -212,7 +213,7 @@ function um_ajax_get_members( directory, args ) {
//set last data hard for using on layouts reloading
um_member_directory_last_data[ hash ] = answer;
- um_build_template( directory, answer );
+ um_build_template( directory, answer.users );
um_members_hide_preloader( directory );
@@ -225,6 +226,8 @@ function um_ajax_get_members( directory, args ) {
},
error: function( data ) {
console.log( data );
+
+ um_members_hide_preloader( directory );
}
});
}
@@ -506,7 +509,7 @@ jQuery(document).ready( function() {
um_set_url_from_data( directory, 'view_type', layout );
directory.data( 'view_type', layout );
- um_build_template( directory, data );
+ um_build_template( directory, data.users );
}
});
@@ -972,8 +975,6 @@ jQuery(document).ready( function() {
}
}
- $input.clear();
-
um_set_url_from_data( directory, 'filter_' + filter_name + '_from', current_value_from );
um_set_url_from_data( directory, 'filter_' + filter_name + '_to', current_value_to );
diff --git a/includes/class-init.php b/includes/class-init.php
index c3b13985..c1076320 100644
--- a/includes/class-init.php
+++ b/includes/class-init.php
@@ -543,7 +543,7 @@ if ( ! class_exists( 'UM' ) ) {
$this->register();
$this->user_posts();
$this->access();
- $this->members();
+ //$this->members();
$this->logout();
}
@@ -1336,11 +1336,15 @@ if ( ! class_exists( 'UM' ) ) {
/**
+ * @deprecated 2.1.0
+ *
* @since 2.0
*
* @return um\core\Members
*/
function members() {
+ um_deprecated_function( 'UM()->members()', '2.1.0', 'UM()->member_directory()' );
+
if ( empty( $this->classes['members'] ) ) {
$this->classes['members'] = new um\core\Members();
}
@@ -1463,7 +1467,9 @@ if ( ! class_exists( 'UM' ) ) {
require_once 'core/um-filters-navmenu.php';
require_once 'core/um-filters-avatars.php';
require_once 'core/um-filters-user.php';
- require_once 'core/um-filters-members.php';
+
+ //require_once 'core/um-filters-members.php';
+
require_once 'core/um-filters-profile.php';
require_once 'core/um-filters-account.php';
require_once 'core/um-filters-misc.php';
diff --git a/includes/core/class-member-directory.php b/includes/core/class-member-directory.php
index ba604328..47b235bb 100644
--- a/includes/core/class-member-directory.php
+++ b/includes/core/class-member-directory.php
@@ -46,10 +46,19 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) {
var $filter_types = array(
- 'select',
- 'slider',
- 'datepicker',
- 'timepicker',
+// 'select',
+// 'slider',
+// 'datepicker',
+// 'timepicker',
+ );
+
+
+ var $core_search_fields = array(
+ 'user_login',
+ 'user_url',
+ 'display_name',
+ 'user_email',
+ 'user_nicename',
);
@@ -59,12 +68,95 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) {
var $query_args;
+ /**
+ * @var User Card cover size
+ */
+ var $cover_size;
+
+
+ /**
+ * @var User Avatar size
+ */
+ var $avatar_size;
+
+
/**
* Member_Directory constructor.
*/
function __construct() {
add_filter( 'plugins_loaded', array( &$this, 'init_variables' ), 99999 );
+ add_filter( 'init', array( &$this, 'init_filter_types' ), 2 );
add_filter( 'um_member_directory_meta_value_before_save', array( &$this, 'before_save_data' ), 10, 3 );
+
+ add_action( 'template_redirect', array( &$this, 'access_members' ), 555 );
+ }
+
+
+ /**
+ * 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;
+ }
+
+
+ /**
+ * 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();
+ }
}
@@ -185,10 +277,10 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) {
foreach ( UM()->builtin()->saved_fields as $key => $data ) {
if ( isset( $data['type'] ) && in_array( $data['type'], $this->filter_supported_fields ) ) {
- if ( array_search( $data['title'], $this->filter_fields ) !== false ) {
+ if ( isset( $data['title'] ) && array_search( $data['title'], $this->filter_fields ) !== false ) {
$data['title'] = $data['title'] . ' (' . $key . ')';
}
- $this->filter_fields[ $key ] = $data['title'];
+ $this->filter_fields[ $key ] = isset( $data['title'] ) ? $data['title'] : $data['label'];
}
}
@@ -198,16 +290,8 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) {
}
- /**
- * Render member's directory
- * filters selectboxes
- *
- * @param string $filter
- * @return string $filter
- */
- function show_filter( $filter ) {
-
- $filter_types = apply_filters( 'um_members_directory_filter_types', array(
+ function init_filter_types() {
+ $this->filter_types = apply_filters( 'um_members_directory_filter_types', array(
'country' => 'select',
'gender' => 'select',
'languages' => 'select',
@@ -217,14 +301,6 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) {
'user_registered' => 'datepicker',
) );
- $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;
$custom_fields_types = array_flip( array_keys( $this->filter_fields ) );
@@ -255,12 +331,33 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) {
}
}
- $filter_types = array_merge( $custom_fields_types, $filter_types );
+ $this->filter_types = array_merge( $custom_fields_types, $this->filter_types );
+ }
- if ( empty( $filter_types[ $filter ] ) ) {
+
+ /**
+ * Render member's directory
+ * filters selectboxes
+ *
+ * @param string $filter
+ * @return string $filter
+ */
+ function show_filter( $filter ) {
+
+ if ( empty( $this->filter_types[ $filter ] ) ) {
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 {
@@ -312,10 +409,10 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) {
$attrs = apply_filters( 'um_search_fields', $attrs );
ob_start();
- switch ( $filter_types[ $filter ] ) {
+ switch ( $this->filter_types[ $filter ] ) {
default: {
- do_action( "um_member_directory_filter_type_{$filter_types[ $filter ]}", $filter, $filter_types );
+ do_action( "um_member_directory_filter_type_{$this->filter_types[ $filter ]}", $filter, $this->filter_types );
break;
}
@@ -654,52 +751,14 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) {
/**
- * Must have a profile photo
- *
- * @param $args
+ * Handle members can view restrictions
*/
- function profile_photo_query( $args ) {
- if ( $args['has_profile_photo'] == 1 ) {
- $meta_query = array(
- 'relation' => 'OR',
- array(
- 'key' => 'synced_profile_photo', // addons
- 'value' => '',
- 'compare' => '!='
- ),
- array(
- 'key' => 'profile_photo', // from upload form
- 'value' => '',
- 'compare' => '!='
- )
- );
+ function restriction_options() {
+ $this->hide_not_approved();
+ $this->hide_by_role();
+ $this->hide_by_account_settings();
- if ( UM()->options()->get( 'use_gravatars' ) ) {
- $meta_query[] = array(
- 'key' => 'synced_gravatar_hashed_id', // gravatar
- 'value' => '',
- 'compare' => '!='
- );
- }
-
- $this->query_args['meta_query'] = array_merge( $this->query_args['meta_query'], array( $meta_query ) );
- }
- }
-
-
- /**
- * Must have a cover photo
- *
- * @param $args
- */
- function cover_photo_query( $args ) {
- if ( $args['has_cover_photo'] == 1 ) {
- $this->query_args['meta_query'] = array_merge( $this->query_args['meta_query'], array( array(
- 'key' => 'cover_photo',
- 'value' => '',
- 'compare' => '!='
- ) ) );
- }
+ do_action( 'um_member_directory_restrictions_handle_extend' );
}
@@ -778,16 +837,136 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) {
/**
- * @param $args
+ * Handle "General Options" metabox settings
+ *
+ * @param array $directory_data
*/
- function sorting_query( $args ) {
+ 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 );
+
+ 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
+ $this->query_args['role__in'] = $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 ) {
+ $meta_query = array(
+ 'relation' => 'OR',
+ array(
+ 'key' => 'synced_profile_photo', // addons
+ 'value' => '',
+ 'compare' => '!='
+ ),
+ array(
+ 'key' => 'profile_photo', // from upload form
+ 'value' => '',
+ 'compare' => '!='
+ )
+ );
+
+ if ( UM()->options()->get( 'use_gravatars' ) ) {
+ $meta_query[] = array(
+ 'key' => 'synced_gravatar_hashed_id', // gravatar
+ 'value' => '',
+ 'compare' => '!='
+ );
+ }
+
+ $this->query_args['meta_query'] = array_merge( $this->query_args['meta_query'], array( $meta_query ) );
+ }
+ }
+
+
+ /**
+ * 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' => 'cover_photo',
+ 'value' => '',
+ 'compare' => '!='
+ ) ) );
+ }
+ }
+
+
+ /**
+ * 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'] ) && is_array( $directory_data['show_these_users'] ) ) {
+ $users_array = array();
+
+ foreach ( $directory_data['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 "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'] ) ? $_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'] ) ? $_POST['sorting'] : $args['sortby'];
+ $sortby = ! empty( $_POST['sorting'] ) ? $_POST['sorting'] : $directory_data['sortby'];
- if ( $sortby == 'other' && $args['sortby_custom'] ) {
+ if ( $sortby == 'other' && $directory_data['sortby_custom'] ) {
- $this->query_args['meta_key'] = $args['sortby_custom'];
+ $this->query_args['meta_key'] = $directory_data['sortby_custom'];
$this->query_args['orderby'] = 'meta_value, display_name';
} elseif ( 'display_name' == $sortby ) {
@@ -927,34 +1106,39 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) {
}
+
+ /**
+ * Handle general search line request
+ */
function general_search() {
//general search
if ( ! empty( $_POST['search'] ) ) {
- $this->query_args['meta_query'][] = array(
+ // complex using with change_meta_sql function
+
+ $meta_query = array(
+ 'relation' => 'OR',
array(
- 'key' => 'first_name',
'value' => trim( $_POST['search'] ),
'compare' => '=',
),
array(
- 'key' => 'first_name',
'value' => trim( $_POST['search'] ),
'compare' => 'LIKE',
),
array(
- 'key' => 'first_name',
'value' => trim( serialize( strval( $_POST['search'] ) ) ),
'compare' => 'LIKE',
),
- 'relation' => 'OR',
);
+
+ $this->query_args['meta_query'][] = $meta_query;
}
}
/**
* Change mySQL meta query join attribute
- * for search only by UM user meta fields
+ * for search only by UM user meta fields and WP core fields in WP Users table
*
* @param array $sql Array containing the query's JOIN and WHERE clauses.
* @param $queries
@@ -968,12 +1152,22 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) {
function change_meta_sql( $sql, $queries, $type, $primary_table, $primary_id_column, $context ) {
if ( ! empty( $_POST['search'] ) ) {
global $wpdb;
-
$search = trim( $_POST['search'] );
if ( ! empty( $search ) ) {
+ $identity = '%';
preg_match(
- '/^(.*).meta_value LIKE \'%' . esc_attr( $search ) . '%\' [^\)]/im',
+ '/LIKE \'(\{(.*)\})' . esc_attr( $search ) . '(\{(.*)\})\'/im',
+ $sql['where'],
+ $matches
+ );
+
+ if ( ! empty( $matches[1] ) ) {
+ $identity = $matches[1];
+ }
+
+ preg_match(
+ '/^(.*).meta_value LIKE \'' . $identity . esc_attr( $search ) . $identity . '\' [^\)]/im',
$sql['where'],
$join_matches
);
@@ -989,7 +1183,7 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) {
}
// Add OR instead AND to search in WP core fields user_email, user_login, user_display_name
- $search_where = $context->get_search_sql( $search, UM()->members()->core_search_fields, 'both' );
+ $search_where = $context->get_search_sql( $search, UM()->member_directory()->core_search_fields, 'both' );
$search_where = preg_replace( '/ AND \((.*?)\)/im', " OR $1", $search_where );
$sql['where'] = $sql['where'] . $search_where;
@@ -1001,13 +1195,13 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) {
/**
- *
+ * Handle filters request
*/
- function filters( $args ) {
+ function filters( $directory_data ) {
//filters
$filter_query = array();
- if ( ! empty( $args['search_fields'] ) ) {
- $search_filters = maybe_unserialize( $args['search_fields'] );
+ if ( ! empty( $directory_data['search_fields'] ) ) {
+ $search_filters = maybe_unserialize( $directory_data['search_fields'] );
if ( ! empty( $search_filters ) && is_array( $search_filters ) ) {
$filter_query = array_intersect_key( $_POST, array_flip( $search_filters ) );
}
@@ -1017,49 +1211,12 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) {
return;
}
- $query = $_POST;
-
foreach ( $filter_query as $field => $value ) {
switch ( $field ) {
default:
- $value = explode( '||', $value );
- if ( is_array( $value ) ) {
- $field_query = array( 'relation' => 'OR' );
-
- foreach ( $value as $single_val ) {
- $arr_meta_query = array(
- array(
- 'key' => $field,
- 'value' => trim( $single_val ),
- 'compare' => '=',
- ),
- array(
- 'key' => $field,
- 'value' => serialize( strval( trim( $single_val ) ) ),
- 'compare' => 'LIKE',
- ),
- array(
- 'key' => $field,
- 'value' => '"' . trim( $single_val ) . '"',
- 'compare' => 'LIKE',
- )
- );
-
- if ( is_numeric( $single_val ) ) {
-
- $arr_meta_query[] = array(
- 'key' => $field,
- 'value' => serialize( intval( trim( $single_val ) ) ),
- 'compare' => 'LIKE',
- );
-
- }
-
- $field_query = array_merge( $field_query, $arr_meta_query );
- }
- }
+ $filter_type = $this->filter_types[ $field ];
/**
* UM hook
@@ -1082,8 +1239,103 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) {
* }
* ?>
*/
- $field_query = apply_filters( "um_query_args_{$field}__filter", $field_query );
- $this->query_args['meta_query'] = array_merge( $this->query_args['meta_query'], array( $field_query ) );
+ $field_query = apply_filters( "um_query_args_{$field}__filter", false, $field, $value, $filter_type );
+
+ if ( ! $field_query ) {
+
+ switch ( $filter_type ) {
+ default:
+
+ $field_query = apply_filters( "um_query_args_{$field}_{$filter_type}__filter", false, $field, $value, $filter_type );
+
+ break;
+ case 'select':
+ if ( is_array( $value ) ) {
+ $field_query = array( 'relation' => 'OR' );
+
+ foreach ( $value as $single_val ) {
+ $arr_meta_query = array(
+ array(
+ 'key' => $field,
+ 'value' => trim( $single_val ),
+ 'compare' => '=',
+ ),
+ array(
+ 'key' => $field,
+ 'value' => serialize( strval( trim( $single_val ) ) ),
+ 'compare' => 'LIKE',
+ ),
+ array(
+ 'key' => $field,
+ 'value' => '"' . trim( $single_val ) . '"',
+ 'compare' => 'LIKE',
+ )
+ );
+
+ if ( is_numeric( $single_val ) ) {
+
+ $arr_meta_query[] = array(
+ 'key' => $field,
+ 'value' => serialize( intval( trim( $single_val ) ) ),
+ 'compare' => 'LIKE',
+ );
+
+ }
+
+ $field_query = array_merge( $field_query, $arr_meta_query );
+ }
+ }
+
+ break;
+ case 'slider':
+
+ $field_query = array(
+ array(
+ 'key' => $field,
+ 'value' => $value,
+ 'compare' => 'BETWEEN',
+ 'inclusive' => true,
+ )
+ );
+
+ break;
+ case 'datepicker':
+
+ $offset = 0;
+ if ( isset( $_POST['gmt_offset'] ) && is_numeric( $_POST['gmt_offset'] ) ) {
+ $offset = (int) $_POST['gmt_offset'];
+ }
+
+ $from_date = (int) min( $value ) + ( $offset * HOUR_IN_SECONDS ); // client time zone offset
+ $to_date = (int) max( $value ) + ( $offset * HOUR_IN_SECONDS ) + DAY_IN_SECONDS - 1; // time 23:59
+ $field_query = array(
+ array(
+ 'key' => $field,
+ 'value' => array( $from_date, $to_date ),
+ 'compare' => 'BETWEEN',
+ )
+ );
+
+ break;
+ case 'timepicker':
+
+ $field_query = array(
+ array(
+ 'key' => $field,
+ 'value' => $value,
+ 'compare' => 'BETWEEN',
+ 'type' => 'TIME',
+ 'inclusive' => true,
+ )
+ );
+
+ break;
+ }
+ }
+
+ if ( ! empty( $field_query ) ) {
+ $this->query_args['meta_query'] = array_merge( $this->query_args['meta_query'], array( $field_query ) );
+ }
break;
case 'role':
@@ -1103,311 +1355,283 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) {
$this->query_args['role__in'] = $value;
};
+ break;
+ case 'birth_date':
+ $from_date = date( 'Y/m/d', mktime( 0,0,0, date( 'm', time() ), date( 'd', time() ), date( 'Y', time() - min( $value ) * YEAR_IN_SECONDS ) ) );
+ $to_date = date( 'Y/m/d', mktime( 0,0,0, date( 'm', time() ), date( 'd', time() ) + 1, date( 'Y', time() - ( max( $value ) + 1 ) * YEAR_IN_SECONDS ) ) );
+
+ $meta_query = array(
+ array(
+ 'key' => 'birth_date',
+ 'value' => array( $to_date, $from_date ),
+ 'compare' => 'BETWEEN',
+ 'type' => 'DATE',
+ 'inclusive' => true,
+ )
+ );
+
+ $this->query_args['meta_query'] = array_merge( $this->query_args['meta_query'], array( $meta_query ) );
+
+ break;
+ case 'user_registered':
+ $offset = 0;
+ if ( isset( $_POST['gmt_offset'] ) && is_numeric( $_POST['gmt_offset'] ) ) {
+ $offset = (int) $_POST['gmt_offset'];
+ }
+
+ $from_date = date( 'Y-m-d H:s:i', strtotime( date( 'Y-m-d H:s:i', min( $value ) ) . "+$offset hours" ) );
+ $to_date = date( 'Y-m-d H:s:i', strtotime( date( 'Y-m-d H:s:i', max( $value ) ) . "+$offset hours" ) );
+
+ $date_query = array(
+ array(
+ 'column' => 'user_registered',
+ 'before' => $to_date,
+ 'after' => $from_date,
+ 'inclusive' => true,
+ ),
+ );
+
+ if ( empty( $this->query_args['date_query'] ) ) {
+ $this->query_args['date_query'] = $date_query;
+ } else {
+ $this->query_args['date_query'] = array_merge( $this->query_args['date_query'], array( $date_query ) );
+ }
+
+ break;
+ case 'last_login':
+ $offset = 0;
+ if ( isset( $_POST['gmt_offset'] ) && is_numeric( $_POST['gmt_offset'] ) ) {
+ $offset = (int) $_POST['gmt_offset'];
+ }
+
+ $from_date = (int) min( $value ) + ( $offset * HOUR_IN_SECONDS ); // client time zone offset
+ $to_date = (int) max( $value ) + ( $offset * HOUR_IN_SECONDS ) + DAY_IN_SECONDS - 1; // time 23:59
+ $meta_query = array(
+ array(
+ 'key' => '_um_last_login',
+ 'value' => array( $from_date, $to_date ),
+ 'compare' => 'BETWEEN',
+ )
+ );
+
+ $this->query_args['meta_query'] = array_merge( $this->query_args['meta_query'], array( $meta_query ) );
break;
}
-
-
-// if ( 'role' == $field ) {
-//
-// if ( ! empty( $this->query_args['role__in'] ) ) {
-// $value = array_map('strtolower', $value);
-//
-// $this->query_args['role__in'] = is_array( $this->query_args['role__in'] ) ? $this->query_args['role__in'] : array( $this->query_args['role__in'] );
-// $default_role = array_intersect( $this->query_args['role__in'], $value );
-// $um_role = array_diff( $value, $default_role );
-//
-// foreach ($um_role as $key => &$val) {
-// $val = 'um_' . str_replace(' ', '-', $val);
-// }
-// $this->query_args['role__in'] = array_merge( $default_role, $um_role );
-// } else {
-// $this->query_args['role__in'] = $value;
-// };
-//
-// } elseif ( 'birth_date' == $field ) {
-// $from_date = date( 'Y-m-d', mktime( 0,0,0, 1, 1, date('Y', time() - ($query['birth_date'][0] -1)*YEAR_IN_SECONDS ) ) );
-// $to_date = date( 'Y-m-d', mktime( 0,0,0, 1, 1, date('Y', time() - ($query['birth_date'][1] +1)*YEAR_IN_SECONDS ) ) );
-//
-// $meta_query = array(
-// array(
-// 'key' => 'birth_date',
-// 'value' => array( $to_date, $from_date ),
-// 'compare' => 'BETWEEN',
-// 'type' => 'DATE',
-// 'inclusive' => true,
-// )
-// );
-//
-// $this->query_args['meta_query'] = array_merge( $this->query_args['meta_query'], array( $meta_query ) );
-//
-// } elseif ( 'user_registered' == $field ) {
-//
-// $offset = 0;
-//
-// if( isset( $query['gmt_offset'] ) ) {
-// $offset = (int)$query['gmt_offset'];
-// }
-//
-// if( isset( $query['user_registered']['from'] ) ) {
-// $from_date = date( 'Y-m-d', strtotime( date( 'Y-m-d H:s:i', $query['user_registered']['from'] ) . "+$offset hours" ) );
-// }
-//
-// if( isset( $query['user_registered']['to'] ) ) {
-// $to_date = date( 'Y-m-d', strtotime( date( 'Y-m-d H:s:i', $query['user_registered']['to'] ) . "+$offset hours" ) );
-// }
-//
-// $date_query = array(
-// array(
-// 'column' => 'user_registered',
-// 'before' => $to_date,
-// 'after' => $from_date,
-// 'inclusive' => true,
-// ),
-// );
-//
-// $this->query_args['date_query'] = array( $date_query );
-//
-// } elseif ( 'last_login' == $field ) {
-//
-// $meta_query = array();
-// $offset = 0;
-//
-// if( isset( $query['gmt_offset'] ) ) {
-// $offset = (int)$query['gmt_offset'];
-// }
-//
-// if( isset( $query['last_login']['from'] ) and isset( $query['last_login']['to'] ) ) {
-// $from_date = (int)$query['last_login']['from'] + ( $offset * 60 * 60 ); // client time zone offset
-// $to_date = (int)$query['last_login']['to'] + ( $offset * 60 * 60 ) + (24 * 60 * 60 - 1); // time 23:59
-//
-// $meta_query[] = array(
-// 'key' => '_um_last_login',
-// 'value' => array( $from_date, $to_date ),
-// 'compare' => 'BETWEEN',
-// );
-//
-// } else {
-//
-// if( isset( $query['last_login']['from'] ) ) {
-// $from_date = (int)$query['last_login']['from'] + ( $offset * 60 * 60 );
-//
-// $meta_query[] = array(
-// 'key' => '_um_last_login',
-// 'value' => $from_date,
-// 'compare' => '>',
-// );
-// }
-//
-// if( isset( $query['last_login']['to'] ) ) {
-// $to_date = (int)$query['last_login']['to'] + ( $offset * 60 * 60 ) + (24 * 60 * 60 - 1);
-//
-// $meta_query[] = array(
-// 'key' => '_um_last_login',
-// 'value' => $to_date,
-// 'compare' => '<',
-// );
-// }
-// }
-//
-// $this->query_args['meta_query'] = array_merge( $this->query_args['meta_query'], array( $meta_query ) );
-//
-// } elseif( 'gmt_offset' == $field ) {
-// continue;
-// } else {
-//
-// if ( is_array( $value ) ) {
-// $field_query = array( 'relation' => 'OR' );
-//
-// foreach ( $value as $single_val ) {
-// $field_query = array_merge( $field_query, array(
-// array(
-// 'key' => $field,
-// 'value' => trim( $single_val ),
-// 'compare' => '=',
-// )
-// ) );
-//
-// $types = apply_filters( 'um_search_field_types', array(
-// 'multiselect',
-// 'radio',
-// 'checkbox'
-// ) );
-//
-// //if ( in_array( $filter_data['attrs']['type'], $types ) ) {
-//
-// $arr_meta_query = array(
-// array(
-// 'key' => $field,
-// 'value' => serialize( strval( trim( $single_val ) ) ),
-// 'compare' => 'LIKE',
-// ),
-// array(
-// 'key' => $field,
-// 'value' => '"' . trim( $single_val ) . '"',
-// 'compare' => 'LIKE',
-// )
-// );
-//
-// if ( is_numeric( $single_val ) ) {
-//
-// $arr_meta_query[ ] = array(
-// 'key' => $field,
-// 'value' => serialize( intval( trim( $single_val ) ) ),
-// 'compare' => 'LIKE',
-// );
-//
-// }
-//
-// $field_query = array_merge( $field_query, $arr_meta_query );
-// //}
-// }
-// } else {
-// $field_query = array(
-// array(
-// 'key' => $field,
-// 'value' => trim( $value ),
-// 'compare' => '=',
-// ),
-// 'relation' => 'OR',
-// );
-//
-// $types = apply_filters( 'um_search_field_types', array(
-// 'multiselect',
-// 'radio',
-// 'checkbox'
-// ) );
-//
-// //if ( in_array( $filter_data['attrs']['type'], $types ) ) {
-//
-// $arr_meta_query = array(
-// array(
-// 'key' => $field,
-// 'value' => serialize( strval( trim( $value ) ) ),
-// 'compare' => 'LIKE',
-// ),
-// array(
-// 'key' => $field,
-// 'value' => '"' . trim( $value ) . '"',
-// 'compare' => 'LIKE',
-// )
-// );
-//
-// if ( is_numeric( $value ) ) {
-//
-// $arr_meta_query[ ] = array(
-// 'key' => $field,
-// 'value' => serialize( intval( trim( $value ) ) ),
-// 'compare' => 'LIKE',
-// );
-//
-// }
-//
-// $field_query = array_merge( $field_query, $arr_meta_query );
-// //}
-// }
-//
-// $field_query = apply_filters( "um_query_args_{$field}__filter", $field_query );
-// $this->query_args['meta_query'] = array_merge( $this->query_args['meta_query'], array( $field_query ) );
-// }
-
}
}
- 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 ) );
+ /**
+ * Get data array for pagination
+ *
+ *
+ * @param array $directory_data
+ * @param \WP_User_Query $result
+ *
+ * @return array
+ */
+ function calculate_pagination( $directory_data, $result ) {
- if ( empty( $directory_id ) ) {
- return false;
+ $current_page = ! empty( $_POST['page'] ) ? $_POST['page'] : 1;
+
+ $total_users = ( ! empty( $max_users ) && $max_users <= $result->total_users ) ? $max_users : $result->total_users;
+ $total_pages = ceil( $total_users / $directory_data['profiles_per_page'] );
+
+ if ( ! empty( $total_pages ) ) {
+ $index1 = 0 - ( $current_page - 2 ) + 1;
+ $to = $current_page + 2;
+ if ( $index1 > 0 ) {
+ $to += $index1;
+ }
+
+ $index2 = $total_pages - ( $current_page + 2 );
+ $from = $current_page - 2;
+ if ( $index2 < 0 ) {
+ $from += $index2;
+ }
+
+ $pages_to_show = range(
+ ( $from > 0 ) ? $from : 1,
+ ( $to <= $total_pages ) ? $to : $total_pages
+ );
}
- return (int) $directory_id;
- }
+ $pagination_data = array(
+ 'pages_to_show' => ( ! empty( $pages_to_show ) && count( $pages_to_show ) > 1 ) ? array_values( $pages_to_show ) : array(),
+ 'current_page' => $current_page,
+ 'total_pages' => $total_pages,
+ 'total_users' => $total_users,
+ );
- function get_type_basename( $type ) {
- return apply_filters( "um_member_directory_{$type}_type_template_basename", '' );
+ $pagination_data['header'] = $this->convert_tags( $directory_data['header'], $pagination_data );
+ $pagination_data['header_single'] = $this->convert_tags( $directory_data['header_single'], $pagination_data );
+
+ return $pagination_data;
}
/**
- * get AJAX results members
+ * @param int $user_id
+ * @param array $directory_data
+ *
+ * @return array
+ */
+ function build_user_card_data( $user_id, $directory_data ) {
+ um_fetch_user( $user_id );
+
+ $can_edit = UM()->roles()->um_current_user_can( 'edit', $user_id ) || UM()->roles()->um_user_can( 'can_edit_everyone' );
+
+ $actions = array();
+ if ( $can_edit ) {
+ $actions[] = array(
+ 'title' => __( 'Edit profile', 'ultimate-member' ),
+ 'url' => um_edit_profile_url(),
+ 'wrapper_class' => 'um-members-edit-btn',
+ 'class' => 'um-edit-profile-btn um-button um-alt',
+ );
+ }
+
+ // Replace hook 'um_members_just_after_name'
+ ob_start();
+ do_action( 'um_members_just_after_name', $user_id, $directory_data );
+ $hook_just_after_name = ob_get_clean();
+
+ // Replace hook 'um_members_after_user_name'
+ ob_start();
+ do_action( 'um_members_after_user_name', $user_id, $directory_data );
+ $hook_after_user_name = ob_get_clean();
+
+ $data_array = array(
+ 'id' => $user_id,
+ 'role' => um_user( 'role' ),
+ 'account_status' => um_user( 'account_status' ),
+ 'account_status_name' => um_user( 'account_status_name' ),
+ 'cover_photo' => um_user( 'cover_photo', $this->cover_size ),
+ 'display_name' => um_user( 'display_name' ),
+ 'profile_url' => um_user_profile_url(),
+ 'can_edit' => $can_edit,
+ 'edit_profile_url' => um_edit_profile_url(),
+ 'avatar' => get_avatar( $user_id, $this->avatar_size ),
+ 'display_name_html' => um_user( 'display_name', 'html' ),
+ 'actions' => $actions,
+ 'hook_just_after_name' => preg_replace( '/^\s+/im', '', $hook_just_after_name ),
+ 'hook_after_user_name' => preg_replace( '/^\s+/im', '', $hook_after_user_name ),
+ );
+
+ if ( $directory_data['show_tagline'] && is_array( $directory_data['tagline_fields'] ) ) {
+ foreach ( $directory_data['tagline_fields'] as $key ) {
+ if ( ! $key ) {
+ continue;
+ }
+
+ $value = um_filtered_value( $key );
+ if ( ! $value ) {
+ continue;
+ }
+
+ $data_array[ $key ] = $value;
+ }
+ }
+
+ if ( $directory_data['show_userinfo'] ) {
+ foreach ( $directory_data['reveal_fields'] as $key ) {
+ if ( ! $key ) {
+ continue;
+ }
+
+ $value = um_filtered_value( $key );
+ if ( ! $value ) {
+ continue;
+ }
+
+ $label = UM()->fields()->get_label( $key );
+ if ( $key == 'role_select' || $key == 'role_radio' ) {
+ $label = strtr( $label, array(
+ ' (Dropdown)' => '',
+ ' (Radio)' => ''
+ ) );
+ }
+
+ $data_array[ "label_{$key}" ] = $label;
+ $data_array[ $key ] = $value;
+ }
+
+ if ( ! empty( $directory_data['show_social'] ) ) {
+ ob_start();
+ UM()->fields()->show_social_urls();
+ $social_urls = ob_get_clean();
+
+ $data_array['social_urls'] = $social_urls;
+ }
+ }
+
+ $data_array = apply_filters( 'um_ajax_get_members_data', $data_array, $user_id );
+ um_reset_user_clean();
+
+ return $data_array;
+ }
+
+
+ /**
+ * Main Query function for getting members via AJAX
*/
function ajax_get_members() {
UM()->check_ajax_nonce();
global $wpdb;
- $args = ! empty( $_POST['args'] ) ? $_POST['args'] : array();
- $args['page'] = ! empty( $_POST['page'] ) ? $_POST['page'] : ( isset( $args['page'] ) ? $args['page'] : 1 );
-
- $directory_data = array();
$directory_id = $this->get_directory_by_hash( $_POST['directory_id'] );
+ $directory_data = UM()->query()->post_data( $directory_id );
- $post_data = UM()->query()->post_data( $directory_id );
+ //predefined result for user without capabilities to see other members
+ if ( is_user_logged_in() && ! UM()->roles()->um_user_can( 'can_view_all' ) ) {
+ $pagination_data = array(
+ 'pages_to_show' => array(),
+ 'current_page' => 1,
+ 'total_pages' => 0,
+ 'total_users' => 0,
+ );
- $args = array_merge( $post_data, $args );
+ $pagination_data['header'] = $this->convert_tags( $directory_data['header'], $pagination_data );
+ $pagination_data['header_single'] = $this->convert_tags( $directory_data['header_single'], $pagination_data );
- /**
- * @var $profiles_per_page
- * @var $profiles_per_page_mobile
- * @var $header
- * @var $header_single
- * @var $has_profile_photo
- * @var $has_cover_photo
- */
- extract( $args );
-
- $data_args = array(
- 'show_count' => false
- );
- if ( ! empty( $_POST['search'] ) || ! empty( $_POST['is_filters'] ) || ! empty( $args['search_filters'] ) ) {
- $data_args['show_count'] = true;
+ wp_send_json_success( array( 'users' => array(), 'pagination' => $pagination_data, 'args' => array( 'show_count' => false ) ) );
}
+
+ // Prepare for BIG SELECT query
+ $wpdb->query( 'SET SQL_BIG_SELECTS=1' );
+
+ // Prepare default user query values
$this->query_args = array(
- 'fields' => 'ids',
- 'number' => 0,
- 'meta_query' => array(
+ 'fields' => 'ids',
+ 'number' => 0,
+ 'meta_query' => array(
'relation' => 'AND'
),
);
- // add roles to appear in directory
- if ( ! empty( $args['roles'] ) ) {
- //since WP4.4 use 'role__in' argument
- $this->query_args['role__in'] = $args['roles'];
- }
- $this->profile_photo_query( $args );
+ // handle different restrictions
+ $this->restriction_options();
- $this->cover_photo_query( $args );
+ // handle general options
+ $this->general_options( $directory_data );
- // show specific usernames
- if ( ! empty( $args['show_these_users'] ) && is_array( $args['show_these_users'] ) ) {
- foreach ( $args['show_these_users'] as $username ) {
- if ( false !== ( $exists_id = username_exists( $username ) ) ) {
- $users_array[] = $exists_id;
- }
- }
+ // handle pagination options
+ $this->pagination_options( $directory_data );
- $this->query_args['include'] = $users_array;
- }
-
- $this->hide_not_approved();
-
- $this->hide_by_role();
-
- $this->hide_by_account_settings();
-
- $this->sorting_query( $args );
+ // handle sorting options
+ $this->sorting_query( $directory_data );
+ // handle general search line
$this->general_search();
- $this->filters( $args );
+ // handle filters
+ $this->filters( $directory_data );
/**
* UM hook
@@ -1431,32 +1655,13 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) {
* }
* ?>
*/
- $this->query_args = apply_filters( 'um_prepare_user_query_args', $this->query_args, $args );
+ $this->query_args = apply_filters( 'um_prepare_user_query_args', $this->query_args, $directory_data );
//unset empty meta_query attribute
if ( isset( $this->query_args['meta_query']['relation'] ) && count( $this->query_args['meta_query'] ) == 1 ) {
unset( $this->query_args['meta_query'] );
}
- // Prepare for BIG SELECT query
- $wpdb->query( 'SET SQL_BIG_SELECTS=1' );
-
- // number of profiles for mobile
- $profiles_per_page = $args['profiles_per_page'];
- if ( UM()->mobile()->isMobile() && isset( $args['profiles_per_page_mobile'] ) ) {
- $profiles_per_page = $args['profiles_per_page_mobile'];
- }
-
- $this->query_args['number'] = isset( $args['number'] ) ? $args['number'] : $profiles_per_page;
- $this->query_args['number'] = ( ! empty( $args['max_users'] ) && $args['max_users'] <= $profiles_per_page ) ? $args['max_users'] : $this->query_args['number'];
-
- $current_page = isset( $args['page'] ) ? $args['page'] : 1;
- $this->query_args['paged'] = $current_page;
-
- if ( ! UM()->roles()->um_user_can( 'can_view_all' ) && is_user_logged_in() ) {
- $this->query_args = array();
- }
-
/**
* UM hook
*
@@ -1480,9 +1685,7 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) {
add_filter( 'get_meta_sql', array( &$this, 'change_meta_sql' ), 10, 6 );
- $users = new \WP_User_Query( $this->query_args );
-
- //var_dump($users->request);
+ $user_query = new \WP_User_Query( $this->query_args );
remove_filter( 'get_meta_sql', array( &$this, 'change_meta_sql' ), 10 );
@@ -1494,42 +1697,23 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) {
* @description Action before users query on member directory
* @input_vars
* [{"var":"$query_args","type":"array","desc":"Query arguments"},
- * {"var":"$users","type":"array","desc":"Users"}]
+ * {"var":"$user_query","type":"array","desc":"User Query"}]
* @change_log
* ["Since: 2.0"]
* @usage add_action( 'um_user_after_query', 'function_name', 10, 2 );
* @example
*
*/
- do_action( 'um_user_after_query', $this->query_args, $users );
+ do_action( 'um_user_after_query', $this->query_args, $user_query );
- $user_ids = ! empty( $users->results ) ? array_unique( $users->results ) : array();
- $total_users = ( ! empty( $max_users ) && $max_users <= $users->total_users ) ? $max_users : $users->total_users;
- $total_pages = ceil( $total_users / $profiles_per_page );
+ $pagination_data = $this->calculate_pagination( $directory_data, $user_query );
- if ( ! empty( $total_pages ) ) {
- $index1 = 0 - ( $current_page - 2 ) + 1;
- $to = $current_page + 2;
- if ( $index1 > 0 ) {
- $to += $index1;
- }
-
- $index2 = $total_pages - ( $current_page + 2 );
- $from = $current_page - 2;
- if ( $index2 < 0 ) {
- $from += $index2;
- }
-
- $pages_to_show = range(
- ( $from > 0 ) ? $from : 1,
- ( $to <= $total_pages ) ? $to : $total_pages
- );
- }
+ $user_ids = ! empty( $user_query->results ) ? array_unique( $user_query->results ) : array();
/**
* UM hook
@@ -1552,118 +1736,45 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) {
* }
* ?>
*/
- $users = apply_filters( 'um_prepare_user_results_array', $user_ids );
+ $user_ids = apply_filters( 'um_prepare_user_results_array', $user_ids );
+
+
+
+
+
+ /*
+ * @todo generate user card data
+ */
+
+
+
+
+
+
$sizes = UM()->options()->get( 'cover_thumb_sizes' );
- $cover_size = UM()->mobile()->isTablet() ? $sizes[1] : $sizes[0];
+ $this->cover_size = UM()->mobile()->isTablet() ? $sizes[1] : $sizes[0];
- $users_data = array();
- foreach ( $users as $user_id ) {
- um_fetch_user( $user_id );
+ $avatar_size = UM()->options()->get( 'profile_photosize' );
+ $this->avatar_size = str_replace( 'px', '', $avatar_size );
- $actions = array();
- if ( UM()->roles()->um_current_user_can( 'edit', $user_id ) || UM()->roles()->um_user_can( 'can_edit_everyone' ) ) {
- $actions[] = array(
- 'title' => __( 'Edit profile', 'ultimate-member' ),
- 'url' => um_edit_profile_url(),
- 'wrapper_class' => 'um-members-edit-btn',
- 'class' => 'um-edit-profile-btn um-button um-alt',
- );
- }
-
- // Replace hook 'um_members_just_after_name'
- ob_start();
- do_action( 'um_members_just_after_name', $user_id, $args );
- $hook_just_after_name = ob_get_clean();
-
- // Replace hook 'um_members_after_user_name'
- ob_start();
- do_action( 'um_members_after_user_name', $user_id, $args );
- $hook_after_user_name = ob_get_clean();
-
- ob_start();
- UM()->fields()->show_social_urls();
- $social_urls = ob_get_clean();
-
- $data_array = array(
- 'id' => $user_id,
- 'role' => um_user( 'role' ),
- 'account_status' => um_user( 'account_status' ),
- 'account_status_name' => um_user( 'account_status_name' ),
- 'cover_photo' => um_user( 'cover_photo', $cover_size ),
- 'display_name' => um_user( 'display_name' ),
- 'profile_url' => um_user_profile_url(),
- 'can_edit' => ( UM()->roles()->um_current_user_can( 'edit', $user_id ) || UM()->roles()->um_user_can( 'can_edit_everyone' ) ) ? true : false,
- 'edit_profile_url' => um_edit_profile_url(),
- 'avatar' => get_avatar( $user_id, str_replace( 'px', '', UM()->options()->get( 'profile_photosize' ) ) ),
- 'display_name_html' => um_user( 'display_name', 'html' ),
- 'social_urls' => $social_urls,
- 'actions' => $actions,
- 'hook_just_after_name' => preg_replace('/^\s+/im', '', $hook_just_after_name),
- 'hook_after_user_name' => preg_replace('/^\s+/im', '', $hook_after_user_name),
- );
-
- if ( $args['show_tagline'] && is_array( $args['tagline_fields'] ) ) {
- foreach ( $args['tagline_fields'] as $key ) {
- if ( $key && um_filtered_value( $key ) ) {
- $data_array[ $key ] = um_filtered_value( $key );
- }
- }
- }
-
- if ( $args['show_userinfo'] ) {
- foreach ( $args['reveal_fields'] as $key ) {
- if ( $key && um_filtered_value( $key ) ) {
- $label = strtr( UM()->fields()->get_label( $key ), array(
- ' (Dropdown)' => '',
- ' (Radio)' => ''
- ) );
- $data_array[ "label_{$key}" ] = $label;
- $data_array[ $key ] = um_filtered_value( $key );
- }
- }
- }
-
- $users_data[] = apply_filters( 'um_ajax_get_members_data', $data_array, $user_id );
- um_reset_user_clean();
+ $users = array();
+ foreach ( $user_ids as $user_id ) {
+ $users[] = $this->build_user_card_data( $user_id, $directory_data );
}
um_reset_user();
+ // end of user card
- $pagination_data = array(
- 'pages_to_show' => ( ! empty( $pages_to_show ) && count( $pages_to_show ) > 1 ) ? array_values( $pages_to_show ) : array(),
- 'current_page' => $args['page'],
- 'total_pages' => $total_pages,
- 'total_users' => $total_users,
+
+ $data_args = array(
+ 'show_count' => false
);
+ if ( ! empty( $_POST['search'] ) || ! empty( $_POST['is_filters'] ) || ! empty( $directory_data['search_filters'] ) ) {
+ $data_args['show_count'] = true;
+ }
- $pagination_data['header'] = $this->convert_tags( $args['header'], $pagination_data );
- $pagination_data['header_single'] = $this->convert_tags( $args['header_single'], $pagination_data );
-
- wp_send_json_success( array( 'users' => $users_data, 'pagination' => $pagination_data, 'args' => $data_args ) );
- }
-
-
- /**
- * Tag conversion for member directory
- *
- * @param $string
- * @param $array
- *
- * @return mixed
- */
- function convert_tags( $string, $array ) {
-
- $search = array(
- '{total_users}',
- );
-
- $replace = array(
- $array['total_users'],
- );
-
- $string = str_replace( $search, $replace, $string );
- return $string;
+ wp_send_json_success( array( 'pagination' => $pagination_data, 'users' => $users, 'args' => $data_args ) );
}
}
}
\ No newline at end of file
diff --git a/includes/core/class-members.php b/includes/core/class-members.php
index 91413161..801ab7e0 100644
--- a/includes/core/class-members.php
+++ b/includes/core/class-members.php
@@ -26,310 +26,7 @@ if ( ! class_exists( 'um\core\Members' ) ) {
*/
function __construct() {
- add_filter( 'user_search_columns', array( &$this, 'user_search_columns' ), 99 );
- add_action( 'template_redirect', array( &$this, 'access_members' ), 555 );
- $this->core_search_fields = array(
- 'user_login',
- 'user_url',
- 'display_name',
- 'user_email',
- 'user_nicename',
- );
-
- add_filter( 'um_search_select_fields', array( &$this, 'um_search_select_fields' ), 10, 1 );
-
- }
-
-
- /**
- * Show filter
- *
- * @todo make UM:Groups members list via general directory
- *
- * @deprecated since 2.1.0 - Use only in UM Groups extension
- * @param $filter
- */
- function show_filter( $filter ) {
- /**
- * @var $type
- * @var $attrs
- */
- extract( $this->prepare_filter( $filter ) );
-
- switch ( $type ) {
-
- case 'select':
- /*if( isset($attrs) && is_array( $attrs['options'] ) ){
- asort( $attrs['options'] );
- }*/
- if ( isset( $attrs['label'] ) ) {
- $label = $attrs['label'];
- } else {
- $label = isset( $attrs['title'] ) ? $attrs['title'] : '';
- } ?>
-
-
-
-
-
-
-
- options()->get( 'members_page' ) == 0 && um_is_core_page( 'members' ) ) {
- um_redirect_home();
- }
- }
-
-
- /**
- * Tag conversion for member directory
- *
- * @param $string
- * @param $array
- *
- * @return mixed
- */
- function convert_tags( $string, $array ) {
-
- $search = array(
- '{total_users}',
- );
-
- $replace = array(
- $array['total_users'],
- );
-
- $string = str_replace( $search, $replace, $string );
- return $string;
- }
-
- /**
- * Prepare filter data
- *
- * @param $filter
- * @return array
- */
- function prepare_filter( $filter ) {
- $fields = UM()->builtin()->all_user_fields;
-
- if ( isset( $fields[ $filter ] ) ) {
- $attrs = $fields[ $filter ];
- } 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() );
- }
-
- // additional filter for search field attributes
- /**
- * UM hook
- *
- * @type filter
- * @title um_search_field_{$filter}
- * @description Extend search settings by $filter
- * @input_vars
- * [{"var":"$settings","type":"array","desc":"Search Settings"}]
- * @change_log
- * ["Since: 2.0"]
- * @usage
- *
- * @example
- *
- */
- $attrs = apply_filters( "um_search_field_{$filter}", $attrs );
-
- $type = UM()->builtin()->is_dropdown_field( $filter, $attrs ) ? 'select' : 'text';
-
- /**
- * UM hook
- *
- * @type filter
- * @title um_search_field_type
- * @description Change search field type
- * @input_vars
- * [{"var":"$type","type":"string","desc":"Search field type"},
- * {"var":"$settings","type":"array","desc":"Search Settings"}]
- * @change_log
- * ["Since: 2.0"]
- * @usage
- *
- * @example
- *
- */
- $type = apply_filters( 'um_search_field_type', $type, $attrs );
-
- /**
- * 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 );
-
- if ( $type == 'select' ) {
- if ( isset( $attrs ) && is_array( $attrs['options'] ) ) {
- asort( $attrs['options'] );
- }
- /**
- * UM hook
- *
- * @type filter
- * @title um_search_select_fields
- * @description Filter all search fields for select field type
- * @input_vars
- * [{"var":"$settings","type":"array","desc":"Search Fields"}]
- * @change_log
- * ["Since: 2.0"]
- * @usage
- *
- * @example
- *
- */
- $attrs = apply_filters( 'um_search_select_fields', $attrs );
- }
-
- return compact( 'type', 'attrs' );
- }
-
-
- /**
- * Display assigned roles in search filter 'role' field
- * @param array $attrs
- * @return array
- * @uses add_filter 'um_search_select_fields'
- * @since 1.3.83
- */
- function um_search_select_fields( $attrs ) {
-
- if ( ! empty( $attrs['metakey'] ) && strstr( $attrs['metakey'], 'role_' ) ) {
-
- $shortcode_roles = get_post_meta( UM()->shortcodes()->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;
- }
- }
-
- }
-
- }
-
- return $attrs;
}
diff --git a/includes/core/um-filters-members.php b/includes/core/um-filters-members.php
index f4aa585a..60ac9da6 100644
--- a/includes/core/um-filters-members.php
+++ b/includes/core/um-filters-members.php
@@ -1,35 +1,6 @@
permalinks()->get_query_array();
-// $arr_columns = array();
-//
-// foreach ( UM()->members()->core_search_fields as $key ) {
-// if ( ! empty( $query[ $key ] ) ) {
-// $arr_columns[] = $key;
-// $query_args['search'] = '*' . $query[ $key ] .'*';
-// }
-// }
-//
-// if ( ! empty( $arr_columns ) )
-// $query_args['search_columns'] = $arr_columns;
-//
-// return $query_args;
-//}
-//add_filter( 'um_prepare_user_query_args', 'um_search_usernames_emails', 51, 2 );
-
-
/**
* Remove users we do not need to show in directory
*
@@ -99,173 +70,4 @@ function um_remove_special_users_from_list( $query_args, $args ) {
return $query_args;
}
-//add_filter( 'um_prepare_user_query_args', 'um_remove_special_users_from_list', 99, 2 );
-
-
-/**
- * Adds main parameters
- *
- * @param $query_args
- * @param $args
- *
- * @return mixed
- */
-function um_prepare_user_query_args( $query_args, $args ) {
- extract( $args );
-
- $query_args['fields'] = 'ID';
-
- $query_args['number'] = 0;
-
- $query_args['meta_query']['relation'] = 'AND';
-
- // must have a profile photo
- if ( $has_profile_photo == 1 ) {
- if ( UM()->options()->get( 'use_gravatars' ) ) {
- $query_args['meta_query'][] = array(
- 'relation' => 'OR',
- array(
- 'key' => 'synced_profile_photo', // addons
- 'value' => '',
- 'compare' => '!='
- ),
- array(
- 'key' => 'profile_photo', // from upload form
- 'value' => '',
- 'compare' => '!='
- ),
- array(
- 'key' => 'synced_gravatar_hashed_id', // gravatar
- 'value' => '',
- 'compare' => '!='
- )
-
- );
- } else {
- $query_args['meta_query'][] = array(
- 'relation' => 'OR',
- array(
- 'key' => 'synced_profile_photo', // addons
- 'value' => '',
- 'compare' => '!='
- ),
- array(
- 'key' => 'profile_photo', // from upload form
- 'value' => '',
- 'compare' => '!='
- )
- );
- }
- }
-
- // must have a cover photo
- if ( $has_cover_photo == 1 ) {
- $query_args['meta_query'][] = array(
- 'key' => 'cover_photo',
- 'value' => '',
- 'compare' => '!='
- );
- }
-
-
- // show specific usernames
- if ( isset( $show_these_users ) && $show_these_users && is_array( $show_these_users ) ) {
- foreach ( $show_these_users as $username ) {
- $users_array[] = username_exists( $username );
- }
- $query_args['include'] = $users_array;
- }
-
- // add roles to appear in directory
- if ( ! empty( $roles ) ) {
- //since WP4.4 use 'role__in' argument
- $query_args['role__in'] = $roles;
- }
-
- // sort members by
- $query_args['order'] = 'ASC';
-
- if ( isset( $sortby ) ) {
-
- if ( $sortby == 'other' && $sortby_custom ) {
-
- $query_args['meta_key'] = $sortby_custom;
- $query_args['orderby'] = 'meta_value, display_name';
-
- } elseif ( 'display_name' == $sortby ) {
-
- $display_name = UM()->options()->get( 'display_name' );
- if ( $display_name == 'username' ) {
- $query_args['orderby'] = 'user_login';
- $order = 'ASC';
- } else {
- $query_args['meta_query'][] = array(
- 'relation' => 'OR',
- 'full_name' => array(
- 'key' => 'full_name',
- 'compare' => 'EXISTS'
- ),
- array(
- 'key' => 'full_name',
- 'compare' => 'NOT EXISTS'
- )
- );
-
- $query_args['orderby'] = 'full_name, display_name';
- $order = 'ASC';
- }
-
- } elseif ( in_array( $sortby, array( 'last_name', 'first_name' ) ) ) {
-
- $query_args['meta_key'] = $sortby;
- $query_args['orderby'] = 'meta_value';
-
- } else {
-
- if ( strstr( $sortby, '_desc' ) ) {
- $sortby = str_replace( '_desc', '', $sortby );
- $order = 'DESC';
- }
-
- if ( strstr( $sortby, '_asc' ) ) {
- $sortby = str_replace('_asc','',$sortby);
- $order = 'ASC';
- }
-
- $query_args['orderby'] = $sortby;
-
- }
-
- if ( isset( $order ) ) {
- $query_args['order'] = $order;
- }
-
- /**
- * UM hook
- *
- * @type filter
- * @title um_modify_sortby_parameter
- * @description Change query sort by attributes for search at Members Directory
- * @input_vars
- * [{"var":"$query_args","type":"array","desc":"Query Arguments"},
- * {"var":"$sortby","type":"string","desc":"Sort by"}]
- * @change_log
- * ["Since: 2.0"]
- * @usage
- *
- * @example
- *
- */
- $query_args = apply_filters( 'um_modify_sortby_parameter', $query_args, $sortby );
-
- }
-
- return $query_args;
-}
-//add_filter( 'um_prepare_user_query_args', 'um_prepare_user_query_args', 10, 2 );
\ No newline at end of file
+//add_filter( 'um_prepare_user_query_args', 'um_remove_special_users_from_list', 99, 2 );
\ No newline at end of file
diff --git a/includes/um-deprecated-functions.php b/includes/um-deprecated-functions.php
index 8cd8741a..ae8b5031 100644
--- a/includes/um-deprecated-functions.php
+++ b/includes/um-deprecated-functions.php
@@ -417,4 +417,25 @@ function um_time_diff( $time1, $time2 ) {
//um_deprecated_function( 'um_time_diff', '2.0.30', 'UM()->datetime()->time_diff' );
return UM()->datetime()->time_diff( $time1, $time2 );
+}
+
+
+/**
+ * Get members to show in directory
+ *
+ * @deprecated 2.1.0
+ *
+ *
+ * @param $argument
+ *
+ * @return mixed
+ */
+function um_members( $argument ) {
+ //um_deprecated_function( 'um_members', '2.1.0', 'UM()->member_directory()' );
+
+ $result = null;
+ if ( isset( UM()->members()->results[ $argument ] ) ) {
+ $result = UM()->members()->results[ $argument ];
+ }
+ return $result;
}
\ No newline at end of file
diff --git a/includes/um-short-functions.php b/includes/um-short-functions.php
index 3a6a048a..ed6d7e0c 100644
--- a/includes/um-short-functions.php
+++ b/includes/um-short-functions.php
@@ -1285,22 +1285,6 @@ function um_get_display_name( $user_id ) {
}
-/**
- * Get members to show in directory
- *
- * @param $argument
- *
- * @return mixed
- */
-function um_members( $argument ) {
- $result = null;
- if ( isset( UM()->members()->results[ $argument ] ) ) {
- $result = UM()->members()->results[ $argument ];
- }
- return $result;
-}
-
-
/**
* Clears the user data. You need to fetch a user manually after using this function.
*
diff --git a/templates/members-grid.php b/templates/members-grid.php
index bcf61381..f52d9328 100644
--- a/templates/members-grid.php
+++ b/templates/members-grid.php
@@ -1,140 +1,146 @@
\ No newline at end of file
diff --git a/templates/members-header.php b/templates/members-header.php
new file mode 100644
index 00000000..91d2ca5b
--- /dev/null
+++ b/templates/members-header.php
@@ -0,0 +1,18 @@
+
+
+
+
\ No newline at end of file
diff --git a/templates/members-list.php b/templates/members-list.php
index 5282f555..192d1efc 100644
--- a/templates/members-list.php
+++ b/templates/members-list.php
@@ -3,125 +3,130 @@