From 1df55d0ecf2550deff656cd56617f15c57a35597 Mon Sep 17 00:00:00 2001 From: nikitasinelnikov Date: Tue, 1 Oct 2019 11:53:34 +0300 Subject: [PATCH] - member directory default filters; --- includes/admin/assets/css/um-admin-forms.css | 59 +++- includes/admin/assets/js/um-admin-forms.js | 266 +++++++++++++- .../admin/core/class-admin-ajax-hooks.php | 1 + includes/admin/core/class-admin-enqueue.php | 3 +- includes/admin/core/class-admin-forms.php | 80 +++++ includes/admin/core/class-admin-metabox.php | 5 + .../2.1.0-alpha4/member-directory.php | 42 ++- includes/admin/templates/directory/search.php | 23 +- includes/core/class-member-directory.php | 329 +++++++++++++++++- 9 files changed, 783 insertions(+), 25 deletions(-) diff --git a/includes/admin/assets/css/um-admin-forms.css b/includes/admin/assets/css/um-admin-forms.css index 32177ce5..78ff1e17 100644 --- a/includes/admin/assets/css/um-admin-forms.css +++ b/includes/admin/assets/css/um-admin-forms.css @@ -35,19 +35,22 @@ textarea.um-forms-field.um-small-field { .um-multi-text-list, -.um-multi-selects-list { +.um-multi-selects-list, +.um-md-default-filters-list { float: left; width:100%; margin: 0 0 10px 0; } .um-hidden-multi-text, -.um-hidden-multi-selects { +.um-hidden-multi-selects, +.um-hidden-md-default-filters { display: none !important; } .um-multi-text-option-line, -.um-multi-selects-option-line { +.um-multi-selects-option-line, +.um-md-default-filters-option-line { float:left; width:100%; margin: 0; @@ -55,6 +58,12 @@ textarea.um-forms-field.um-small-field { clear:both; } +.um-md-default-filters-option-line { + border-bottom: 1px solid #eee; + padding: 0 0 5px 0; + margin: 5px 0 0 0; +} + .um-multi-text-option-line .um-field-wrapper, .um-multi-selects-option-line .um-field-wrapper { float:left; @@ -63,6 +72,47 @@ textarea.um-forms-field.um-small-field { box-sizing: border-box; } +.um-md-default-filters-option-line .um-field-wrapper { + float:left; + width: calc( 100% - 60px ); + line-height: 30px; + box-sizing: border-box; +} + +.um-md-default-filters-option-line .um-field-wrapper2 { + float:left; + width: calc( 100% - 60px ); + line-height: 30px; + box-sizing: border-box; +} + +.um-md-default-filters-option-line .um-field-wrapper2 .ui-slider-range.ui-widget-header { + background: #44b0ec; + border: 1px solid #44b0ec !important; + margin-top: -1px; +} + +.um-md-default-filters-option-line .um-field-wrapper2 select { + width: 100%; + float: left; +} + +.um-md-default-filters-option-line .um-field-wrapper2 input { + width: calc( 50% - 7px ) !important; + float: left; +} + +.um-md-default-filters-option-line .um-field-wrapper2 .um-slider { + margin: 5px 9px 0 9px; + width: calc( 100% - 18px ); + box-sizing: border-box; + display: block; +} + +.um-md-default-filters-option-line .um-field-wrapper2 input:first-child { + margin-right: 11px; +} + .um-multi-text-option-line .um-field-wrapper input, .um-multi-selects-option-line .um-field-wrapper select { float:left; @@ -72,7 +122,8 @@ textarea.um-forms-field.um-small-field { .um-multi-text-option-line .um-field-control, -.um-multi-selects-option-line .um-field-control { +.um-multi-selects-option-line .um-field-control, +.um-md-default-filters-option-line .um-field-control { float:left; width: 60px; line-height: 30px; diff --git a/includes/admin/assets/js/um-admin-forms.js b/includes/admin/assets/js/um-admin-forms.js index 15ec73e6..90ee3be7 100644 --- a/includes/admin/assets/js/um-admin-forms.js +++ b/includes/admin/assets/js/um-admin-forms.js @@ -2,10 +2,16 @@ jQuery(document).ready( function() { /** * Multi-selects field */ - jQuery( document.body ).on( 'click', '.um-select-delete', function() { + jQuery( document.body ).on( 'click', '.um-multi-selects-option-line .um-select-delete', function() { jQuery( this ).parents( 'li.um-multi-selects-option-line' ).remove(); }); + /** + * Multi-selects field + */ + jQuery( document.body ).on( 'click', '.um-md-default-filters-option-line .um-select-delete', function() { + jQuery( this ).parents( 'li.um-md-default-filters-option-line' ).remove(); + }); jQuery( '.um-multi-selects-add-option' ).click( function() { var list = jQuery(this).siblings('ul.um-multi-selects-list'); @@ -29,6 +35,264 @@ jQuery(document).ready( function() { }); + var um_local_date = new Date(); + var um_gmt_hours = -um_local_date.getTimezoneOffset() / 60; + jQuery('input[name="um-gmt-offset"]').val( um_gmt_hours ); + + //slider filter + jQuery('.um-admin-metabox').find('.um-slider').each( function() { + var slider = jQuery( this ); + + var min_default_value = parseInt( slider.data('min') ); + var max_default_value = parseInt( slider.data('max') ); + + if ( typeof jQuery( '#' + slider.data('field_name') + '_min' ).val() != 'undefined' ) { + min_default_value = jQuery( '#' + slider.data('field_name') + '_min' ).val(); + } + if ( typeof jQuery( '#' + slider.data('field_name') + '_max' ).val() != 'undefined' ) { + max_default_value = jQuery( '#' + slider.data('field_name') + '_max' ).val(); + } + + var default_value = [ min_default_value, max_default_value ]; + + slider.slider({ + range: true, + min: parseInt( slider.data('min') ), + max: parseInt( slider.data('max') ), + values: default_value, + create: function( event, ui ) { + //console.log( ui ); + }, + step: 1, + slide: function( event, ui ) { + um_set_range_label( jQuery( this ), ui ); + }, + stop: function( event, ui ) { + + } + }); + + um_set_range_label( slider ); + }); + + + //datepicker filter + jQuery('.um-admin-metabox').find('.um-datepicker-filter').each( function() { + var elem = jQuery(this); + + var min = new Date( elem.data('date_min')*1000 ); + var max = new Date( elem.data('date_max')*1000 ); + + var $input = elem.pickadate({ + selectYears: true, + min: min, + max: max, + formatSubmit: 'yyyy/mm/dd', + hiddenName: true, + onOpen: function() { + elem.blur(); + }, + onClose: function() { + elem.blur(); + }, + onSet: function( context ) { + + } + }); + + var $picker = $input.pickadate('picker'); + $picker.set( 'select', elem.data('value')*1000 ); + }); + + + //timepicker filter + jQuery('.um-admin-metabox').find('.um-timepicker-filter').each( function() { + var elem = jQuery(this); + + //using arrays formatted as [HOUR,MINUTE] + + var min = elem.data('min'); + var max = elem.data('max'); + var picker_min = min.split(':'); + var picker_max = max.split(':'); + + var $input = elem.pickatime({ + format: elem.data('format'), + interval: parseInt( elem.data('intervals') ), + min: [picker_min[0],picker_min[1]], + max: [picker_max[0],picker_max[1]], + formatSubmit: 'HH:i', + hiddenName: true, + onOpen: function() { elem.blur(); }, + onClose: function() { elem.blur(); }, + onSet: function( context ) { + + } + }); + }); + + var um_member_dir_filters_busy = false; + + jQuery( document.body ).on( 'change', '.um-md-default-filters-option-line .um-field-wrapper select', function() { + if ( um_member_dir_filters_busy ) { + return; + } + + var obj = jQuery(this); + var filter_key = obj.val(); + var directory_id = obj.data('member_directory'); + + um_member_dir_filters_busy = true; + wp.ajax.send( 'um_member_directory_default_filter_settings', { + data: { + key: filter_key, + directory_id: directory_id, + nonce: um_admin_scripts.nonce + }, + success: function( data ) { + var field_wrapper = obj.parents( '.um-md-default-filters-option-line' ).find('.um-field-wrapper2'); + field_wrapper.html( data.field_html ); + + um_member_dir_filters_busy = false; + + //slider filter + field_wrapper.find('.um-slider').each( function() { + var slider = jQuery( this ); + var min_default_value = parseInt( slider.data('min') ); + var max_default_value = parseInt( slider.data('max') ); + + var default_value = [ min_default_value, max_default_value ]; + + slider.slider({ + range: true, + min: parseInt( slider.data('min') ), + max: parseInt( slider.data('max') ), + values: default_value, + create: function( event, ui ) { + //console.log( ui ); + }, + step: 1, + slide: function( event, ui ) { + um_set_range_label( jQuery( this ), ui ); + }, + stop: function( event, ui ) { + + } + }); + + um_set_range_label( slider ); + }); + + + //datepicker filter + field_wrapper.find('.um-datepicker-filter').each( function() { + var elem = jQuery(this); + + var min = new Date( elem.data('date_min')*1000 ); + var max = new Date( elem.data('date_max')*1000 ); + + var $input = elem.pickadate({ + selectYears: true, + min: min, + max: max, + formatSubmit: 'yyyy/mm/dd', + hiddenName: true, + onOpen: function() { + elem.blur(); + }, + onClose: function() { + elem.blur(); + }, + onSet: function( context ) { + + } + }); + }); + + + //timepicker filter + field_wrapper.find('.um-timepicker-filter').each( function() { + var elem = jQuery(this); + + //using arrays formatted as [HOUR,MINUTE] + + var min = elem.data('min'); + var max = elem.data('max'); + var picker_min = min.split(':'); + var picker_max = max.split(':'); + + var $input = elem.pickatime({ + format: elem.data('format'), + interval: parseInt( elem.data('intervals') ), + min: [picker_min[0],picker_min[1]], + max: [picker_max[0],picker_max[1]], + formatSubmit: 'HH:i', + hiddenName: true, + onOpen: function() { elem.blur(); }, + onClose: function() { elem.blur(); }, + onSet: function( context ) { + + } + }); + }); + + + }, + error: function( data ) { + return false; + } + }); + + }); + + function um_set_range_label( slider, ui ) { + var placeholder = slider.siblings( '.um-slider-range' ).data( 'placeholder' ); + + if( ui ) { + placeholder = placeholder.replace( '\{min_range\}', ui.values[ 0 ] ) + .replace( '\{max_range\}', ui.values[ 1 ] ) + .replace( '\{field_label\}', slider.siblings( '.um-slider-range' ) + .data('label') ); + } else { + placeholder = placeholder.replace( '\{min_range\}', slider.slider( "values", 0 ) ) + .replace( '\{max_range\}', slider.slider( "values", 1 ) ) + .replace( '\{field_label\}', slider.siblings( '.um-slider-range' ) + .data('label') ); + } + slider.siblings( '.um-slider-range' ).html( placeholder ); + + slider.siblings( ".um_range_min" ).val( slider.slider( "values", 0 ) ); + slider.siblings( ".um_range_max" ).val( slider.slider( "values", 1 ) ); + } + + + jQuery( '.um-md-default-filters-add-option' ).click( function() { + if ( um_member_dir_filters_busy ) { + return; + } + + var list = jQuery(this).siblings('ul.um-md-default-filters-list'); + + var field_id = list.data('field_id'); + var k = 0; + if ( list.find( 'li:last select.um-forms-field' ).length > 0 ) { + k = list.find( 'li:last select.um-forms-field' ).attr('id').split("-"); + k = k[1]*1 + 1; + } + + var selector_html = jQuery( '
' ).append( list.siblings('.um-hidden-md-default-filters').clone() ).html(); + + list.append( + '
  • ' + selector_html + + '' + php_data.texts.remove + '
  • ' + ); + + list.find('li:last .um-hidden-md-default-filters').attr('name', jQuery(this).data('name') ). + addClass('um-forms-field um-long-field').removeClass('um-hidden-md-default-filters').attr('id', list.data('id_attr') + '-' + k); + + list.find('li:last .um-field-wrapper select').trigger('change'); + }); + /** * Multi-text field diff --git a/includes/admin/core/class-admin-ajax-hooks.php b/includes/admin/core/class-admin-ajax-hooks.php index 692f43e9..2e261c88 100644 --- a/includes/admin/core/class-admin-ajax-hooks.php +++ b/includes/admin/core/class-admin-ajax-hooks.php @@ -27,6 +27,7 @@ if ( ! class_exists( 'um\admin\core\Admin_Ajax_Hooks' ) ) { add_action( 'wp_ajax_um_dynamic_modal_content', array( UM()->builder(), 'dynamic_modal_content' ) ); add_action( 'wp_ajax_um_populate_dropdown_options', array( UM()->builder(), 'populate_dropdown_options' ) ); add_action( 'wp_ajax_um_rated', array( UM()->admin_menu(), 'ultimatemember_rated' ) ); + add_action( 'wp_ajax_um_member_directory_default_filter_settings', array( UM()->member_directory(), 'default_filter_settings' ) ); } } diff --git a/includes/admin/core/class-admin-enqueue.php b/includes/admin/core/class-admin-enqueue.php index c5f018dd..d5dec8ab 100644 --- a/includes/admin/core/class-admin-enqueue.php +++ b/includes/admin/core/class-admin-enqueue.php @@ -219,7 +219,8 @@ if ( ! class_exists( 'um\admin\core\Admin_Enqueue' ) ) { * Load Forms */ function load_forms() { - wp_register_style( 'um_admin_forms', $this->css_url . 'um-admin-forms.css', array( 'wp-color-picker' ), ultimatemember_version ); + wp_register_style( 'um_ui', $this->front_css_baseurl . 'jquery-ui.css', array(), ultimatemember_version ); + wp_register_style( 'um_admin_forms', $this->css_url . 'um-admin-forms.css', array( 'wp-color-picker', 'um_ui' ), ultimatemember_version ); wp_enqueue_style( 'um_admin_forms' ); wp_register_script( 'um_admin_forms', $this->js_url . 'um-admin-forms.js', array( 'jquery' ), ultimatemember_version, true ); diff --git a/includes/admin/core/class-admin-forms.php b/includes/admin/core/class-admin-forms.php index 46a960f2..533520ea 100644 --- a/includes/admin/core/class-admin-forms.php +++ b/includes/admin/core/class-admin-forms.php @@ -1218,6 +1218,86 @@ if ( ! class_exists( 'um\admin\core\Admin_Forms' ) ) { } + function render_md_default_filters( $field_data ) { + if ( empty( $field_data['id'] ) ) { + return false; + } + global $post; + + $id = ( ! empty( $this->form_data['prefix_id'] ) ? $this->form_data['prefix_id'] : '' ) . '_' . $field_data['id']; + + $class = ! empty( $field_data['class'] ) ? $field_data['class'] : ''; + $class .= ! empty( $field_data['size'] ) ? $field_data['size'] : 'um-long-field'; + $class_attr = ' class="um-forms-field ' . $class . '" '; + + $data = array( + 'field_id' => $field_data['id'], + 'id_attr' => $id, + 'member_directory' => $post->ID + ); + + $data_attr = ''; + foreach ( $data as $key => $value ) { + $data_attr .= ' data-' . $key . '="' . esc_attr( $value ) . '" '; + } + + $name = $field_data['id']; + $name = ! empty( $this->form_data['prefix_id'] ) ? $this->form_data['prefix_id'] . '[' . $name . ']' : $name; + $name = "{$name}[]"; + $name_attr = ' name="' . $name . '" '; + + $values = $this->get_field_value( $field_data ); + $filters = array_keys( $values ); + + $options = ''; + foreach ( $field_data['options'] as $key => $option ) { + $options .= ''; + } + + $html = ""; + $html .= "{$field_data['add_text']}"; + + return $html; + } + /** * Get field value * diff --git a/includes/admin/core/class-admin-metabox.php b/includes/admin/core/class-admin-metabox.php index f2541305..fed3a7ce 100644 --- a/includes/admin/core/class-admin-metabox.php +++ b/includes/admin/core/class-admin-metabox.php @@ -1052,6 +1052,9 @@ if ( ! class_exists( 'um\admin\core\Admin_Metabox' ) ) { delete_post_meta( $post_id, '_um_roles_can_filter' ); delete_post_meta( $post_id, '_um_show_these_users' ); + delete_post_meta( $post_id, '_um_search_filters' ); + delete_post_meta( $post_id, '_um_search_filters_gmt' ); + //save metadata foreach ( $_POST['um_metadata'] as $k => $v ) { @@ -1088,6 +1091,8 @@ if ( ! class_exists( 'um\admin\core\Admin_Metabox' ) ) { } } + + update_post_meta( $post_id, '_um_search_filters_gmt', intval( $_POST['um-gmt-offset'] ) ); } diff --git a/includes/admin/core/packages/2.1.0-alpha4/member-directory.php b/includes/admin/core/packages/2.1.0-alpha4/member-directory.php index 187049c6..fbf70b08 100644 --- a/includes/admin/core/packages/2.1.0-alpha4/member-directory.php +++ b/includes/admin/core/packages/2.1.0-alpha4/member-directory.php @@ -48,7 +48,7 @@ if ( ! empty( $postmeta ) ) { } } - +// update member directories settings $forms_query = new WP_Query; $member_directories = $forms_query->query( array( 'post_type' => 'um_directory', @@ -93,6 +93,46 @@ if ( ! empty( $member_directories ) && ! is_wp_error( $member_directories ) ) { } } + $default_filters = get_post_meta( $id, '_um_search_filters', true ); + $default_filters_new = array(); + if ( ! empty( $default_filters ) ) { + $default_filters_queries = explode( '&', $default_filters ); + foreach ( $default_filters_queries as $filter_query_part ) { + $filter_query_parts = explode( '=', $filter_query_part ); + + $filter_key = $filter_query_parts[0]; + $filter_value = $filter_query_parts[1]; + + $default_filters_new[ $filter_key ] = $filter_value; + } + } + + update_post_meta( $id, '_um_search_filters', $default_filters_new ); + update_post_meta( $id, '_um_search_filters_old', $default_filters ); + update_post_meta( $id, '_um_search_old', $search_enabled ); } +} + + +// for user tags settings +if ( UM()->options()->get( 'members_page' ) ) { + $member_directory_id = false; + + $page_id = UM()->config()->permalinks['members']; + if ( ! empty( $page_id ) ) { + $members_page = get_post( $page_id ); + if ( ! empty( $members_page ) && ! is_wp_error( $members_page ) ) { + if ( ! empty( $members_page->post_content ) ) { + preg_match( '/\[ultimatemember[^\]]*?form_id\=[\'"]*?(\d+)[\'"]*?/i', $members_page->post_content, $matches ); + if ( ! empty( $matches[1] ) && is_numeric( $matches[1] ) ) { + $member_directory_id = $matches[1]; + } + } + } + } + + if ( $member_directory_id ) { + UM()->options()->update( 'user_tags_base_directory' , $member_directory_id ); + } } \ No newline at end of file diff --git a/includes/admin/templates/directory/search.php b/includes/admin/templates/directory/search.php index 6a2d6f0f..b656cb59 100644 --- a/includes/admin/templates/directory/search.php +++ b/includes/admin/templates/directory/search.php @@ -43,6 +43,7 @@ global $post_id; ?> //$post_id = get_the_ID(); $_um_search_fields = get_post_meta( $post_id, '_um_search_fields', true ); + $_um_search_filters = get_post_meta( $post_id, '_um_search_filters', true ); UM()->admin_forms( array( 'class' => 'um-member-directory-search um-half-column', @@ -92,13 +93,23 @@ global $post_id; ?> 'add_text' => __( 'Add New Custom Field', 'ultimate-member' ), 'show_default_number' => 1, ), +// array( +// 'id' => '_um_search_filters', +// 'type' => 'text', +// 'label' => __( 'Default filters', 'ultimate-member' ), +// 'tooltip' => __( 'You can set default filters like URL parameters', 'ultimate-member' ), +// 'value' => UM()->query()->get_meta_value('_um_search_filters', null, 'na' ), +// 'placeholder' => 'field1=val1&field2=val2' +// ), array( - 'id' => '_um_search_filters', - 'type' => 'text', - 'label' => __( 'Default filters', 'ultimate-member' ), - 'tooltip' => __( 'You can set default filters like URL parameters', 'ultimate-member' ), - 'value' => UM()->query()->get_meta_value('_um_search_filters', null, 'na' ), - 'placeholder' => 'field1=val1&field2=val2' + 'id' => '_um_search_filters', + 'type' => 'md_default_filters', + 'label' => __( 'Default filters', 'ultimate-member' ), + 'tooltip' => __( 'You can set default filters', 'ultimate-member' ), + 'value' => $_um_search_filters, + 'options' => UM()->member_directory()->filter_fields, + 'add_text' => __( 'Add New Filter', 'ultimate-member' ), + 'show_default_number' => 0, ), ) ) )->render_form(); ?> diff --git a/includes/core/class-member-directory.php b/includes/core/class-member-directory.php index b2af0ad7..17011d5f 100644 --- a/includes/core/class-member-directory.php +++ b/includes/core/class-member-directory.php @@ -41,6 +41,12 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) { var $filter_fields = array(); + /** + * @var array + */ + var $custom_filters_in_query = array(); + + var $filter_supported_fields = array(); @@ -175,6 +181,32 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) { if ( ! empty( $value ) && in_array( $key, array( '_um_view_types', '_um_roles', '_um_roles_can_search', '_um_roles_can_filter' ) ) ) { $value = array_keys( $value ); + } elseif ( $key == '_um_search_filters' ) { + + $temp_value = array(); + + if ( ! empty( $value ) ) { + foreach ( $value as $k ) { + $filter_type = $this->filter_types[ $k ]; + if ( ! empty( $filter_type ) ) { + if ( $filter_type == 'select' ) { + if ( ! empty( $_POST[ $k ] ) ) { + $temp_value[ $k ] = trim( $_POST[ $k ] ); + } + } elseif ( $filter_type == 'slider' ) { + if ( ! empty( $_POST[ $k ] ) ) { + $temp_value[ $k ] = $_POST[ $k ]; + } + } elseif ( $filter_type == 'timepicker' || $filter_type == 'datepicker' ) { + if ( ! empty( $_POST[ $k . '_from' ] ) && ! empty( $_POST[ $k . '_to' ] ) ) { + $temp_value[ $k ] = array( $_POST[ $k . '_from' ], $_POST[ $k . '_to' ] ); + } + } + } + } + } + + $value = $temp_value; } } @@ -346,10 +378,11 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) { * * @param string $filter * @param array $directory_data + * @param mixed $default_value * * @return string $filter */ - function show_filter( $filter, $directory_data ) { + function show_filter( $filter, $directory_data, $default_value = false ) { if ( empty( $this->filter_types[ $filter ] ) ) { return ''; @@ -485,7 +518,8 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) { } ?> @@ -503,8 +537,8 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) { $placeholder = $this->slider_range_placeholder( $filter, $attrs ); if ( $range ) { ?> - - + +
    " data-filter-label="" data-date_min="" data-date_max="" - data-filter_name="" data-range="from" /> + data-filter_name="" data-range="from" data-value="" /> + data-filter_name="" data-range="to" data-value="" /> custom_filters_in_query[ $field ] = $value; + break; case 'slider': + $this->custom_filters_in_query[ $field ] = $value; + $field_query = array( 'key' => $field, 'value' => $value, @@ -1361,6 +1399,260 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) { 'inclusive' => true, ); + $this->custom_filters_in_query[ $field ] = array( $from_date, $to_date ); + + break; + case 'timepicker': + + if ( $value[0] == $value[1] ) { + $field_query = array( + 'key' => $field, + 'value' => $value[0], + ); + } else { + $field_query = array( + 'key' => $field, + 'value' => $value, + 'compare' => 'BETWEEN', + 'type' => 'TIME', + 'inclusive' => true, + ); + } + + $this->custom_filters_in_query[ $field ] = $value; + + break; + } + + } + + if ( ! empty( $field_query ) && $field_query !== true ) { + $this->query_args['meta_query'] = array_merge( $this->query_args['meta_query'], array( $field_query ) ); + } + + break; + case 'role': + $value = explode( '||', $value ); + $value = array_map( 'strtolower', $value ); + + 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'] ); + $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; + }; + + $this->custom_filters_in_query[ $field ] = $this->query_args['role__in']; + + break; + case 'birth_date': + + $from_date = date( 'Y/m/d', mktime( 0,0,0, date( 'm', time() ), date( 'd', time() ), date( 'Y', time() - min( $value ) * YEAR_IN_SECONDS ) ) ); + $to_date = date( 'Y/m/d', mktime( 0,0,0, date( 'm', time() ), date( 'd', time() ) + 1, date( 'Y', time() - ( max( $value ) + 1 ) * YEAR_IN_SECONDS ) ) ); + + $meta_query = array( + array( + 'key' => 'birth_date', + 'value' => array( $to_date, $from_date ), + 'compare' => 'BETWEEN', + 'type' => 'DATE', + 'inclusive' => true, + ) + ); + + $this->query_args['meta_query'] = array_merge( $this->query_args['meta_query'], array( $meta_query ) ); + + $this->custom_filters_in_query[ $field ] = array( $to_date, $from_date ); + + break; + case 'user_registered': + + $offset = 0; + if ( isset( $_POST['gmt_offset'] ) && is_numeric( $_POST['gmt_offset'] ) ) { + $offset = (int) $_POST['gmt_offset']; + } + + $from_date = date( 'Y-m-d H:s:i', strtotime( date( 'Y-m-d H:s:i', min( $value ) ) . "+$offset hours" ) ); + $to_date = date( 'Y-m-d H:s:i', strtotime( date( 'Y-m-d H:s:i', max( $value ) ) . "+$offset hours" ) ); + + $date_query = array( + array( + 'column' => 'user_registered', + 'before' => $to_date, + 'after' => $from_date, + 'inclusive' => true, + ), + ); + + if ( empty( $this->query_args['date_query'] ) ) { + $this->query_args['date_query'] = $date_query; + } else { + $this->query_args['date_query'] = array_merge( $this->query_args['date_query'], array( $date_query ) ); + } + + $this->custom_filters_in_query[ $field ] = $value; + + break; + case 'last_login': + + $offset = 0; + if ( isset( $_POST['gmt_offset'] ) && is_numeric( $_POST['gmt_offset'] ) ) { + $offset = (int) $_POST['gmt_offset']; + } + + $from_date = (int) min( $value ) + ( $offset * HOUR_IN_SECONDS ); // client time zone offset + $to_date = (int) max( $value ) + ( $offset * HOUR_IN_SECONDS ) + DAY_IN_SECONDS - 1; // time 23:59 + $meta_query = array( + array( + 'key' => '_um_last_login', + 'value' => array( $from_date, $to_date ), + 'compare' => 'BETWEEN', + 'inclusive' => true, + ) + ); + + $this->custom_filters_in_query[ $field ] = $value; + + $this->query_args['meta_query'] = array_merge( $this->query_args['meta_query'], array( $meta_query ) ); + break; + } + + } + } + + + /** + * Set default filters + * + * @param $directory_data + */ + function default_filters( $directory_data ) { + $default_filters = array(); + if ( ! empty( $directory_data['search_filters'] ) ) { + $default_filters = maybe_unserialize( $directory_data['search_filters'] ); + } + + $gmt_offset = get_post_meta( $directory_data['form_id'], '_um_search_filters_gmt', true ); + + if ( empty( $default_filters ) ) { + return; + } + + foreach ( $default_filters as $field => $value ) { + + //unable default filter in case if we select other value in frontend filters + if ( in_array( $field, array_keys( $this->custom_filters_in_query ) ) ) { + continue; + } + + switch ( $field ) { + default: + + $filter_type = $this->filter_types[ $field ]; + + /** + * 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", false, $field, $value, $filter_type ); + + if ( ! $field_query ) { + + switch ( $filter_type ) { + default: + + $field_query = apply_filters( "um_query_args_{$field}_{$filter_type}__filter", false, $field, $value, $filter_type ); + + break; + case 'select': + if ( ! is_array( $value ) ) { + $value = array( $value ); + } + + $field_query = array( 'relation' => 'OR' ); + + foreach ( $value as $single_val ) { + $arr_meta_query = array( + array( + 'key' => $field, + 'value' => trim( $single_val ), + 'compare' => '=', + ), + array( + 'key' => $field, + 'value' => serialize( strval( trim( $single_val ) ) ), + 'compare' => 'LIKE', + ), + array( + 'key' => $field, + 'value' => '"' . trim( $single_val ) . '"', + 'compare' => 'LIKE', + ) + ); + + if ( is_numeric( $single_val ) ) { + + $arr_meta_query[] = array( + 'key' => $field, + 'value' => serialize( intval( trim( $single_val ) ) ), + 'compare' => 'LIKE', + ); + + } + + $field_query = array_merge( $field_query, $arr_meta_query ); + } + + break; + case 'slider': + + $field_query = array( + 'key' => $field, + 'value' => $value, + 'compare' => 'BETWEEN', + 'inclusive' => true, + ); + + break; + case 'datepicker': + + $offset = 0; + if ( is_numeric( $gmt_offset ) ) { + $offset = $gmt_offset; + } + + $from_date = (int) min( $value ) + ( $offset * HOUR_IN_SECONDS ); // client time zone offset + $to_date = (int) max( $value ) + ( $offset * HOUR_IN_SECONDS ) + DAY_IN_SECONDS - 1; // time 23:59 + $field_query = array( + 'key' => $field, + 'value' => array( $from_date, $to_date ), + 'compare' => 'BETWEEN', + 'inclusive' => true, + ); + break; case 'timepicker': @@ -1426,8 +1718,8 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) { break; case 'user_registered': $offset = 0; - if ( isset( $_POST['gmt_offset'] ) && is_numeric( $_POST['gmt_offset'] ) ) { - $offset = (int) $_POST['gmt_offset']; + if ( is_numeric( $gmt_offset ) ) { + $offset = $gmt_offset; } $from_date = date( 'Y-m-d H:s:i', strtotime( date( 'Y-m-d H:s:i', min( $value ) ) . "+$offset hours" ) ); @@ -1451,8 +1743,8 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) { break; case 'last_login': $offset = 0; - if ( isset( $_POST['gmt_offset'] ) && is_numeric( $_POST['gmt_offset'] ) ) { - $offset = (int) $_POST['gmt_offset']; + if ( is_numeric( $gmt_offset ) ) { + $offset = $gmt_offset; } $from_date = (int) min( $value ) + ( $offset * HOUR_IN_SECONDS ); // client time zone offset @@ -1469,12 +1761,10 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) { $this->query_args['meta_query'] = array_merge( $this->query_args['meta_query'], array( $meta_query ) ); break; } - } } - /** * Get data array for pagination * @@ -1769,6 +2059,8 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) { // handle filters $this->filters( $directory_data ); + $this->default_filters( $directory_data ); + /** * UM hook * @@ -1935,5 +2227,18 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) { admin()->check_ajax_nonce(); + + $filter_key = sanitize_key( $_REQUEST['key'] ); + $directory_id = absint( $_REQUEST['directory_id'] ); + + $html = $this->show_filter( $filter_key, array( 'form_id' => $directory_id ) ); + + wp_send_json_success( array( 'field_html' => $html ) ); + } } } \ No newline at end of file