From 68ad3980b05f40d34acb1cf09622ff10a9ed2494 Mon Sep 17 00:00:00 2001 From: nikitasinelnikov Date: Fri, 16 Aug 2019 19:42:18 +0300 Subject: [PATCH] - member directory; --- assets/js/um-members.js | 1114 +++++++++++------ includes/class-init.php | 1 - includes/core/class-ajax-common.php | 3 + includes/core/class-member-directory.php | 1437 ++++++++++++++++++++++ includes/core/class-members.php | 1408 +-------------------- includes/core/um-actions-members.php | 255 ---- includes/core/um-filters-members.php | 156 +-- templates/_members-grid.php | 181 +++ templates/members-grid.php | 305 ++--- templates/members-pagination.php | 34 +- templates/members.php | 32 +- 11 files changed, 2629 insertions(+), 2297 deletions(-) delete mode 100644 includes/core/um-actions-members.php create mode 100644 templates/_members-grid.php diff --git a/assets/js/um-members.js b/assets/js/um-members.js index 4b290109..77ef51e5 100644 --- a/assets/js/um-members.js +++ b/assets/js/um-members.js @@ -2,148 +2,7 @@ var um_members_directory_busy = []; var um_member_directories = []; -//first page loading -jQuery( '.um-directory' ).each( function() { - var directory = jQuery(this); - um_member_directories.push( directory.data('hash') ); - - //show preloader at first - um_members_show_preloader( directory ); - - - - - if ( directory.find('.um-member-directory-sorting-options').length ) { - var sorting = directory.find('.um-member-directory-sorting-options').val(); - } - - var show_after_search = false; - //set search line from session storage - if ( directory.find('.um-search-line').length ) { - var general_search = directory.find('.um-search-line').val(); - } - - // if ( jQuery('#tmpl-um-members-filtered-line').length ) { - // var unique_id = um_members_get_unique_id( directory ); - // var filters_data = []; - // - // var filter_array = []; - // - // directory.find('.um-search-filter').each( function() { - // - // var filter = jQuery(this); - // var hoper, - // filter_name, - // query_value, - // filter_title, - // filter_range, - // filter_value_title; - // - // if( filter.find('input.um-datepicker-filter').length ) { - // hoper = 'datepicker'; - // - // filter.find('input.um-datepicker-filter').each(function() { - // var _this = jQuery(this); - // var obj = {}; - // - // if( _this.length ) { - // query_value = um_get_directory_storage( directory, 'filter_' + _this.data('filter_name') ); - // filter_name = _this.data('filter_name'); - // filter_range = _this.data('range'); - // - // if ( query_value !== null ) { - // if( query_value[filter_range] ) { - // obj.name = filter_name; - // obj.label = _this.attr('placeholder'); - // obj.range = filter_range; - // obj.value_title = _this.val(); - // filter_array.push(obj); - // } - // } - // } - // }); - // - // } else if( filter.find('select').length ) { - // hoper = 'select'; - // - // filter_name = filter.find('select').attr('name'); - // query_value = um_get_directory_storage( directory, 'filter_' + filter_name ); - // - // filter_title = filter.find('select').data('placeholder'); - // filter_value_title; - // - // } else if( filter.find('div.ui-slider').length ) { - // hoper = 'slider'; - // - // filter_name = filter.find('div.ui-slider').data('field_name'); - // query_value = um_get_directory_storage( directory, 'filter_' + filter_name ); - // - // filter_title = filter.find('div.um-slider-range').data('label'); - // filter_value_title; - // - // } - // - // if ( typeof( query_value ) != 'undefined' && query_value != null) { - // if ( typeof( query_value ) == 'string' ) { - // filter_value_title = filter.find('select option[value="' + query_value + '"]').data('value_label'); - // filters_data.push( {'name':filter_name, 'label':filter_title, 'value_label':filter_value_title, 'value':query_value, 'unique_id':unique_id} ); - // } else if( hoper == 'datepicker' ) { // после сформированных данных - // jQuery.each( filter_array, function(e) { - // var find = filters_data.find(function (item) { - // return item.name == filter_array[e].name && item.range == filter_array[e].range; - // }); - // if( typeof( find ) == 'undefined' ) { - // filters_data.push( - // { - // 'name':filter_array[e].name, - // 'range':filter_array[e].range, - // 'label':filter_array[e].label, - // 'value_label':filter_array[e].value_title, - // 'value':query_value[filter_array[e].range], - // 'unique_id':unique_id - // } - // ); - // } - // }) - // - // } else if( hoper == 'slider' ) { - // filter_value_title = query_value[0] + " - " + query_value[1]; - // filters_data.push( {'name':filter_name, 'label':filter_title, 'value_label': filter_value_title, 'value': query_value, 'unique_id':unique_id} ); - // } else { - // jQuery.each( query_value, function(e) { - // filter_value_title = filter.find('select option[value="' + query_value[e] + '"]').data('value_label'); - // filters_data.push( {'name': filter_name, 'label':filter_title, 'value_label':filter_value_title, 'value':query_value[e], 'unique_id':unique_id} ); - // }); - // } - // } - // }); - // - // - // directory.find('.um-members-filter-tag').remove(); - // - // var filters_template = wp.template( 'um-members-filtered-line' ); - // directory.find('.um-filtered-line').prepend( filters_template( {'filters': filters_data} ) ); - // - // if ( filters_data.length > 0 ) { - // directory.find('.um-filtered-line').show(); - // show_after_search = false; - // } else { - // directory.find('.um-filtered-line').hide(); - // show_after_search = true; - // } - // } - - if ( jQuery('#tmpl-um-members-filtered-line').length ) { - um_change_tag( directory ); - } - - if ( directory.data( 'only_search' ) > 0 && show_after_search ) { - um_members_hide_preloader( directory ); - return; - } - - um_ajax_get_members( directory ); -}); +var um_member_directory_last_data = []; function um_parse_current_url() { @@ -159,7 +18,8 @@ function um_parse_current_url() { } -function get_data_for_directory( hash, search_key ) { +function um_get_data_for_directory( directory, search_key ) { + var hash = um_members_get_hash( directory ); var data = {}; var url_data = um_parse_current_url(); @@ -172,11 +32,47 @@ function get_data_for_directory( hash, search_key ) { if ( ! search_key ) { return data; } else { + if ( typeof data[ search_key ] !== 'undefined' ) { + try { + data[ search_key ] = decodeURI( data[ search_key ] ); + } catch(e) { // catches a malformed URI + console.error(e); + } + } + return data[ search_key ]; } } +function um_set_url_from_data( directory, key, value ) { + var hash = um_members_get_hash( directory ); + var data = um_get_data_for_directory( directory ); + + var new_data = {}; + if ( value !== '' ) { + new_data[ key + '_' + hash ] = value; + } + jQuery.each( data, function( data_key ) { + if ( key === data_key ) { + if ( value !== '' ) { + new_data[ data_key + '_' + hash ] = value; + } + } else { + new_data[ data_key + '_' + hash ] = data[ data_key ]; + } + }); + + var query_strings = []; + jQuery.each( new_data, function( data_key ) { + query_strings.push( data_key + '=' + new_data[ data_key ] ); + }); + var query_string = '?' + query_strings.join( '&' ); + + window.history.pushState("string", "UM Member Directory", window.location.origin + window.location.pathname + query_string ); +} + + function um_members_get_hash( directory ) { return directory.data( 'hash' ); } @@ -220,64 +116,94 @@ function um_set_range_label( slider, ui ) { } -function um_ajax_get_members( directory ) { - var directory_id = directory.data('unique_id'); - directory_id = directory_id.replace("um-", ""); +function um_get_search( directory ) { + if ( directory.find('.um-search-line').length ) { + return directory.find( '.um-search-line' ).val(); + } else { + return ''; + } +} + +function um_get_sort( directory ) { + if ( directory.find('.um-member-directory-sorting-options').length ) { + return directory.find( '.um-member-directory-sorting-options' ).val(); + } else { + return ''; + } +} + +function um_get_current_page( directory ) { + var page = directory.data( 'page' ); + if ( ! page || typeof page == 'undefined' ) { + page = 1; + } + return page; +} + + +function um_ajax_get_members( directory, args ) { + + /** + * Operates with the next data: + * + * 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 - ????? + * + */ + + + var hash = um_members_get_hash( directory ); + var search = um_get_search( directory ); + var page = um_get_current_page( directory ); + var sorting = um_get_sort( directory ); var local_date = new Date(); var gmt_hours = -local_date.getTimezoneOffset()/60; - var request = { - page: um_get_directory_storage( directory, 'page' ), - args: window['um_members_args_' + directory_id], - gmt_offset: gmt_hours, - nonce: um_scripts.nonce, - referrer_url: window.location.href - }; + //var request =; - if ( directory.find('.um-member-directory-sorting-options').length ) { - request.sorting = um_get_directory_storage( directory, 'sorting' ); - } + // if ( directory.find('.um-search-filter').length ) { + // directory.find('.um-search-filter').each( function() { + // var filter = jQuery(this); + // + // if ( filter.find( '.um-slider' ).length ) { + // var filter_name = filter.find( '.um-slider' ).data('field_name'); + // var value = um_get_directory_storage( directory, 'filter_' + filter_name ); + // if ( value !== null ) { + // request[ filter_name ] = value; + // request['is_filters'] = true; + // } + // } else if ( filter.find( '.um-datepicker-filter' ).length ) { + // var filter_name = filter.find( '.um-datepicker-filter' ).data('filter_name'); + // var value = um_get_directory_storage( directory, 'filter_' + filter_name ); + // if ( value !== null ) { + // request[ filter_name ] = value; + // request['is_filters'] = true; + // } + // } else { + // var filter_name = filter.find('select').attr('name'); + // var value = um_get_directory_storage( directory, 'filter_' + filter_name ); + // if ( value !== null ) { + // request[ filter_name ] = value; + // request['is_filters'] = true; + // } + // } + // }); + // } - if ( directory.find('.um-search-line').length ) { - request.general_search = um_get_directory_storage( directory, 'general_search' ); - } - - if ( directory.find('.um-search-filter').length ) { - directory.find('.um-search-filter').each( function() { - var filter = jQuery(this); - - if ( filter.find( '.um-slider' ).length ) { - var filter_name = filter.find( '.um-slider' ).data('field_name'); - var value = um_get_directory_storage( directory, 'filter_' + filter_name ); - if ( value !== null ) { - request[ filter_name ] = value; - request['is_filters'] = true; - } - } else if ( filter.find( '.um-datepicker-filter' ).length ) { - var filter_name = filter.find( '.um-datepicker-filter' ).data('filter_name'); - var value = um_get_directory_storage( directory, 'filter_' + filter_name ); - if ( value !== null ) { - request[ filter_name ] = value; - request['is_filters'] = true; - } - } else { - var filter_name = filter.find('select').attr('name'); - var value = um_get_directory_storage( directory, 'filter_' + filter_name ); - if ( value !== null ) { - request[ filter_name ] = value; - request['is_filters'] = true; - } - } - }); - } - - return wp.ajax.send( 'um_get_members', { - data: request, + wp.ajax.send( 'um_get_members', { + data: { + directory_id: hash, + page: page, + search: search, + sorting: sorting, + nonce: um_scripts.nonce + }, success: function( answer ) { - //set last data hard for using on layouts reloading - um_set_directory_storage( directory, 'last_data', answer, true ); + um_member_directory_last_data[ hash ] = answer; um_build_template( directory, answer ); @@ -298,9 +224,10 @@ function um_ajax_get_members( directory ) { function um_build_template( directory, data ) { - var layout = um_get_directory_storage( directory, 'layout' ); + var layout = directory.data('view_type'); var template = wp.template( 'um-member-' + layout ); + directory.find('.um-members-grid, .um-members-list').remove(); directory.find('.um-members-wrapper').prepend( template( data ) ); directory.addClass('um-loaded'); @@ -332,14 +259,560 @@ function UM_Member_Grid( container ) { } } -jQuery(document).ready(function() { + + + +function um_change_tag( directory ) { + var unique_id = um_members_get_unique_id( directory ); + var filters_data = []; + var filter_array = []; + + directory.find('.um-search-filter').each( function() { + + var filter = jQuery(this); + var hoper, + filter_name, + query_value, + filter_title, + filter_range, + filter_value_title; + + if( filter.find('input.um-datepicker-filter').length ) { + hoper = 'datepicker'; + + filter.find('input.um-datepicker-filter').each(function() { + var _this = jQuery(this); + var obj = {}; + + if( _this.length ) { + query_value = um_get_directory_storage( directory, 'filter_' + _this.data('filter_name') ); + filter_name = _this.data('filter_name'); + filter_range = _this.data('range'); + + if ( query_value !== null ) { + if( query_value[filter_range] ) { + obj.name = filter_name; + obj.label = _this.attr('placeholder'); + obj.range = filter_range; + obj.value_title = _this.val(); + filter_array.push(obj); + } + } + } + }); + + } else if( filter.find('select').length ) { + hoper = 'select'; + + filter_name = filter.find('select').attr('name'); + query_value = um_get_directory_storage( directory, 'filter_' + filter_name ); + + filter_title = filter.find('select').data('placeholder'); + filter_value_title; + + } else if( filter.find('div.ui-slider').length ) { + hoper = 'slider'; + + filter_name = filter.find('div.ui-slider').data('field_name'); + query_value = um_get_directory_storage( directory, 'filter_' + filter_name ); + + filter_title = filter.find('div.um-slider-range').data('label'); + filter_value_title; + + } + + if ( typeof( query_value ) != 'undefined' && query_value != null) { + if ( typeof( query_value ) == 'string' ) { + filter_value_title = filter.find('select option[value="' + query_value + '"]').data('value_label'); + filters_data.push( {'name':filter_name, 'label':filter_title, 'value_label':filter_value_title, 'value':query_value, 'unique_id':unique_id} ); + } else if( hoper == 'datepicker' ) { // после сформированных данных + jQuery.each( filter_array, function(e) { + var find = filters_data.find(function (item) { + return item.name == filter_array[e].name && item.range == filter_array[e].range; + }); + if( typeof( find ) == 'undefined' ) { + filters_data.push( + { + 'name':filter_array[e].name, + 'range':filter_array[e].range, + 'label':filter_array[e].label, + 'value_label':filter_array[e].value_title, + 'value':query_value[filter_array[e].range], + 'unique_id':unique_id + } + ); + } + }) + + } else if( hoper == 'slider' ) { + filter_value_title = query_value[0] + " - " + query_value[1]; + filters_data.push( {'name':filter_name, 'label':filter_title, 'value_label': filter_value_title, 'value': query_value, 'unique_id':unique_id} ); + } else { + jQuery.each( query_value, function(e) { + filter_value_title = filter.find('select option[value="' + query_value[e] + '"]').data('value_label'); + filters_data.push( {'name': filter_name, 'label':filter_title, 'value_label':filter_value_title, 'value':query_value[e], 'unique_id':unique_id} ); + }); + } + } + }); + + directory.find('.um-members-filter-tag').remove(); + + var filters_template = wp.template( 'um-members-filtered-line' ); + directory.find('.um-filtered-line').prepend( filters_template( {'filters': filters_data} ) ); + + if ( filters_data.length > 0 ) { + directory.find('.um-filtered-line').show(); + show_after_search = false; + } else { + directory.find('.um-filtered-line').hide(); + show_after_search = true; + } + + if ( directory.find( '.um-members-filter-remove' ).length === 0 ) { + directory.find('.um-clear-filters-a').hide(); + } else { + directory.find('.um-clear-filters-a').show(); + } +} + + +jQuery(document).ready( function() { + + /** + * Change View Type Handlers + */ + + + //UI for change view type button + jQuery( document.body ).on( 'mouseover', '.um-member-directory-view-type', function() { + var $obj = jQuery(this).find('.um-member-directory-view-type-a:visible'); + + $obj.hide(); + + if ( $obj.next().length ) { + $obj.next().show().tipsy('show'); + } else { + jQuery(this).find( '.um-member-directory-view-type-a:first' ).show().tipsy('show'); + } + }).on( 'mouseout', '.um-member-directory-view-type', function() { + jQuery(this).find('.um-member-directory-view-type-a').hide().tipsy('hide'); + jQuery(this).find('.um-member-directory-view-type-a[data-type="' + jQuery(this).parents( '.um-directory' ).data('view_type') + '"]').show(); + }); + + //change layout handler + jQuery( document.body ).on( 'click', '.um-member-directory-view-type-a', function() { + var directory = jQuery(this).parents('.um-directory'); + if ( um_is_directory_busy( directory ) ) { + return false; + } + + var $this = jQuery(this); + var views = $this.parents('.um-member-directory-view-type'); + + var $obj = views.find('.um-member-directory-view-type-a:visible'); + + $obj.hide(); + + if ( $obj.next().length ) { + $obj.next().show().tipsy('show'); + } else { + views.find( '.um-member-directory-view-type-a:first' ).show().tipsy('show'); + } + + var data = um_member_directory_last_data[ um_members_get_hash( directory ) ]; + if ( data !== null ) { + var layout = $this.data('type'); + + um_set_url_from_data( directory, 'view_type', layout ); + directory.data( 'view_type', layout ); + + um_build_template( directory, data ); + } + }); + + + /** + * END: Change View Type Handlers + */ + + + /** + * General Search + */ + + + //searching + jQuery( document.body ).on( 'click', '.um-do-search', function() { + var directory = jQuery(this).parents('.um-directory'); + + if ( um_is_directory_busy( directory ) ) { + return; + } + + var pre_search = um_get_data_for_directory( directory, 'search' ); + + var search = directory.find('.um-search-line').val(); + if ( search === pre_search || ( search === '' && typeof pre_search == 'undefined' ) ) { + return; + } + + directory.data( 'general_search', search ); + um_set_url_from_data( directory, 'search', search ); + + //set 1st page after search + directory.data( 'page', 1 ); + um_set_url_from_data( directory, 'page', 1 ); + + um_ajax_get_members( directory ); + }); + + + //make search on Enter click + jQuery( document.body ).on( 'keypress', '.um-search-line', function(e) { + if ( e.which === 13 ) { + var directory = jQuery(this).parents('.um-directory'); + directory.find('.um-do-search').trigger('click'); + } + }); + + + /** + * END: General Search + */ + + + + /** + * Sorting + */ + + + jQuery( document.body ).on( 'change', '.um-member-directory-sorting-options', function() { + var directory = jQuery(this).parents('.um-directory'); + + if ( um_is_directory_busy( directory ) ) { + return; + } + + var sort = jQuery(this).val(); + + // + // var show_after_search = false; + // //set search line from session storage + // if ( directory.find('.um-search-line').length ) { + // var general_search = um_get_directory_storage( directory, 'general_search' ); + // if ( general_search === null ) { + // //show results after search + // show_after_search = true; + // } + // } + // + // if ( jQuery('#tmpl-um-members-filtered-line').length ) { + // var filters_data = []; + // directory.find('.um-search-filter').each( function() { + // var filter = jQuery(this); + // var filter_name = filter.find('select').attr('name'); + // var query_value = um_get_directory_storage( directory, 'filter_' + filter_name ); + // + // if ( typeof( query_value ) != 'undefined' ) { + // if ( typeof( query_value ) == 'string' ) { + // filters_data.push( {'name':filter_name} ); + // } else { + // jQuery.each( query_value, function() { + // filters_data.push( {'name': filter_name} ); + // }); + // } + // } + // }); + // + // show_after_search = ( filters_data.length <= 0 ); + // } + // + // if ( parseInt( directory.data( 'only_search' ) ) === 1 && show_after_search ) { + // return; + // } + + directory.data( 'sorting', jQuery(this).val() ); + um_set_url_from_data( directory, 'sort', sort ); + + um_ajax_get_members( directory ); + }); + + /** + * END: Sorting + */ + + + + /** + * Pagination + */ + + + jQuery( document.body ).on( 'click', '.um-directory .pagi:not(.current)', function() { + if ( jQuery(this).hasClass('disabled') ) { + return; + } + + var directory = jQuery(this).parents('.um-directory'); + if ( um_is_directory_busy( directory ) ) { + return; + } + + um_members_show_preloader( directory ); + + var page; + if ( 'first' === jQuery(this).data('page') ) { + page = 1; + } else if ( 'prev' === jQuery(this).data('page') ) { + page = directory.data( 'page' )*1 - 1; + } else if ( 'next' === jQuery(this).data('page') ) { + page = directory.data( 'page' )*1 + 1; + } else if ( 'last' === jQuery(this).data('page') ) { + page = parseInt( directory.data( 'total_pages' ) ); + } else { + page = parseInt( jQuery(this).data('page') ); + } + + if ( page === 1 ) { + directory.find('.pagi[data-page="first"], .pagi[data-page="prev"]').addClass('disabled'); + directory.find('.pagi[data-page="prev"], .pagi[data-page="last"]').removeClass('disabled'); + } else if ( page === parseInt( directory.data( 'total_pages' ) ) ) { + directory.find('.pagi[data-page="prev"], .pagi[data-page="last"]').addClass('disabled'); + directory.find('.pagi[data-page="first"], .pagi[data-page="prev"]').removeClass('disabled'); + } else { + directory.find('.pagi[data-page="prev"], .pagi[data-page="last"]').removeClass('disabled'); + directory.find('.pagi[data-page="first"], .pagi[data-page="prev"]').removeClass('disabled'); + } + + directory.find('.pagi').removeClass('current'); + directory.find('.pagi[data-page="' + page + '"]').addClass('current'); + + directory.data( 'page', page ); + um_set_url_from_data( directory, 'page', page ); + + um_ajax_get_members( directory ); + }); + + + //mobile pagination + jQuery( document.body ).on( 'change', '.um-directory .um-members-pagi-dropdown', function() { + var directory = jQuery(this).parents('.um-directory'); + + if ( um_is_directory_busy( directory ) ) { + return; + } + + var page = jQuery(this).val(); + + directory.find('.pagi').removeClass('current'); + directory.find('.pagi[data-page="' + page + '"]').addClass('current'); + + directory.data( 'page', page ); + um_set_url_from_data( directory, 'page', page ); + + um_ajax_get_members( directory ); + }); + + + /** + * END: Pagination + */ + + + /** + * Profile Cards actions + */ + + jQuery( document.body ).on('click', '.um-member-more a', function(e){ + e.preventDefault(); + + var block = jQuery(this).parents('.um-member'); + var container = jQuery(this).parents('.um-members'); + block.find('.um-member-more').hide(); + block.find('.um-member-meta').slideDown( function(){ UM_Member_Grid( container ) } ); + block.find('.um-member-less').fadeIn( ); + + setTimeout(function(){ UM_Member_Grid( container ) }, 100); + + return false; + }); + + jQuery( document.body ).on('click', '.um-member-less a', function(e){ + e.preventDefault(); + + var block = jQuery(this).parents('.um-member'); + var container = jQuery(this).parents('.um-members'); + block.find('.um-member-less').hide(); + block.find('.um-member-meta').slideUp( function() { + block.find('.um-member-more').fadeIn(); + UM_Member_Grid( container ); + }); + + return false; + }); + + /** + * END: Profile Cards actions + */ + + + /** + * First Page Loading + */ + + + //Init Directories + jQuery( '.um-directory' ).each( function() { + var directory = jQuery(this); + var hash = um_members_get_hash( directory ); + um_member_directories.push( hash ); + + var show_after_search = false; + var search = um_get_search( directory ); + if ( search && typeof search !== 'undefined' ) { + show_after_search = true; + } + + if ( ! ( directory.data( 'only_search' ) > 0 && show_after_search ) ) { + //show preloader at first + um_members_show_preloader( directory ); + } else { + return; + } + + um_ajax_get_members( directory ); + + // if ( jQuery('#tmpl-um-members-filtered-line').length ) { + // var unique_id = um_members_get_unique_id( directory ); + // var filters_data = []; + // + // var filter_array = []; + // + // directory.find('.um-search-filter').each( function() { + // + // var filter = jQuery(this); + // var hoper, + // filter_name, + // query_value, + // filter_title, + // filter_range, + // filter_value_title; + // + // if( filter.find('input.um-datepicker-filter').length ) { + // hoper = 'datepicker'; + // + // filter.find('input.um-datepicker-filter').each(function() { + // var _this = jQuery(this); + // var obj = {}; + // + // if( _this.length ) { + // query_value = um_get_directory_storage( directory, 'filter_' + _this.data('filter_name') ); + // filter_name = _this.data('filter_name'); + // filter_range = _this.data('range'); + // + // if ( query_value !== null ) { + // if( query_value[filter_range] ) { + // obj.name = filter_name; + // obj.label = _this.attr('placeholder'); + // obj.range = filter_range; + // obj.value_title = _this.val(); + // filter_array.push(obj); + // } + // } + // } + // }); + // + // } else if( filter.find('select').length ) { + // hoper = 'select'; + // + // filter_name = filter.find('select').attr('name'); + // query_value = um_get_directory_storage( directory, 'filter_' + filter_name ); + // + // filter_title = filter.find('select').data('placeholder'); + // filter_value_title; + // + // } else if( filter.find('div.ui-slider').length ) { + // hoper = 'slider'; + // + // filter_name = filter.find('div.ui-slider').data('field_name'); + // query_value = um_get_directory_storage( directory, 'filter_' + filter_name ); + // + // filter_title = filter.find('div.um-slider-range').data('label'); + // filter_value_title; + // + // } + // + // if ( typeof( query_value ) != 'undefined' && query_value != null) { + // if ( typeof( query_value ) == 'string' ) { + // filter_value_title = filter.find('select option[value="' + query_value + '"]').data('value_label'); + // filters_data.push( {'name':filter_name, 'label':filter_title, 'value_label':filter_value_title, 'value':query_value, 'unique_id':unique_id} ); + // } else if( hoper == 'datepicker' ) { // после сформированных данных + // jQuery.each( filter_array, function(e) { + // var find = filters_data.find(function (item) { + // return item.name == filter_array[e].name && item.range == filter_array[e].range; + // }); + // if( typeof( find ) == 'undefined' ) { + // filters_data.push( + // { + // 'name':filter_array[e].name, + // 'range':filter_array[e].range, + // 'label':filter_array[e].label, + // 'value_label':filter_array[e].value_title, + // 'value':query_value[filter_array[e].range], + // 'unique_id':unique_id + // } + // ); + // } + // }) + // + // } else if( hoper == 'slider' ) { + // filter_value_title = query_value[0] + " - " + query_value[1]; + // filters_data.push( {'name':filter_name, 'label':filter_title, 'value_label': filter_value_title, 'value': query_value, 'unique_id':unique_id} ); + // } else { + // jQuery.each( query_value, function(e) { + // filter_value_title = filter.find('select option[value="' + query_value[e] + '"]').data('value_label'); + // filters_data.push( {'name': filter_name, 'label':filter_title, 'value_label':filter_value_title, 'value':query_value[e], 'unique_id':unique_id} ); + // }); + // } + // } + // }); + // + // + // directory.find('.um-members-filter-tag').remove(); + // + // var filters_template = wp.template( 'um-members-filtered-line' ); + // directory.find('.um-filtered-line').prepend( filters_template( {'filters': filters_data} ) ); + // + // if ( filters_data.length > 0 ) { + // directory.find('.um-filtered-line').show(); + // show_after_search = false; + // } else { + // directory.find('.um-filtered-line').hide(); + // show_after_search = true; + // } + // } + + // if ( jQuery('#tmpl-um-members-filtered-line').length ) { + // um_change_tag( directory ); + // } + + // if ( directory.data( 'only_search' ) > 0 && show_after_search ) { + // um_members_hide_preloader( directory ); + // return; + // } + + //um_ajax_get_members( directory, {page: page, sorting: sort} ); + }); + //slider filter jQuery( '.um-slider' ).each( function() { var slider = jQuery( this ); var directory = jQuery(this).parents('.um-directory'); - var default_value = get_data_for_directory( um_members_get_hash( directory ), slider.data('field_name') ); + var default_value = um_get_data_for_directory( directory, slider.data('field_name') ); //var default_value = um_get_directory_storage( directory, 'filter_' + slider.data('field_name') ); @@ -402,8 +875,8 @@ jQuery(document).ready(function() { var filter_name = elem.data( 'filter_name' ); var range = elem.data( 'range' ); - var current_value = um_get_directory_storage( directory, 'filter_' + filter_name ); - if ( current_value === null ) { + var current_value = um_get_data_for_directory( directory, 'um-' + filter_name ); + if ( typeof current_value === "undefined" ) { current_value = {}; } @@ -411,33 +884,31 @@ jQuery(document).ready(function() { var change_val = elem.val(); if ( range === 'from' ) { - if( select_val !== null && !isNaN( select_val ) ) { + if( select_val !== null && ! isNaN( select_val ) ) { current_value.from = select_val; } else { - if( change_val == '' ) { + if ( change_val == '' ) { delete current_value.from; //console.warn('Elem val from: ' + change_val); } } } else if ( range === 'to' ) { - if( select_val !== null && !isNaN( select_val ) ) { + if( select_val !== null && ! isNaN( select_val ) ) { current_value.to = select_val; } else { - if( change_val == '' ) { + if ( change_val == '' ) { delete current_value.to; //console.warn('Elem val to: ' + change_val); } } } - um_set_directory_storage( directory, 'filter_' + filter_name, current_value, true ); - //set 1st page after filtration - um_set_directory_storage( directory, 'page', 1, true ); + //um_set_directory_storage( directory, 'page', 1, true ); um_ajax_get_members( directory ); - um_change_tag( directory ); + //um_change_tag( directory ); } }); @@ -445,10 +916,10 @@ jQuery(document).ready(function() { var $fname = elem.data('filter_name'); var $frange = elem.data('range'); var $directory = elem.parents('.um-directory'); - var query_value = um_get_directory_storage( $directory, 'filter_' + $fname ); - if ( query_value !== null ) { - if( typeof( query_value[$frange] ) !== 'undefined' ) { + var query_value = um_get_data_for_directory( $directory, 'um-' + $fname ); + if ( typeof query_value !== 'undefined' ) { + if ( typeof( query_value[$frange] ) !== 'undefined' ) { $picker.set( 'select', query_value[$frange]*1000 ); } } @@ -456,160 +927,113 @@ jQuery(document).ready(function() { }); - jQuery('.um-members').each(function(){ - UM_Member_Grid( jQuery(this) ); - }); - jQuery('.um-directory .um-member-connect').each(function(){ - if ( jQuery(this).find('a').length == 0 ) { - jQuery(this).remove(); - } - }); - - jQuery('.um-member-meta-main').each(function(){ - if ( jQuery(this).find('.um-member-metaline').length == 0 && jQuery(this).find('.um-member-connect').find('a').length == 0 ) { - jQuery(this).remove(); - } - }); + //timepicker filter + jQuery('.um-timepicker-filter').each( function() { + var elem = jQuery(this); - jQuery(document.body).on('click', '.um-member-more a', function(e){ - e.preventDefault(); + //using arrays formatted as [HOUR,MINUTE] - var block = jQuery(this).parents('.um-member'); - var container = jQuery(this).parents('.um-members'); - block.find('.um-member-more').hide(); - block.find('.um-member-meta').slideDown( function(){ UM_Member_Grid( container ) } ); - block.find('.um-member-less').fadeIn( ); - - setTimeout(function(){ UM_Member_Grid( container ) }, 100); + elem.pickatime({ + format: elem.data('format'), + interval: parseInt( elem.data('intervals') ), + min: elem.data('min'), + max: elem.data('max'), + formatSubmit: 'HH:i', + hiddenName: true, + onOpen: function() { elem.blur(); }, + onClose: function() { elem.blur(); }, + onSet: function( context ) { + var directory = elem.parents('.um-directory'); - return false; - }); + if ( um_is_directory_busy( directory ) ) { + return; + } - jQuery(document.body).on('click', '.um-member-less a', function(e){ - e.preventDefault(); + var filter_name = elem.data( 'filter_name' ); + var range = elem.data( 'range' ); - var block = jQuery(this).parents('.um-member'); - var container = jQuery(this).parents('.um-members'); - block.find('.um-member-less').hide(); - block.find('.um-member-meta').slideUp( function() { - block.find('.um-member-more').fadeIn(); - UM_Member_Grid( container ); - }); + var current_value = um_get_data_for_directory( directory, 'um-' + filter_name ); + if ( typeof current_value === "undefined" ) { + current_value = {}; + } - return false; - }); + var select_val = context.select / 1000; + var change_val = elem.val(); - jQuery(document.body).on('click', '.um-do-search', function(e){ - e.preventDefault(); - - jQuery(this).parents('form').find('input').filter(function(e){ - if ( this.value.length ===0 ) { - return true; - } - }).prop('disabled', true); - - - jQuery(this).parents('form').find('select').filter(function(e){ - if ( this.value.length ===0 ) { - return true; - } - }).prop('disabled', true); - jQuery(this).parents('form').submit(); - return false; - }); - - - - //change layout - jQuery( document.body ).on( 'click', '.um-member-directory-view-type-a', function() { - var directory = jQuery(this).parents('.um-directory'); - var $this = jQuery(this); - - if ( um_is_directory_busy( directory ) ) { - return false; - } - - var layout = um_get_directory_storage( directory, 'layout' ); - - var view_type = directory.find('.um-member-directory-view-type-a').parent(); - var summ_elem = jQuery(this).parent().find('.um-member-directory-view-type-a').length; - - var elem_next, - tooltip_title; - - view_type.find('.um-member-directory-view-type-a').each( function ( index, elem ) { - if( jQuery(elem).data('type') == layout ) { - if( index === summ_elem - 1) { - elem_next = jQuery(elem).parent().find('.um-member-directory-view-type-a').eq(0); - tooltip_title = jQuery(elem_next).next().attr('default-title'); - } else { - elem_next = jQuery(elem).parent().find('.um-member-directory-view-type-a').eq( index + 1 ); - if( index === summ_elem - 2) { - tooltip_title = jQuery(elem).parent().find('.um-member-directory-view-type-a').eq(0).attr('default-title'); + if ( range === 'from' ) { + if( select_val !== null && ! isNaN( select_val ) ) { + current_value.from = select_val; } else { - tooltip_title = jQuery(elem_next).next().attr('default-title'); - } - } - } - }); - - jQuery(this).parent().find('.um-member-directory-view-type-a').hide(); - elem_next.show(); - elem_next.attr( 'original-title', tooltip_title ); - layout = jQuery(elem_next).data('type'); - - um_set_directory_storage( directory, 'layout', layout, true ); - directory.data( 'view_type', layout ); - - var data = um_get_directory_storage( directory, 'last_data' ); - if ( data !== null ) { - um_build_template( directory, data ); - } else { - - var show_after_search = false; - //set search line from session storage - if ( directory.find('.um-search-line').length ) { - var general_search = um_get_directory_storage( directory, 'general_search' ); - if ( general_search === null ) { - //show results after search - show_after_search = true; - } - } - - if ( jQuery('#tmpl-um-members-filtered-line').length ) { - var filters_data = []; - directory.find('.um-search-filter').each( function() { - var filter = jQuery(this); - var filter_name = filter.find('select').attr('name'); - var query_value = um_get_directory_storage( directory, 'filter_' + filter_name ); - - if ( typeof( query_value ) != 'undefined' ) { - if ( typeof( query_value ) == 'string' ) { - filters_data.push( {'name':filter_name} ); - } else { - jQuery.each( query_value, function() { - filters_data.push( {'name': filter_name} ); - }); + if ( change_val == '' ) { + delete current_value.from; + //console.warn('Elem val from: ' + change_val); } } - }); + } else if ( range === 'to' ) { + if( select_val !== null && ! isNaN( select_val ) ) { + current_value.to = select_val; + } else { + if ( change_val == '' ) { + delete current_value.to; + //console.warn('Elem val to: ' + change_val); + } + } + } - show_after_search = ( filters_data.length <= 0 ); + //set 1st page after filtration + //um_set_directory_storage( directory, 'page', 1, true ); + + um_ajax_get_members( directory ); + + //um_change_tag( directory ); } - - if ( parseInt( directory.data( 'only_search' ) ) === 1 && show_after_search ) { - return; - } - - um_members_show_preloader( directory ); - um_ajax_get_members( directory ); - } + }); }); + // jQuery('.um-directory .um-member-connect').each(function(){ + // if ( jQuery(this).find('a').length == 0 ) { + // jQuery(this).remove(); + // } + // }); + // + // jQuery('.um-member-meta-main').each(function(){ + // if ( jQuery(this).find('.um-member-metaline').length == 0 && jQuery(this).find('.um-member-connect').find('a').length == 0 ) { + // jQuery(this).remove(); + // } + // }); + + + // jQuery(document.body).on('click', '.um-do-search', function(e){ + // e.preventDefault(); + // + // jQuery(this).parents('form').find('input').filter(function(e){ + // if ( this.value.length ===0 ) { + // return true; + // } + // }).prop('disabled', true); + // + // + // jQuery(this).parents('form').find('select').filter(function(e){ + // if ( this.value.length ===0 ) { + // return true; + // } + // }).prop('disabled', true); + // jQuery(this).parents('form').submit(); + // return false; + // }); + + + + + + + + + //filters controls jQuery('.um-member-directory-filters').click( function() { var search_bar = jQuery(this).parents('.um-directory').find('.um-search'); diff --git a/includes/class-init.php b/includes/class-init.php index 04780161..c3b13985 100644 --- a/includes/class-init.php +++ b/includes/class-init.php @@ -1452,7 +1452,6 @@ if ( ! class_exists( 'UM' ) ) { require_once 'core/um-actions-register.php'; require_once 'core/um-actions-profile.php'; require_once 'core/um-actions-account.php'; - require_once 'core/um-actions-members.php'; require_once 'core/um-actions-global.php'; require_once 'core/um-actions-user.php'; require_once 'core/um-actions-save-profile.php'; diff --git a/includes/core/class-ajax-common.php b/includes/core/class-ajax-common.php index 9fd939cb..5b1907af 100644 --- a/includes/core/class-ajax-common.php +++ b/includes/core/class-ajax-common.php @@ -54,6 +54,9 @@ if ( ! class_exists( 'um\core\AJAX_Common' ) ) { add_action( 'wp_ajax_nopriv_um_resize_image', array( UM()->files(), 'ajax_resize_image' ) ); add_action( 'wp_ajax_um_resize_image', array( UM()->files(), 'ajax_resize_image' ) ); + + add_action( 'wp_ajax_nopriv_um_get_members', array( UM()->member_directory(), 'ajax_get_members' ) ); + add_action( 'wp_ajax_um_get_members', array( UM()->member_directory(), 'ajax_get_members' ) ); } } } \ No newline at end of file diff --git a/includes/core/class-member-directory.php b/includes/core/class-member-directory.php index fee2bd41..7a8c8ba0 100644 --- a/includes/core/class-member-directory.php +++ b/includes/core/class-member-directory.php @@ -53,6 +53,12 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) { ); + /** + * @var + */ + var $query_args; + + /** * Member_Directory constructor. */ @@ -190,5 +196,1436 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) { ksort( $this->filter_fields ); } + + + /** + * 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( + 'country' => 'select', + 'gender' => 'select', + 'languages' => 'select', + 'role' => 'select', + 'birth_date' => 'slider', + 'last_login' => 'datepicker', + 'user_registered' => 'datepicker', + ) ); + + $field_key = $filter; + if ( $filter == 'last_login' ) { + $field_key = '_um_last_login'; + } + + $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 'date': + $value = 'datepicker'; + break; + case 'time': + $value = 'timepicker'; + break; + case 'select': + case 'multiselect': + case 'radio': + case 'checkbox': + $value = 'select'; + break; + case 'rating': + $value = 'slider'; + break; + } + } + } + + $filter_types = array_merge( $custom_fields_types, $filter_types ); + + if ( empty( $filter_types[ $filter ] ) ) { + return ''; + } + + 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() ); + } + + /** + * 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 ); + ob_start(); + + switch ( $filter_types[ $filter ] ) { + default: { + + do_action( "um_member_directory_filter_type_{$filter_types[ $filter ]}", $filter, $filter_types ); + + break; + } + case 'select': { + + if ( isset( $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; + } + } + } + } + + if ( ! empty( $attrs['custom_dropdown_options_source'] ) ) { + $attrs['custom'] = true; + $attrs['options'] = UM()->fields()->get_options_from_callback( $attrs, $attrs['type'] ); + } + + if ( isset( $attrs['label'] ) ) { + $attrs['label'] = strip_tags( $attrs['label'] ); + } + + if ( isset( $attrs['options'] ) && is_array( $attrs['options'] ) ) { + asort( $attrs['options'] ); + } + + $custom_dropdown = ! empty( $attrs['custom_dropdown_options_source'] ) ? ' data-um-ajax-source="' . $attrs['custom_dropdown_options_source'] . '"' : ''; + + if ( ! empty( $attrs['options'] ) || ! empty( $custom_dropdown ) ) { ?> + + + + slider_filters_range( $filter ); + $placeholder = $this->slider_range_placeholder( $filter ); + + if ( $range ) { ?> + + +
+
+ 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_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( min( $meta ), max( $meta ) ); + } + + $range = apply_filters( "um_member_directory_filter_{$filter}_slider", $range ); + + break; + } + case 'birth_date': { + global $wpdb; + $meta = $wpdb->get_col( "SELECT DISTINCT meta_value FROM {$wpdb->usermeta} WHERE meta_key='birth_date' ORDER BY meta_value DESC" ); + + if ( empty( $meta ) || count( $meta ) === 1 ) { + $range = false; + } elseif ( ! empty( $meta ) ) { + $range = array( $this->borndate( strtotime( $meta[0] ) ), $this->borndate( strtotime( $meta[ count( $meta ) - 1 ] ) ) ); + } + + break; + } + + } + + return $range; + } + + + + /** + * @param $filter + * + * @return mixed + */ + function slider_range_placeholder( $filter ) { + switch ( $filter ) { + default: { + $label = ucwords( str_replace(array('um_', '_'), array('', ' '), $filter) ); + $placeholder = apply_filters( "um_member_directory_filter_{$filter}_slider_range_placeholder", "$label: {min_range} - {max_range}" ); + break; + } + case 'birth_date': { + $placeholder = __( 'Age: {min_range} - {max_range} years old', 'ultimate-member' ); + break; + } + case 'user_rating': { + $placeholder = __( 'User Rating: {min_range} - {max_range} points', 'ultimate-member' ); + break; + } + } + + return $placeholder; + } + + + /** + * @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 ) ); + + 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)); + } + + + /** + * Must have a profile photo + * + * @param $args + */ + 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' => '!=' + ) + ); + + 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' => '!=' + ) ) ); + } + } + + + /** + * + */ + 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' => 'account_status', + 'value' => 'approved', + 'compare' => '=' + ) ) ); + } + + + /** + * + */ + function hide_by_role() { + $roles = um_user( 'can_view_roles' ); + $roles = maybe_unserialize( $roles ); + + if ( empty( $roles ) || ! UM()->roles()->um_user_can( 'can_view_all' ) ) { + 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; + } + + $meta_query = array( + "relation" => "OR", + array( + 'key' => 'hide_in_members', + 'value' => '', + 'compare' => 'NOT EXISTS' + ), + array( + "relation" => "AND", + array( + 'key' => 'hide_in_members', + 'value' => __( 'Yes', 'ultimate-member' ), + 'compare' => 'NOT LIKE' + ), + array( + 'key' => 'hide_in_members', + 'value' => 'Yes', + 'compare' => 'NOT LIKE' + ), + ), + ); + + $this->query_args['meta_query'] = array_merge( $this->query_args['meta_query'], array( $meta_query ) ); + } + + + /** + * @param $args + */ + function sorting_query( $args ) { + // sort members by + $this->query_args['order'] = 'ASC'; + $sortby = ! empty( $_POST['sorting'] ) ? $_POST['sorting'] : $args['sortby']; + + if ( $sortby == 'other' && $args['sortby_custom'] ) { + + $this->query_args['meta_key'] = $args['sortby_custom']; + $this->query_args['orderby'] = 'meta_value, display_name'; + + } 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' ) ) ) { + + $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'] ); + + } else { + + 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['orderby'] = $sortby; + if ( isset( $order ) ) { + $this->query_args['order'] = $order; + } + + add_filter( 'pre_user_query', array( &$this, 'sortby_randomly' ), 10, 1 ); + } + + + /** + * 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 + * + */ + $this->query_args = apply_filters( 'um_modify_sortby_parameter', $this->query_args, $sortby ); + } + + + /** + * Sorting random + * + * @param object $query + * + * @return mixed + */ + function sortby_randomly( $query ) { + if ( 'random' == $query->query_vars['orderby'] ) { + + if ( um_is_session_started() === false ) { + @session_start(); + } + + // Reset seed on load of initial + if ( ! isset( $_REQUEST['members_page'] ) || $_REQUEST['members_page'] == 0 || $_REQUEST['members_page'] == 1 ) { + if ( isset( $_SESSION['seed'] ) ) { + unset( $_SESSION['seed'] ); + } + } + + // Get seed from session variable if it exists + $seed = false; + if ( isset( $_SESSION['seed'] ) ) { + $seed = $_SESSION['seed']; + } + + // Set new seed if none exists + if ( ! $seed ) { + $seed = rand(); + $_SESSION['seed'] = $seed; + } + + + $query->query_orderby = 'ORDER by RAND(' . $seed . ')'; + } + + return $query; + } + + + function general_search() { + //general search + if ( ! empty( $_POST['search'] ) ) { + $this->query_args['meta_query'][] = array( + 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', + ); + } + } + + + /** + * Change mySQL meta query join attribute + * for search only by UM user meta fields + * + * @param array $sql Array containing the query's JOIN and WHERE clauses. + * @param $queries + * @param $type + * @param $primary_table + * @param $primary_id_column + * @param \WP_User_Query $context + * + * @return mixed + */ + 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 ) ) { + + preg_match( + '/^(.*).meta_value LIKE \'%' . esc_attr( $search ) . '%\' [^\)]/im', + $sql['where'], + $join_matches + ); + + if ( isset( $join_matches[1] ) ) { + $meta_join_for_search = trim( $join_matches[1] ); + + $sql['join'] = preg_replace( + '/(' . $meta_join_for_search . ' ON \( ' . $wpdb->users . '\.ID = ' . $meta_join_for_search . '\.user_id )(\))/im', + "$1 AND " . $meta_join_for_search . ".meta_key IN( '" . implode( "','", array_keys( UM()->builtin()->all_user_fields ) ) . "' ) $2", + $sql['join'] + ); + } + + // 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 = preg_replace( '/ AND \((.*?)\)/im', " OR $1", $search_where ); + + $sql['where'] = $sql['where'] . $search_where; + } + } + + return $sql; + } + + + /** + * + */ + function filters( $args ) { + //filters + $query = $_POST; + if ( ! empty( $args['search_filters'] ) ) { + parse_str( $args['search_filters'], $search_filters ); + if ( ! empty( $search_filters ) && is_array( $search_filters ) ) { + $query = array_merge( $search_filters, $query ); + } + } + + unset( $query['search'] ); + unset( $query['directory_id'] ); + unset( $query['sorting'] ); + unset( $query['page'] ); + unset( $query['args'] ); + unset( $query['members_page'] ); + unset( $query['action'] ); + unset( $query['nonce'] ); + unset( $query['referrer_url'] ); + unset( $query['is_filters'] ); + + if ( ! empty( $query ) && is_array( $query ) ) { + foreach ( $query as $field => $value ) { + + //$filter_data = UM()->members()->prepare_filter( $field ); + + if ( $value && $field != 'um_search' && $field != 'page_id' ) { + + if ( strstr( $field, 'role_' ) ) { + $field = 'role'; + } + + if ( ! in_array( $field, UM()->members()->core_search_fields ) ) { + + 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 ); + //} + } + + /** + * UM hook + * + * @type filter + * @title um_query_args_{$field}__filter + * @description Change field's query for search at Members Directory + * @input_vars + * [{"var":"$field_query","type":"array","desc":"Field query"}] + * @change_log + * ["Since: 2.0"] + * @usage + * + * @example + * + */ + $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 ) ); + } + + } + + } + + } + } + + $query = UM()->permalinks()->get_query_array(); + $arr_columns = array(); + + foreach ( UM()->members()->core_search_fields as $key ) { + if ( ! empty( $query[ $key ] ) ) { + $arr_columns[] = $key; + $this->query_args['search'] = '*' . $query[ $key ] .'*'; + } + } + + if ( ! empty( $arr_columns ) ) { + $this->query_args['search_columns'] = $arr_columns; + } + } + + + 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; + } + + + function get_type_basename( $type ) { + return apply_filters( "um_member_directory_{$type}_type_template_basename", '' ); + } + + + /** + * get AJAX results members + */ + 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'] ); + + $post_data = UM()->query()->post_data( $directory_id ); + + $args = array_merge( $post_data, $args ); + + /** + * @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; + } + + $this->query_args = 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 ); + + $this->cover_photo_query( $args ); + + // 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; + } + } + + $this->query_args['include'] = $users_array; + } + + $this->hide_not_approved(); + + $this->hide_by_role(); + + $this->hide_by_account_settings(); + + $this->sorting_query( $args ); + + $this->general_search(); + + //$this->filters( $args ); + + /** + * UM hook + * + * @type filter + * @title um_prepare_user_query_args + * @description Extend member directory query arguments + * @input_vars + * [{"var":"$query_args","type":"array","desc":"Members Query Arguments"}, + * {"var":"$directory_settings","type":"array","desc":"Member Directory Settings"}] + * @change_log + * ["Since: 2.0"] + * @usage + * + * @example + * + */ + $this->query_args = apply_filters( 'um_prepare_user_query_args', $this->query_args, $args ); + + //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 + * + * @type action + * @title um_user_before_query + * @description Action before users query on member directory + * @input_vars + * [{"var":"$query_args","type":"array","desc":"Query arguments"}] + * @change_log + * ["Since: 2.0"] + * @usage add_action( 'um_user_before_query', 'function_name', 10, 1 ); + * @example + * + */ + do_action( 'um_user_before_query', $this->query_args ); + + add_filter( 'get_meta_sql', array( &$this, 'change_meta_sql' ), 10, 6 ); + + $users = new \WP_User_Query( $this->query_args ); + + //var_dump($users->request); + + remove_filter( 'get_meta_sql', array( &$this, 'change_meta_sql' ), 10 ); + + /** + * UM hook + * + * @type action + * @title um_user_after_query + * @description Action before users query on member directory + * @input_vars + * [{"var":"$query_args","type":"array","desc":"Query arguments"}, + * {"var":"$users","type":"array","desc":"Users"}] + * @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 ); + + $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 ); + + 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 + ); + } + + /** + * UM hook + * + * @type filter + * @title um_prepare_user_results_array + * @description Extend member directory query result + * @input_vars + * [{"var":"$result","type":"array","desc":"Members Query Result"}] + * @change_log + * ["Since: 2.0"] + * @usage + * + * @example + * + */ + $users = apply_filters( 'um_prepare_user_results_array', $user_ids ); + + $sizes = UM()->options()->get( 'cover_thumb_sizes' ); + $cover_size = UM()->mobile()->isTablet() ? $sizes[1] : $sizes[0]; + + $users_data = array(); + foreach ( $users as $user_id ) { + um_fetch_user( $user_id ); + + $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(); + } + + um_reset_user(); + + $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, + ); + + $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; + } } } \ No newline at end of file diff --git a/includes/core/class-members.php b/includes/core/class-members.php index ef3dd8b1..91413161 100644 --- a/includes/core/class-members.php +++ b/includes/core/class-members.php @@ -21,12 +21,6 @@ if ( ! class_exists( 'um\core\Members' ) ) { var $results; - /** - * @var - */ - var $query_args; - - /** * Members constructor. */ @@ -37,9 +31,10 @@ if ( ! class_exists( 'um\core\Members' ) ) { $this->core_search_fields = array( 'user_login', - 'username', + 'user_url', 'display_name', 'user_email', + 'user_nicename', ); add_filter( 'um_search_select_fields', array( &$this, 'um_search_select_fields' ), 10, 1 ); @@ -48,355 +43,73 @@ if ( ! class_exists( 'um\core\Members' ) ) { /** - * @param $borndate + * Show filter * - * @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)); - } - - - /** - * Render member's directory - * filters selectboxes + * @todo make UM:Groups members list via general directory * - * @param string $filter - * @return string $filter + * @deprecated since 2.1.0 - Use only in UM Groups extension + * @param $filter */ function show_filter( $filter ) { - - $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', - ) ); - - $field_key = $filter; - if ( $filter == 'last_login' ) { - $field_key = '_um_last_login'; - } - - $fields = UM()->builtin()->all_user_fields; - - $custom_fields_types = array_flip( array_keys( UM()->member_directory()->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 'date': - $value = 'datepicker'; - break; - case 'time': - $value = 'timepicker'; - break; - case 'select': - case 'multiselect': - case 'radio': - case 'checkbox': - $value = 'select'; - break; - case 'rating': - $value = 'slider'; - break; - } - } - } - - $filter_types = array_merge( $custom_fields_types, $filter_types ); - - //var_dump( $filter_types ); - - - if ( empty( $filter_types[ $filter ] ) ) { - return ''; - } - - 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() ); - } - /** - * 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 - * + * @var $type + * @var $attrs */ - $attrs = apply_filters( 'um_search_fields', $attrs ); - ob_start(); + extract( $this->prepare_filter( $filter ) ); - switch ( $filter_types[ $filter ] ) { - default: { + switch ( $type ) { - do_action( "um_member_directory_filter_type_{$filter_types[ $filter ]}", $filter, $filter_types ); - - break; - } - case 'select': { - - if ( isset( $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; - } - } - } - } - - if ( ! empty( $attrs['custom_dropdown_options_source'] ) ) { - $attrs['custom'] = true; - $attrs['options'] = UM()->fields()->get_options_from_callback( $attrs, $attrs['type'] ); - } - - if ( isset( $attrs['label'] ) ) { - $attrs['label'] = strip_tags( $attrs['label'] ); - } - - if ( isset( $attrs['options'] ) && is_array( $attrs['options'] ) ) { + 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'] : ''; + } ?> - $custom_dropdown = ! empty( $attrs['custom_dropdown_options_source'] ) ? ' data-um-ajax-source="' . $attrs['custom_dropdown_options_source'] . '"' : ''; + > + $v ) { - + $v = stripslashes( $v ); - $v ) { + $opt = $v; - $v = stripslashes( $v ); + if ( strstr( $filter, 'role_' ) ) { + $opt = $k; + } - $opt = $v; - - if ( strstr( $filter, 'role_' ) ) { - $opt = $k; - } - - if ( isset( $attrs['custom'] ) ) { - $opt = $k; - } ?> - - - - - + - + + + + slider_filters_range( $filter ); - $placeholder = $this->slider_range_placeholder( $filter ); - if ( $range ) { ?> - - -
-
- + + + datepicker_filters_range( $filter ); - - if ( $range ) { ?> - - - - - get_col( "SELECT DISTINCT meta_value FROM {$wpdb->usermeta} WHERE meta_key='birth_date' ORDER BY meta_value DESC" ); - - if ( empty( $meta ) || count( $meta ) === 1 ) { - $range = false; - } elseif ( ! empty( $meta ) ) { - $range = array( $this->borndate( strtotime( $meta[0] ) ), $this->borndate( strtotime( $meta[ count( $meta ) - 1 ] ) ) ); - } - - break; - } } - return $range; - } - - - - /** - * @param $filter - * - * @return mixed - */ - function slider_range_placeholder( $filter ) { - switch ( $filter ) { - default: { - $label = ucwords( str_replace(array('um_', '_'), array('', ' '), $filter) ); - $placeholder = apply_filters( "um_member_directory_filter_{$filter}_slider_range_placeholder", "$label: {min_range} - {max_range}" ); - break; - } - case 'birth_date': { - $placeholder = __( 'Age: {min_range} - {max_range} years old', 'ultimate-member' ); - break; - } - case 'user_rating': { - $placeholder = __( 'User Rating: {min_range} - {max_range} points', 'ultimate-member' ); - break; - } - } - - return $placeholder; - } - - - /** - * @param $filter - * - * @return mixed - */ - function datepicker_filters_range( $filter ) { - global $wpdb; - - switch ( $filter ) { - - default: { - $range = apply_filters( "um_member_directory_filter_{$filter}_datepicker", false ); - - 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; } @@ -620,242 +333,6 @@ if ( ! class_exists( 'um\core\Members' ) ) { } - /** - * Generate a loop of results - * - * @param $args - * - * @return mixed|void - */ - function get_members( $args ) { - - global $wpdb, $post; - - /** - * @var $profiles_per_page - * @var $profiles_per_page_mobile - */ - extract( $args ); - - /** - * UM hook - * - * @type filter - * @title um_prepare_user_query_args - * @description Extend member directory query arguments - * @input_vars - * [{"var":"$query_args","type":"array","desc":"Members Query Arguments"}, - * {"var":"$directory_settings","type":"array","desc":"Member Directory Settings"}] - * @change_log - * ["Since: 2.0"] - * @usage - * - * @example - * - */ - $query_args = apply_filters( 'um_prepare_user_query_args', array(), $args ); - - // Prepare for BIG SELECT query - $wpdb->query( 'SET SQL_BIG_SELECTS=1' ); - - // number of profiles for mobile - if ( UM()->mobile()->isMobile() && isset( $profiles_per_page_mobile ) ) { - $profiles_per_page = $profiles_per_page_mobile; - } - - $query_args['number'] = $profiles_per_page; - - if ( isset( $args['number'] ) ) { - $query_args['number'] = $args['number']; - } - - if ( isset( $args['page'] ) ) { - $members_page = $args['page']; - } else { - $members_page = isset( $_REQUEST['members_page'] ) ? $_REQUEST['members_page'] : 1; - } - - $query_args['paged'] = $members_page; - - if ( ! UM()->roles()->um_user_can( 'can_view_all' ) && is_user_logged_in() ) { - //unset( $query_args ); - $query_args = array(); - } - - /** - * UM hook - * - * @type action - * @title um_user_before_query - * @description Action before users query on member directory - * @input_vars - * [{"var":"$query_args","type":"array","desc":"Query arguments"}] - * @change_log - * ["Since: 2.0"] - * @usage add_action( 'um_user_before_query', 'function_name', 10, 1 ); - * @example - * - */ - do_action( 'um_user_before_query', $query_args ); - - $users = new \WP_User_Query( $query_args ); - /** - * UM hook - * - * @type action - * @title um_user_after_query - * @description Action before users query on member directory - * @input_vars - * [{"var":"$query_args","type":"array","desc":"Query arguments"}, - * {"var":"$users","type":"array","desc":"Users"}] - * @change_log - * ["Since: 2.0"] - * @usage add_action( 'um_user_after_query', 'function_name', 10, 2 ); - * @example - * - */ - do_action( 'um_user_after_query', $query_args, $users ); - - - $array['users'] = ! empty( $users->results ) ? $users->results : array(); - - $array['total_users'] = ( isset( $max_users ) && $max_users && $max_users <= $users->total_users ) ? $max_users : $users->total_users; - - $array['page'] = $members_page; - - if ( isset( $profiles_per_page ) && $profiles_per_page > 0 ) { - $array['total_pages'] = ceil( $array['total_users'] / $profiles_per_page ); - } else { - $array['total_pages'] = 1; - } - - $array['header'] = $this->convert_tags( $header, $array ); - $array['header_single'] = $this->convert_tags( $header_single, $array ); - - $array['users_per_page'] = $array['users']; - - for ( $i = $array['page']; $i <= $array['page'] + 2; $i++ ) { - if ( $i <= $array['total_pages'] ) { - $pages_to_show[] = $i; - } - } - - if ( isset( $pages_to_show ) && count( $pages_to_show ) < 5 ) { - $pages_needed = 5 - count( $pages_to_show ); - - for ( $c = $array['page']; $c >= $array['page'] - 2; $c-- ) { - if ( ! in_array( $c, $pages_to_show ) && $c > 0 ) { - $pages_to_add[] = $c; - } - } - } - - if ( isset( $pages_to_add ) ) { - - asort( $pages_to_add ); - $pages_to_show = array_merge( (array) $pages_to_add, $pages_to_show ); - - if ( count( $pages_to_show ) < 5 ) { - if ( max( $pages_to_show ) - $array['page'] >= 2 ) { - $pages_to_show[] = max( $pages_to_show ) + 1; - if ( count( $pages_to_show ) < 5 ) { - $pages_to_show[] = max( $pages_to_show ) + 1; - } - } else if ( $array['page'] - min( $pages_to_show ) >= 2 ) { - $pages_to_show[] = min( $pages_to_show ) - 1; - if ( count( $pages_to_show ) < 5 ) { - $pages_to_show[] = min( $pages_to_show ) - 1; - } - } - } - - asort( $pages_to_show ); - - $array['pages_to_show'] = $pages_to_show; - - } else { - - if ( isset( $pages_to_show ) && count( $pages_to_show ) < 5 ) { - if ( max( $pages_to_show ) - $array['page'] >= 2 ) { - $pages_to_show[] = max( $pages_to_show ) + 1; - if ( count( $pages_to_show ) < 5 ) { - $pages_to_show[] = max( $pages_to_show ) + 1; - } - } elseif ( $array['page'] - min( $pages_to_show ) >= 2 ) { - $pages_to_show[] = min( $pages_to_show ) - 1; - if ( count( $pages_to_show ) < 5 ) { - $pages_to_show[] = min( $pages_to_show ) - 1; - } - } - } - - if ( isset( $pages_to_show ) && is_array( $pages_to_show ) ) { - - asort( $pages_to_show ); - - $array['pages_to_show'] = $pages_to_show; - - } - - } - - if ( isset( $array['pages_to_show'] ) ) { - - if ( $array['total_pages'] < count( $array['pages_to_show'] ) ) { - foreach ( $array['pages_to_show'] as $k => $v ) { - if ( $v > $array['total_pages'] ) unset( $array['pages_to_show'][ $k ] ); - } - } - - foreach ( $array['pages_to_show'] as $k => $v ) { - if ( (int) $v <= 0 ) { - unset( $array['pages_to_show'][ $k ] ); - } - } - - } - - /** - * UM hook - * - * @type filter - * @title um_prepare_user_results_array - * @description Extend member directory query result - * @input_vars - * [{"var":"$result","type":"array","desc":"Members Query Result"}] - * @change_log - * ["Since: 2.0"] - * @usage - * - * @example - * - */ - return apply_filters( 'um_prepare_user_results_array', $array ); - } - - /** * Optimizes Member directory with multiple LEFT JOINs * @param object $vars @@ -905,806 +382,5 @@ if ( ! class_exists( 'um\core\Members' ) ) { return $vars; } - - - - /** - * Must have a profile photo - * - * @param $args - */ - 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' => '!=' - ) - ); - - 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' => '!=' - ) ) ); - } - } - - - /** - * - */ - 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' => 'account_status', - 'value' => 'approved', - 'compare' => '=' - ) ) ); - } - - - /** - * - */ - function hide_by_role() { - $roles = um_user( 'can_view_roles' ); - $roles = maybe_unserialize( $roles ); - - if ( empty( $roles ) || ! UM()->roles()->um_user_can( 'can_view_all' ) ) { - 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; - } - - $meta_query = array( - "relation" => "OR", - array( - 'key' => 'hide_in_members', - 'value' => '', - 'compare' => 'NOT EXISTS' - ), - array( - "relation" => "AND", - array( - 'key' => 'hide_in_members', - 'value' => __( 'Yes', 'ultimate-member' ), - 'compare' => 'NOT LIKE' - ), - array( - 'key' => 'hide_in_members', - 'value' => 'Yes', - 'compare' => 'NOT LIKE' - ), - ), - ); - - $this->query_args['meta_query'] = array_merge( $this->query_args['meta_query'], array( $meta_query ) ); - } - - - /** - * @param $args - */ - function sorting_query( $args ) { - // sort members by - $this->query_args['order'] = 'ASC'; - $sortby = ! empty( $_POST['sorting'] ) ? $_POST['sorting'] : $args['sortby']; - - if ( $sortby == 'other' && $args['sortby_custom'] ) { - - $this->query_args['meta_key'] = $args['sortby_custom']; - $this->query_args['orderby'] = 'meta_value, display_name'; - - } elseif ( in_array( $sortby, array( 'last_name', 'first_name' ) ) ) { - - $this->query_args['meta_key'] = $sortby; - $this->query_args['orderby'] = 'meta_value'; - - } elseif ( $sortby == 'last_login' ) { - - $this->query_args['meta_key'] = '_um_last_login'; - $this->query_args['orderby'] = 'meta_value_num'; - $this->query_args['order'] = 'desc'; - - } else { - - 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['orderby'] = $sortby; - if ( isset( $order ) ) { - $this->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 - * - */ - $this->query_args = apply_filters( 'um_modify_sortby_parameter', $this->query_args, $sortby ); - } - - - function general_search() { - //general search - if ( ! empty( $_POST['general_search'] ) ) { - $meta_query = array( - array( - 'value' => trim( $_POST['general_search'] ), - 'compare' => '=', - ), - array( - 'value' => trim( $_POST['general_search'] ), - 'compare' => 'LIKE', - ), - array( - 'value' => trim( serialize( strval( $_POST['general_search'] ) ) ), - 'compare' => 'LIKE', - ), - 'relation' => 'OR', - ); - - $this->query_args['meta_query'] = array_merge( $this->query_args['meta_query'], array( $meta_query ) ); - } - } - - - /** - * - */ - function filters( $args ) { - //filters - $query = $_POST; - if ( ! empty( $args['search_filters'] ) ) { - parse_str( $args['search_filters'], $search_filters ); - if ( ! empty( $search_filters ) && is_array( $search_filters ) ) { - $query = array_merge( $search_filters, $query ); - } - } - - unset( $query['sorting'] ); - unset( $query['page'] ); - unset( $query['args'] ); - unset( $query['members_page'] ); - unset( $query['general_search'] ); - unset( $query['action'] ); - unset( $query['nonce'] ); - unset( $query['referrer_url'] ); - unset( $query['is_filters'] ); - - if ( ! empty( $query ) && is_array( $query ) ) { - foreach ( $query as $field => $value ) { - - //$filter_data = UM()->members()->prepare_filter( $field ); - - if ( $value && $field != 'um_search' && $field != 'page_id' ) { - - if ( strstr( $field, 'role_' ) ) { - $field = 'role'; - } - - if ( ! in_array( $field, UM()->members()->core_search_fields ) ) { - - 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 ); - //} - } - - /** - * UM hook - * - * @type filter - * @title um_query_args_{$field}__filter - * @description Change field's query for search at Members Directory - * @input_vars - * [{"var":"$field_query","type":"array","desc":"Field query"}] - * @change_log - * ["Since: 2.0"] - * @usage - * - * @example - * - */ - $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 ) ); - } - - } - - } - - } - } - - $query = UM()->permalinks()->get_query_array(); - $arr_columns = array(); - - foreach ( UM()->members()->core_search_fields as $key ) { - if ( ! empty( $query[ $key ] ) ) { - $arr_columns[] = $key; - $this->query_args['search'] = '*' . $query[ $key ] .'*'; - } - } - - if ( ! empty( $arr_columns ) ) { - $this->query_args['search_columns'] = $arr_columns; - } - } - - - /** - * get AJAX results members - */ - 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 ); - - /** - * @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['general_search'] ) || ! empty( $_POST['is_filters'] ) || ! empty( $args['search_filters'] ) ) { - $data_args['show_count'] = true; - } - - $this->query_args = 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 ); - - $this->cover_photo_query( $args ); - - // 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; - } - } - - $this->query_args['include'] = $users_array; - } - - $this->hide_not_approved(); - - $this->hide_by_role(); - - $this->hide_by_account_settings(); - - $this->sorting_query( $args ); - - $this->general_search(); - - $this->filters( $args ); - - /** - * UM hook - * - * @type filter - * @title um_prepare_user_query_args - * @description Extend member directory query arguments - * @input_vars - * [{"var":"$query_args","type":"array","desc":"Members Query Arguments"}, - * {"var":"$directory_settings","type":"array","desc":"Member Directory Settings"}] - * @change_log - * ["Since: 2.0"] - * @usage - * - * @example - * - */ - $this->query_args = apply_filters( 'um_prepare_user_query_args', $this->query_args, $args ); - - //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 - * - * @type action - * @title um_user_before_query - * @description Action before users query on member directory - * @input_vars - * [{"var":"$query_args","type":"array","desc":"Query arguments"}] - * @change_log - * ["Since: 2.0"] - * @usage add_action( 'um_user_before_query', 'function_name', 10, 1 ); - * @example - * - */ - do_action( 'um_user_before_query', $this->query_args ); - - add_filter( 'get_meta_sql', array( &$this, 'change_meta_sql' ), 10 ); - - $users = new \WP_User_Query( $this->query_args ); - - remove_filter( 'get_meta_sql', array( &$this, 'change_meta_sql' ), 10 ); - - /** - * UM hook - * - * @type action - * @title um_user_after_query - * @description Action before users query on member directory - * @input_vars - * [{"var":"$query_args","type":"array","desc":"Query arguments"}, - * {"var":"$users","type":"array","desc":"Users"}] - * @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 ); - - $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 ); - - 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 - ); - } - - /** - * UM hook - * - * @type filter - * @title um_prepare_user_results_array - * @description Extend member directory query result - * @input_vars - * [{"var":"$result","type":"array","desc":"Members Query Result"}] - * @change_log - * ["Since: 2.0"] - * @usage - * - * @example - * - */ - $users = apply_filters( 'um_prepare_user_results_array', $user_ids ); - - $sizes = UM()->options()->get( 'cover_thumb_sizes' ); - $cover_size = UM()->mobile()->isTablet() ? $sizes[1] : $sizes[0]; - - $users_data = array(); - foreach ( $users as $user_id ) { - um_fetch_user( $user_id ); - - $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(); - - $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' => UM()->fields()->show_social_urls( false ), - '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(); - } - - um_reset_user(); - - $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, - ); - - $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 ) ); - } - - } } \ No newline at end of file diff --git a/includes/core/um-actions-members.php b/includes/core/um-actions-members.php deleted file mode 100644 index b0d1ae79..00000000 --- a/includes/core/um-actions-members.php +++ /dev/null @@ -1,255 +0,0 @@ - $testfilter ) { - if ( $testfilter && ! in_array( $testfilter, (array) $search_filters ) ) { - $search_filters[] = $testfilter; - } - } - } - - /** - * UM hook - * - * @type filter - * @title um_frontend_member_search_filters - * @description Extend Member Directory Search filter - * @input_vars - * [{"var":"$search_filters","type":"array","desc":"Search Filters"}] - * @change_log - * ["Since: 2.0"] - * @usage - * - * @example - * - */ - $search_filters = apply_filters( 'um_frontend_member_search_filters', $search_filters ); - - if ( $args['search'] == 1 && is_array( $search_filters ) ) { // search on - - $current_user_roles = um_user( 'roles' ); - if ( ! empty( $args['roles_can_search'] ) && ( empty( $current_user_roles ) || count( array_intersect( $current_user_roles, $args['roles_can_search'] ) ) <= 0 ) ) { - return; - } - - $count = count( $search_filters ); ?> - - - - members()->results = UM()->members()->get_members( $args ); -} -add_action( 'um_pre_directory_shortcode', 'um_pre_directory_shortcode' ); - - -/** - * Member Directory Header - * - * @param $args - */ -function um_members_directory_head( $args ) { - extract( $args ); - - if ( isset( $_REQUEST['um_search'] ) ) { - $is_filtering = 1; - } elseif ( UM()->is_filtering == 1 ) { - $is_filtering = 1; - } else { - $is_filtering = 0; - } - - if ( um_members( 'header' ) && $is_filtering && um_members( 'users_per_page' ) ) { ?> - -
- -
1 ) ? um_members( 'header' ) : um_members( 'header_single' ); ?>
- -
- - 1 ) { // needs pagination - - ?> - -
- - - - - - - -
- -
- - - - - - 1 ) { ?> - - - - - - - - - - - - - - - - - - - - - -
- - - -
-

-
- - 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 ); +//function um_search_usernames_emails( $query_args, $args ) { +// extract( $args ); +// +// $query = UM()->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 ); /** @@ -99,7 +99,7 @@ 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 ); +//add_filter( 'um_prepare_user_query_args', 'um_remove_special_users_from_list', 99, 2 ); /** @@ -283,7 +283,7 @@ function um_add_search_to_query( $query_args, $args ) { return $query_args; } -add_filter( 'um_prepare_user_query_args', 'um_add_search_to_query', 50, 2 ); +//add_filter( 'um_prepare_user_query_args', 'um_add_search_to_query', 50, 2 ); /** @@ -452,116 +452,4 @@ function um_prepare_user_query_args( $query_args, $args ) { return $query_args; } -add_filter( 'um_prepare_user_query_args', 'um_prepare_user_query_args', 10, 2 ); - - -/** - * Sorting by last login date - * - * @param $query_args - * @param $sortby - * - * @return mixed - */ -function um_sortby_last_login( $query_args, $sortby ) { - if ( $sortby == 'last_login' ) { - $query_args['orderby'] = array( 'um_last_login' => 'DESC' ); - $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', - ), - ); - } - return $query_args; -} -add_filter( 'um_modify_sortby_parameter', 'um_sortby_last_login', 100, 2 ); - - -/** - * Sorting random - * - * @param $query - * - * @return mixed - */ -function um_modify_sortby_randomly( $query ) { - - if( 'random' == $query->query_vars["orderby"] ) { - - if( um_is_session_started() === false ){ - @session_start(); - } - - // Reset seed on load of initial - if( ! isset( $_REQUEST['members_page'] ) || $_REQUEST['members_page'] == 0 || $_REQUEST['members_page'] == 1 ) { - if( isset( $_SESSION['seed'] ) ) { - unset( $_SESSION['seed'] ); - } - } - - // Get seed from session variable if it exists - $seed = false; - if( isset( $_SESSION['seed'] ) ) { - $seed = $_SESSION['seed']; - } - - // Set new seed if none exists - if ( ! $seed ) { - $seed = rand(); - $_SESSION['seed'] = $seed; - } - - - $query->query_orderby = 'ORDER by RAND('. $seed.')'; - } - - return $query; -} -add_filter( 'pre_user_query','um_modify_sortby_randomly' ); - - -/** - * Hook in the member results array - * - * @param $result - * - * @return mixed - */ -function um_prepare_user_results_array( $result ) { - if ( empty( $result['users_per_page'] ) ) { - $result['no_users'] = 1; - } else { - $result['no_users'] = 0; - } - - return $result; -} -add_filter( 'um_prepare_user_results_array', 'um_prepare_user_results_array', 50, 2 ); - - -/** - * Retrieves search filter options from a callback - * - * @param $atts array - * @return array - */ -function um_search_select_fields( $atts ) { - - if( isset( $atts['custom_dropdown_options_source'] ) && ! empty( $atts['custom_dropdown_options_source'] ) ){ - $atts['custom'] = true; - $atts['options'] = UM()->fields()->get_options_from_callback( $atts, $atts['type'] ); - } - - if( isset( $atts['label'] ) ){ - $atts['label'] = strip_tags( $atts['label'] ); - } - - return $atts; -} -add_filter( 'um_search_select_fields', 'um_search_select_fields' ); \ No newline at end of file +//add_filter( 'um_prepare_user_query_args', 'um_prepare_user_query_args', 10, 2 ); \ No newline at end of file diff --git a/templates/_members-grid.php b/templates/_members-grid.php new file mode 100644 index 00000000..ad2b719d --- /dev/null +++ b/templates/_members-grid.php @@ -0,0 +1,181 @@ + + +
+ +
+ + + +
+ + + + options()->get( 'cover_thumb_sizes' ); + if ( UM()->mobile()->isTablet() ) { + $cover_size = $sizes[1]; + } else { + $cover_size = $sizes[0]; + } ?> + +
+
+ + + +
+
+ + options()->get( 'profile_photocorner' ); + + $default_size = UM()->options()->get( 'profile_photosize' ); + $default_size = str_replace( 'px', '', $default_size ); ?> + +
+ + + +
+ + + +
+ + +
+ + + +
+ + */ + do_action( 'um_members_just_after_name', um_user( 'ID' ), $args ); + + if ( UM()->roles()->um_current_user_can( 'edit', um_user( 'ID' ) ) ) { ?> +
+ + + +
+ + */ + do_action( 'um_members_after_user_name', um_user( 'ID' ), $args ); + + if ( $show_tagline && ! empty( $tagline_fields ) && is_array( $tagline_fields ) ) { + + um_fetch_user( $member ); + + foreach( $tagline_fields as $key ) { + if ( $key ) { + $value = um_filtered_value( $key ); + if ( ! $value ) { + continue; + } ?> + +
+ +
+ + + +
+ + +
+ + +
+ + + +
+ fields()->get_label( $key ) ); ?>: +
+ + +
+ fields()->show_social_urls(); ?> +
+ + +
+ +
+ +
+ + + +
+ +
+ + + +
+ +
\ No newline at end of file diff --git a/templates/members-grid.php b/templates/members-grid.php index ad2b719d..bcf61381 100644 --- a/templates/members-grid.php +++ b/templates/members-grid.php @@ -1,181 +1,140 @@ -
- -
- - - -
- - - - options()->get( 'cover_thumb_sizes' ); - if ( UM()->mobile()->isTablet() ) { - $cover_size = $sizes[1]; - } else { - $cover_size = $sizes[0]; - } ?> - -
-
- - - -
-
- - options()->get( 'profile_photocorner' ); - - $default_size = UM()->options()->get( 'profile_photosize' ); - $default_size = str_replace( 'px', '', $default_size ); ?> - -
- - - -
- - - -
- - -
- - - -
- - */ - do_action( 'um_members_just_after_name', um_user( 'ID' ), $args ); - - if ( UM()->roles()->um_current_user_can( 'edit', um_user( 'ID' ) ) ) { ?> -
- - - -
- - */ - do_action( 'um_members_after_user_name', um_user( 'ID' ), $args ); - - if ( $show_tagline && ! empty( $tagline_fields ) && is_array( $tagline_fields ) ) { - - um_fetch_user( $member ); - - foreach( $tagline_fields as $key ) { - if ( $key ) { - $value = um_filtered_value( $key ); - if ( ! $value ) { - continue; - } ?> - -
- -
- - - -
- - -
- - -
- - - -
- fields()->get_label( $key ) ); ?>: -
- - -
- fields()->show_social_urls(); ?> -
- - -
- -
- -
- - - + \ No newline at end of file diff --git a/templates/members-pagination.php b/templates/members-pagination.php index 5d79a5e4..b3bce9f6 100644 --- a/templates/members-pagination.php +++ b/templates/members-pagination.php @@ -3,25 +3,25 @@ \ No newline at end of file diff --git a/templates/members.php b/templates/members.php index d0b1fb0e..24de6ff0 100644 --- a/templates/members.php +++ b/templates/members.php @@ -7,6 +7,8 @@ foreach ( UM()->config()->core_directory_meta['members'] as $k => $v ) { $def_args[ $key ] = $v; } +$unique_hash = substr( md5( $args['form_id'] ), 10, 5 ); + $args = array_merge( $def_args, $args ); @@ -32,12 +34,13 @@ if ( count( $args['view_types'] ) == 1 ) { $current_view = $args['view_types'][0]; } else { $args['default_view'] = ! empty( $args['default_view'] ) ? $args['default_view'] : $args['view_types'][0]; - $current_view = ( ! empty( $_GET['view_type'] ) && in_array( $_GET['view_type'], $args['view_types'] ) ) ? $_GET['view_type'] : $args['default_view']; + $current_view = ( ! empty( $_GET[ 'view_type_' . $unique_hash ] ) && in_array( $_GET[ 'view_type_' . $unique_hash ], $args['view_types'] ) ) ? $_GET[ 'view_type_' . $unique_hash ] : $args['default_view']; } // Sorting $default_sorting = ! empty( $args['sortby'] ) ? $args['sortby'] : 'user_registered_desc'; +$sort_from_url = ''; if ( $args['enable_sorting'] ) { $sorting_options = empty( $args['sorting_fields'] ) ? array() : $args['sorting_fields']; if ( ! in_array( $default_sorting, $sorting_options ) ) { @@ -48,12 +51,19 @@ if ( $args['enable_sorting'] ) { $all_sorting_options = UM()->member_directory()->sort_fields; $sorting_options = array_intersect_key( $all_sorting_options, array_flip( $sorting_options ) ); } + + $sort_from_url = ( ! empty( $_GET[ 'sort_' . $unique_hash ] ) && in_array( $_GET[ 'sort_' . $unique_hash ], array_keys( $sorting_options ) ) ) ? $_GET[ 'sort_' . $unique_hash ] : $default_sorting; } +$current_page = ( ! empty( $_GET[ 'page_' . $unique_hash ] ) && is_numeric( $_GET[ 'page_' . $unique_hash ] ) ) ? (int) $_GET[ 'page_' . $unique_hash ] : 1; //Search $search = isset( $args['search'] ) ? $args['search'] : false; $show_search = empty( $args['roles_can_search'] ) || ( ! empty( $priority_user_role ) && in_array( $priority_user_role, $args['roles_can_search'] ) ); +$search_from_url = ''; +if ( $search && $show_search ) { + $search_from_url = ! empty( $_GET[ 'search_' . $unique_hash ] ) ? $_GET[ 'search_' . $unique_hash ] : ''; +} //Filters @@ -80,16 +90,26 @@ if ( ! $single_view ) { if ( $args['enable_sorting'] && ! empty( $sorting_options ) && count( $sorting_options ) > 1 ) { $classes .= ' um-member-with-sorting'; -} ?> +} -
+//send $args variable to the templates +$args['args'] = $args; +foreach ( $args['view_types'] as $type ) { + $basename = UM()->member_directory()->get_type_basename( $type ); + UM()->get_template( 'members-' . $type . '.php', $basename, $args, true ); +} +UM()->get_template( 'members-pagination.php', '', $args, true ); ?> + +