- member directory default filters;

This commit is contained in:
nikitasinelnikov
2019-10-01 11:53:34 +03:00
parent 4f559f4c3a
commit 1df55d0ecf
9 changed files with 783 additions and 25 deletions
+55 -4
View File
@@ -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;
+265 -1
View File
@@ -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( '<div>' ).append( list.siblings('.um-hidden-md-default-filters').clone() ).html();
list.append(
'<li class="um-md-default-filters-option-line"><span class="um-field-wrapper">' + selector_html +
'</span></span><span class="um-field-control"><a href="javascript:void(0);" class="um-select-delete">' + php_data.texts.remove + '</a></span><span class="um-field-wrapper2 um"></li>'
);
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
@@ -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' ) );
}
}
+2 -1
View File
@@ -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 );
+80
View File
@@ -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 .= '<option value="' . $key . '">' . $option . '</option>';
}
$html = "<input type=\"hidden\" name=\"um-gmt-offset\" /><select class=\"um-hidden-md-default-filters\" $data_attr>$options</select>";
$html .= "<ul class=\"um-md-default-filters-list\" $data_attr>";
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 .= '<option value="' . $key . '" ' . selected( $key == $value, true, false ) . '>' . $option . '</option>';
}
$html .= "<li class=\"um-md-default-filters-option-line\"><span class=\"um-field-wrapper\">
<select $id_attr $name_attr $class_attr $data_attr>$options</select></span>
<span class=\"um-field-control\"><a href=\"javascript:void(0);\" class=\"um-select-delete\">" . __( 'Remove', 'ultimate-member' ) . "</a></span><span class=\"um-field-wrapper2 um\">" . UM()->member_directory()->show_filter( $value, array( 'form_id' => $post->ID ), $values[ $value ] ) . "</span></li>";
}
} 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 .= '<option value="' . $key . '">' . $option . '</option>';
}
$html .= "<li class=\"um-md-default-filters-option-line\"><span class=\"um-field-wrapper\">
<select $id_attr $name_attr $class_attr $data_attr>$options</select></span>
<span class=\"um-field-control\"><a href=\"javascript:void(0);\" class=\"um-select-delete\">" . __( 'Remove', 'ultimate-member' ) . "</a></span></li>";
$i++;
}
}
$html .= "</ul><a href=\"javascript:void(0);\" class=\"button button-primary um-md-default-filters-add-option\" data-name=\"$name\">{$field_data['add_text']}</a>";
return $html;
}
/**
* Get field value
*
@@ -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'] ) );
}
@@ -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 );
}
}
+17 -6
View File
@@ -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(); ?>
+317 -12
View File
@@ -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' ) ) {
} ?>
<option value="<?php echo esc_attr( $opt ); ?>" data-value_label="<?php esc_attr_e( $v, 'ultimate-member' ); ?>"
<?php disabled( ! empty( $filter_from_url ) && in_array( $opt, $filter_from_url ) ) ?>>
<?php disabled( ! empty( $filter_from_url ) && in_array( $opt, $filter_from_url ) ) ?>
<?php selected( $opt == $default_value ) ?>>
<?php _e( $v, 'ultimate-member' ); ?>
</option>
@@ -503,8 +537,8 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) {
$placeholder = $this->slider_range_placeholder( $filter, $attrs );
if ( $range ) { ?>
<input type="hidden" id="<?php echo $filter; ?>_min" name="<?php echo $filter; ?>[]" class="um_range_min" />
<input type="hidden" id="<?php echo $filter; ?>_max" name="<?php echo $filter; ?>[]" class="um_range_max" />
<input type="hidden" id="<?php echo $filter; ?>_min" name="<?php echo $filter; ?>[]" class="um_range_min" value="<?php echo ! empty( $default_value ) ? esc_attr( min( $default_value ) ) : '' ?>" />
<input type="hidden" id="<?php echo $filter; ?>_max" name="<?php echo $filter; ?>[]" class="um_range_max" value="<?php echo ! empty( $default_value ) ? esc_attr( max( $default_value ) ) : '' ?>" />
<div class="um-slider" data-field_name="<?php echo $filter; ?>" data-min="<?php echo $range[0] ?>" data-max="<?php echo $range[1] ?>"></div>
<div class="um-slider-range" data-placeholder="<?php echo esc_attr( $placeholder ); ?>" data-label="<?php echo ( ! empty( $attrs['label'] ) ) ? esc_attr__( stripslashes( $attrs['label'] ), 'ultimate-member' ) : ''; ?>"></div>
<?php }
@@ -523,12 +557,12 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) {
placeholder="<?php esc_attr_e( sprintf( '%s From', stripslashes( $label ) ), 'ultimate-member' ); ?>"
data-filter-label="<?php echo esc_attr( stripslashes( $label ) ); ?>"
data-date_min="<?php echo $range[0] ?>" data-date_max="<?php echo $range[1] ?>"
data-filter_name="<?php echo $filter; ?>" data-range="from" />
data-filter_name="<?php echo $filter; ?>" data-range="from" data-value="<?php echo ! empty( $default_value ) ? esc_attr( strtotime( min( $default_value ) ) ) : '' ?>" />
<input type="text" id="<?php echo $filter; ?>_to" name="<?php echo $filter; ?>_to" class="um-datepicker-filter"
placeholder="<?php esc_attr_e( sprintf( '%s To', stripslashes( $label ) ), 'ultimate-member' ); ?>"
data-filter-label="<?php echo esc_attr( stripslashes( $label ) ); ?>"
data-date_min="<?php echo $range[0] ?>" data-date_max="<?php echo $range[1] ?>"
data-filter_name="<?php echo $filter; ?>" data-range="to" />
data-filter_name="<?php echo $filter; ?>" data-range="to" data-value="<?php echo ! empty( $default_value ) ? esc_attr( strtotime( max( $default_value ) ) ) : '' ?>" />
<?php }
@@ -1334,9 +1368,13 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) {
}
}
$this->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
* <?php add_filter( 'um_query_args_{$field}__filter', 'function_name', 10, 1 ); ?>
* @example
* <?php
* add_filter( 'um_query_args_{$field}__filter', 'my_query_args_filter', 10, 1 );
* function my_query_args_filter( $field_query ) {
* // your code here
* return $field_query;
* }
* ?>
*/
$field_query = apply_filters( "um_query_args_{$field}__filter", false, $field, $value, $filter_type );
if ( ! $field_query ) {
switch ( $filter_type ) {
default:
$field_query = apply_filters( "um_query_args_{$field}_{$filter_type}__filter", false, $field, $value, $filter_type );
break;
case 'select':
if ( ! is_array( $value ) ) {
$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' ) ) {
<?php
}
function default_filter_settings() {
UM()->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 ) );
}
}
}