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 .= "
";
+
+ if ( ! empty( $filters ) && is_array( $filters ) ) {
+ foreach ( $filters as $k => $value ) {
+
+ if ( ! in_array( $value, array_keys( $field_data['options'] ) ) ) {
+ continue ;
+ }
+
+ $id_attr = ' id="' . esc_attr( $id . '-' . $k ) . '" ';
+
+ $options = '';
+ foreach ( $field_data['options'] as $key => $option ) {
+ $options .= '';
+ }
+
+ $html .= "-
+
+ " . __( 'Remove', 'ultimate-member' ) . "" . UM()->member_directory()->show_filter( $value, array( 'form_id' => $post->ID ), $values[ $value ] ) . "
";
+ }
+ } elseif ( ! empty( $field_data['show_default_number'] ) && is_numeric( $field_data['show_default_number'] ) && $field_data['show_default_number'] > 0 ) {
+ $i = 0;
+ while ( $i < $field_data['show_default_number'] ) {
+ $id_attr = ' id="' . $id . '-' . $i . '" ';
+
+ $options = '';
+ foreach ( $field_data['options'] as $key => $option ) {
+ $options .= '';
+ }
+
+ $html .= "-
+
+ " . __( 'Remove', 'ultimate-member' ) . "
";
+
+ $i++;
+ }
+ }
+
+ $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