This commit is contained in:
Mykyta Synelnikov
2023-06-12 13:20:00 +03:00
parent 568b56d267
commit 30663c3ecd
8 changed files with 104 additions and 83 deletions
+6 -9
View File
@@ -245,21 +245,18 @@ jQuery(document).ready( function() {
html += '<span class="um-field-icon"><i class="um-faicon-sort"></i></span>';
}
let dataTypesOptions = '';
jQuery.each( um_forms_data.md_sorting_data_types, function( key, label ) {
dataTypesOptions += '<option value="' + key + '">' + label + '</option>';
} );
html += '<span class="um-field-wrapper">' + selector_html + '</span>' +
'<span class="um-field-control">' +
'<a href="javascript:void(0);" class="um-select-delete">' + wp.i18n.__( 'Remove', 'ultimate-member' ) + '</a>' +
'</span>' +
'<span class="um-field-wrapper um-custom-order-fields"><label>' + wp.i18n.__( 'Meta key', 'ultimate-member' ) + ':&nbsp;<input type="text" name="meta_key" /></label></span>' +
'<span class="um-field-wrapper um-custom-order-fields"><label>' + wp.i18n.__( 'Data type', 'ultimate-member' ) + ':&nbsp;<select name="data_type" />' +
'<option value="CHAR">' + wp.i18n.__( 'CHAR', 'ultimate-member' ) + '</option>' +
'<option value="NUMERIC">' + wp.i18n.__( 'NUMERIC', 'ultimate-member' ) + '</option>' +
'<option value="BINARY">' + wp.i18n.__( 'BINARY', 'ultimate-member' ) + '</option>' +
'<option value="DATE">' + wp.i18n.__( 'DATE', 'ultimate-member' ) + '</option>' +
'<option value="DATETIME">' + wp.i18n.__( 'DATETIME', 'ultimate-member' ) + '</option>' +
'<option value="DECIMAL">' + wp.i18n.__( 'DECIMAL', 'ultimate-member' ) + '</option>' +
'<option value="SIGNED">' + wp.i18n.__( 'SIGNED', 'ultimate-member' ) + '</option>' +
'<option value="TIME">' + wp.i18n.__( 'TIME', 'ultimate-member' ) + '</option>' +
'<option value="UNSIGNED">' + wp.i18n.__( 'UNSIGNED', 'ultimate-member' ) + '</option>' +
dataTypesOptions +
'</select></label></span>' +
'<span class="um-field-wrapper um-custom-order-fields"><label>' + wp.i18n.__( 'Order', 'ultimate-member' ) + ':&nbsp;<select name="order" />' +
'<option value="ASC">' + wp.i18n.__( 'ASC', 'ultimate-member' ) + '</option>' +
-3
View File
@@ -1,21 +1,18 @@
<?php
namespace um\admin;
// Exit if accessed directly.
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
if ( ! class_exists( 'um\admin\Admin' ) ) {
/**
* Class Admin
* @package um\admin
*/
class Admin extends Admin_Functions {
/**
* @var string
*/
@@ -375,6 +375,7 @@ if ( ! class_exists( 'um\admin\core\Admin_Enqueue' ) ) {
),
admin_url( 'admin.php' )
),
'md_sorting_data_types' => UM()->member_directory()->sort_data_types,
)
);
+11 -13
View File
@@ -1613,7 +1613,7 @@ if ( ! class_exists( 'um\admin\core\Admin_Forms' ) ) {
$other_order = $value['order'];
}
} else {
if ( ! in_array( $value, array_keys( $field_data['options'] ) ) ) {
if ( ! array_key_exists( $value, $field_data['options'] ) ) {
continue;
}
}
@@ -1623,7 +1623,7 @@ if ( ! class_exists( 'um\admin\core\Admin_Forms' ) ) {
$options = '';
foreach ( $field_data['options'] as $key => $option ) {
if ( is_array( $value ) ) {
$selected = selected( $key == 'other', true, false );
$selected = selected( 'other' === $key, true, false );
} else {
$selected = selected( $key == $value, true, false );
}
@@ -1635,21 +1635,19 @@ if ( ! class_exists( 'um\admin\core\Admin_Forms' ) ) {
if ( $sorting ) {
$html .= '<span class="um-field-icon"><i class="um-faicon-sort"></i></span>';
}
$data_types_html = '';
foreach ( UM()->member_directory()->sort_data_types as $type_key => $type_label ) {
$data_types_html .= '<option value="' . esc_attr( $type_key ) . '" ' . selected( $other_type, $type_key, false ) . '>' . esc_html( $type_label ) . '</option>';
}
$html .= '<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-wrapper um-custom-order-fields"><label>' . __( 'Meta key', 'ultimate-member' ) . ':&nbsp;<input type="text" name="um_metadata[_um_sorting_fields][other_data][' . $k . '][meta_key]" value="' . esc_attr( $other_key ) . '" /></label></span>
<span class="um-field-wrapper um-custom-order-fields"><label>' . __( 'Data type', 'ultimate-member' ) . ':&nbsp;<select name="um_metadata[_um_sorting_fields][other_data][' . $k . '][data_type]" />
<option value="CHAR" ' . selected( $other_type, 'CHAR', false ) . '>' . __( 'CHAR', 'ultimate-member' ) . '</option>
<option value="NUMERIC" ' . selected( $other_type, 'NUMERIC', false ) . '>' . __( 'NUMERIC', 'ultimate-member' ) . '</option>
<option value="BINARY" ' . selected( $other_type, 'BINARY', false ) . '>' . __( 'BINARY', 'ultimate-member' ) . '</option>
<option value="DATE" ' . selected( $other_type, 'DATE', false ) . '>' . __( 'DATE', 'ultimate-member' ) . '</option>
<option value="DATETIME" ' . selected( $other_type, 'DATETIME', false ) . '>' . __( 'DATETIME', 'ultimate-member' ) . '</option>
<option value="DECIMAL" ' . selected( $other_type, 'DECIMAL', false ) . '>' . __( 'DECIMAL', 'ultimate-member' ) . '</option>
<option value="SIGNED" ' . selected( $other_type, 'SIGNED', false ) . '>' . __( 'SIGNED', 'ultimate-member' ) . '</option>
<option value="TIME" ' . selected( $other_type, 'TIME', false ) . '>' . __( 'TIME', 'ultimate-member' ) . '</option>
<option value="UNSIGNED" ' . selected( $other_type, 'UNSIGNED', false ) . '>' . __( 'UNSIGNED', 'ultimate-member' ) . '</option>
</select></label></span>
<span class="um-field-wrapper um-custom-order-fields"><label>' . __( 'Data type', 'ultimate-member' ) . ':&nbsp;<select name="um_metadata[_um_sorting_fields][other_data][' . $k . '][data_type]" />' .
$data_types_html .
'</select></label></span>
<span class="um-field-wrapper um-custom-order-fields"><label>' . __( 'Order', 'ultimate-member' ) . ':&nbsp;<select name="um_metadata[_um_sorting_fields][other_data][' . $k . '][order]" />
<option value="ASC" ' . selected( $other_order, 'ASC', false ) . '>' . __( 'ASC', 'ultimate-member' ) . '</option>
<option value="DESC" ' . selected( $other_order, 'DESC', false ) . '>' . __( 'DESC', 'ultimate-member' ) . '</option>
+3 -15
View File
@@ -7,18 +7,6 @@ global $post_id;
$_um_sorting_fields = get_post_meta( $post_id, '_um_sorting_fields', true );
$_um_sorting_fields = empty( $_um_sorting_fields ) ? array() : $_um_sorting_fields;
$custom_type_options = array(
'CHAR' => 'CHAR',
'NUMERIC' => 'NUMERIC',
'BINARY' => 'BINARY',
'DATE' => 'DATE',
'DATETIME' => 'DATETIME',
'DECIMAL' => 'DECIMAL',
'SIGNED' => 'SIGNED',
'TIME' => 'TIME',
'UNSIGNED' => 'UNSIGNED',
);
$fields = array(
array(
'id' => '_um_sortby',
@@ -42,7 +30,7 @@ $fields = array(
'label' => __( 'Data type', 'ultimate-member' ),
'tooltip' => __( 'To correct sort by a custom field, choose a data type', 'ultimate-member' ),
'value' => UM()->query()->get_meta_value( '_um_sortby_custom_type', null, 'CHAR' ),
'options' => $custom_type_options,
'options' => UM()->member_directory()->sort_data_types,
'conditional' => array( '_um_sortby', '=', 'other' ),
),
array(
@@ -52,8 +40,8 @@ $fields = array(
'tooltip' => __( 'To correct sort by a custom field, choose an order', 'ultimate-member' ),
'value' => UM()->query()->get_meta_value( '_um_sortby_custom_order', null, 'ASC' ),
'options' => array(
'ASC' => 'ASC',
'DESC' => 'DESC',
'ASC' => __( 'ASC', 'ultimate-member' ),
'DESC' => __( 'DESC', 'ultimate-member' ),
),
'conditional' => array( '_um_sortby', '=', 'other' ),
),
+3 -4
View File
@@ -1,13 +1,12 @@
<?php
namespace um;
if ( ! defined( 'ABSPATH' ) ) exit;
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
if ( ! class_exists( 'um\Config' ) ) {
/**
* Class Config
*
+28 -24
View File
@@ -1,27 +1,36 @@
<?php
namespace um\core;
if ( ! defined( 'ABSPATH' ) ) exit;
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
if ( ! class_exists( 'um\core\Member_Directory_Meta' ) ) {
/**
* Class Member_Directory_Meta
* @package um\core
*/
class Member_Directory_Meta extends Member_Directory {
/**
* @var array
*/
public $joins = array();
/**
* @var string
* @var array
*/
var $joins = array();
var $where_clauses = array();
public $where_clauses = array();
var $roles = array();
/**
* @var array
*/
public $roles = array();
/**
* @var bool
*/
var $roles_in_query = false;
var $general_meta_joined = false;
@@ -35,7 +44,7 @@ if ( ! class_exists( 'um\core\Member_Directory_Meta' ) ) {
/**
* Member_Directory_Meta constructor.
*/
function __construct() {
public function __construct() {
parent::__construct();
add_action( 'updated_user_meta', array( &$this, 'on_update_usermeta' ), 10, 4 );
@@ -501,7 +510,6 @@ if ( ! class_exists( 'um\core\Member_Directory_Meta' ) ) {
}
}
$profile_photo_where = '';
if ( $directory_data['has_profile_photo'] == 1 ) {
$profile_photo_where = " AND umm_general.um_value LIKE '%s:13:\"profile_photo\";b:1;%'";
@@ -578,7 +586,6 @@ if ( ! class_exists( 'um\core\Member_Directory_Meta' ) ) {
}
}
if ( ! empty( $_POST['search'] ) ) {
$search_line = trim( stripslashes( sanitize_text_field( $_POST['search'] ) ) );
@@ -600,7 +607,6 @@ if ( ! class_exists( 'um\core\Member_Directory_Meta' ) ) {
$this->is_search = true;
}
//filters
$filter_query = array();
if ( ! empty( $directory_data['search_fields'] ) ) {
@@ -638,7 +644,6 @@ if ( ! class_exists( 'um\core\Member_Directory_Meta' ) ) {
}
}
//unable default filter in case if we select other filters in frontend filters
//if ( empty( $this->custom_filters_in_query ) ) {
$default_filters = array();
@@ -676,7 +681,7 @@ if ( ! class_exists( 'um\core\Member_Directory_Meta' ) ) {
if ( ! empty( UM()->builtin()->saved_fields ) ) {
foreach ( UM()->builtin()->saved_fields as $key => $data ) {
if ( $key == '_um_last_login' ) {
if ( '_um_last_login' === $key ) {
continue;
}
@@ -694,26 +699,26 @@ if ( ! class_exists( 'um\core\Member_Directory_Meta' ) ) {
// handle sorting options
// sort members by
if ( $sortby == $directory_data['sortby_custom'] || in_array( $sortby, $custom_sort ) ) {
$custom_sort_order = ! empty( $directory_data['sortby_custom_order'] ) ? $directory_data['sortby_custom_order'] : 'CHAR';
$custom_sort_order = ! empty( $directory_data['sortby_custom_order'] ) ? $directory_data['sortby_custom_order'] : 'ASC';
$this->joins[] = "LEFT JOIN {$wpdb->prefix}um_metadata umm_sort ON ( umm_sort.user_id = u.ID AND umm_sort.um_key = '{$sortby}' )";
$custom_sort_type = ! empty( $directory_data['sortby_custom_type'] ) ? $directory_data['sortby_custom_type'] : 'CHAR';
$meta_query = new \WP_Meta_Query();
$custom_sort_type = ! empty( $directory_data['sortby_custom_type'] ) ? $meta_query->get_cast_for_type( $directory_data['sortby_custom_type'] ) : 'CHAR';
if ( ! empty( $directory_data['sorting_fields'] ) ) {
// phpcs:disable WordPress.Security.NonceVerification -- already verified here
// phpcs:ignore WordPress.Security.NonceVerification -- already verified here
$sorting = sanitize_text_field( $_POST['sorting'] );
$sorting_fields = unserialize( $directory_data['sorting_fields'] );
// phpcs:enable WordPress.Security.NonceVerification
$sorting_fields = maybe_unserialize( $directory_data['sorting_fields'] );
foreach ( $sorting_fields as $field ) {
if ( isset( $field[ $sorting ] ) ) {
$custom_sort_type = $field['type'];
$custom_sort_type = ! empty( $field['type'] ) ? $meta_query->get_cast_for_type( $field['type'] ) : 'CHAR';
$custom_sort_order = $field['order'];
}
}
}
if ( 'NUMERIC' === $custom_sort_type ) {
$custom_sort_type = 'DECIMAL';
}
/** This filter is documented in includes/core/class-member-directory.php */
$custom_sort_type = apply_filters( 'um_member_directory_custom_sorting_type', $custom_sort_type, $sortby, $directory_data );
$this->sql_order = " ORDER BY CAST( umm_sort.um_value AS {$custom_sort_type} ) {$custom_sort_order} ";
@@ -819,7 +824,6 @@ if ( ! class_exists( 'um\core\Member_Directory_Meta' ) ) {
$this->sql_order = apply_filters( 'um_modify_sortby_parameter_meta', $this->sql_order, $sortby );
$profiles_per_page = $directory_data['profiles_per_page'];
if ( UM()->mobile()->isMobile() && isset( $directory_data['profiles_per_page_mobile'] ) ) {
$profiles_per_page = $directory_data['profiles_per_page_mobile'];
+52 -15
View File
@@ -1,20 +1,18 @@
<?php
namespace um\core;
if ( ! defined( 'ABSPATH' ) ) exit;
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
if ( ! class_exists( 'um\core\Member_Directory' ) ) {
/**
* Class Member_Directory
* @package um\core
*/
class Member_Directory {
/**
* Member Directory Views
*
@@ -28,6 +26,10 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) {
*/
var $sort_fields = array();
/**
* @var array
*/
var $sort_data_types = array();
/**
* @var array
@@ -320,6 +322,20 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) {
$this->sorting_supported_fields = apply_filters( 'um_members_directory_custom_field_types_supported_sorting', array( 'number' ) );
$this->sort_data_types = array(
'CHAR' => __( 'CHAR', 'ultimate-member' ),
'NUMERIC' => __( 'NUMERIC', 'ultimate-member' ),
'BINARY' => __( 'BINARY', 'ultimate-member' ),
'DATE' => __( 'DATE', 'ultimate-member' ),
'DATETIME' => __( 'DATETIME', 'ultimate-member' ),
'DECIMAL' => __( 'DECIMAL', 'ultimate-member' ),
'SIGNED' => __( 'SIGNED', 'ultimate-member' ),
'TIME' => __( 'TIME', 'ultimate-member' ),
'UNSIGNED' => __( 'UNSIGNED', 'ultimate-member' ),
);
$this->sort_data_types = apply_filters( 'um_members_directory_sort_data_types', $this->sort_data_types );
if ( ! empty( UM()->builtin()->saved_fields ) ) {
foreach ( UM()->builtin()->saved_fields as $key => $data ) {
if ( $key == '_um_last_login' ) {
@@ -1434,21 +1450,45 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) {
unset( $this->query_args['order'] );
} elseif ( ( ! empty( $directory_data['sortby_custom'] ) && $sortby == $directory_data['sortby_custom'] ) || in_array( $sortby, $custom_sort ) ) {
$custom_sort_order = ! empty( $directory_data['sortby_custom_order'] ) ? $directory_data['sortby_custom_order'] : 'CHAR';
$custom_sort_order = ! empty( $directory_data['sortby_custom_order'] ) ? $directory_data['sortby_custom_order'] : 'ASC';
$custom_sort_type = ! empty( $directory_data['sortby_custom_type'] ) ? $directory_data['sortby_custom_type'] : 'CHAR';
$meta_query = new \WP_Meta_Query();
$custom_sort_type = ! empty( $directory_data['sortby_custom_type'] ) ? $meta_query->get_cast_for_type( $directory_data['sortby_custom_type'] ) : 'CHAR';
if ( ! empty( $directory_data['sorting_fields'] ) ) {
// phpcs:disable WordPress.Security.NonceVerification -- already verified here
// phpcs:ignore WordPress.Security.NonceVerification -- already verified here
$sorting = sanitize_text_field( $_POST['sorting'] );
$sorting_fields = unserialize( $directory_data['sorting_fields'] );
// phpcs:enable WordPress.Security.NonceVerification
$sorting_fields = maybe_serialize( $directory_data['sorting_fields'] );
foreach ( $sorting_fields as $field ) {
if ( isset( $field[ $sorting ] ) ) {
$custom_sort_type = $field['type'];
$custom_sort_type = ! empty( $field['type'] ) ? $meta_query->get_cast_for_type( $field['type'] ) : 'CHAR';
$custom_sort_order = $field['order'];
}
}
}
/**
* Filters the sorting MySQL type in member directory custom sorting query.
*
* Note: Possible MySQL types are BINARY|CHAR|DATE|DATETIME|SIGNED|UNSIGNED|TIME|DECIMAL
*
* @since 2.1.3
* @hook um_member_directory_custom_sorting_type
*
* @param {string} $custom_sort_type MySQL type to cast meta_value. 'CHAR' is default.
* @param {string} $sortby meta_key used for sorting.
* @param {array} $directory_data Member directory data.
*
* @return {string} MySQL type to cast meta_value.
* @example <caption>Change type to DATE by the directory ID and mete_key.</caption>
* function my_um_member_directory_custom_sorting_type( $custom_sort_type, $sortby, $directory_data ) {
* if ( '{selected member directory ID}' == $directory_data['form_id'] && '{custom_date_key}' === $sortby ) {
* $custom_sort_type = 'DATE';
* }
*
* return $custom_sort_type;
* }
* add_filter( 'um_member_directory_custom_sorting_type', 'my_um_member_directory_custom_sorting_type', 10, 3 );
*/
$custom_sort_type = apply_filters( 'um_member_directory_custom_sorting_type', $custom_sort_type, $sortby, $directory_data );
$this->query_args['meta_query'][] = array(
@@ -2643,10 +2683,7 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) {
add_filter( 'get_meta_sql', array( &$this, 'change_meta_sql' ), 10, 6 );
add_filter( 'pre_user_query', array( &$this, 'pagination_changes' ), 10, 1 );
//echo '<pre>';
//print_r($this->query_args);
//echo '</pre>';
//exit();
$user_query = new \WP_User_Query( $this->query_args );
remove_filter( 'pre_user_query', array( &$this, 'pagination_changes' ), 10 );