diff --git a/includes/core/class-member-directory-meta.php b/includes/core/class-member-directory-meta.php index 7de32645..bb094cde 100644 --- a/includes/core/class-member-directory-meta.php +++ b/includes/core/class-member-directory-meta.php @@ -405,8 +405,8 @@ if ( ! class_exists( 'um\core\Member_Directory_Meta' ) ) { } } - $from_date = date( 'Y-m-d H:s:i', strtotime( min( $value ) ) + $offset * HOUR_IN_SECONDS ); // client time zone offset - $to_date = date( 'Y-m-d H:s:i', strtotime( max( $value ) ) + $offset * HOUR_IN_SECONDS + DAY_IN_SECONDS - 1 ); // time 23:59 + $from_date = date( 'Y-m-d H:i:s', strtotime( min( $value ) ) + $offset * HOUR_IN_SECONDS ); // client time zone offset + $to_date = date( 'Y-m-d H:i:s', strtotime( max( $value ) ) + $offset * HOUR_IN_SECONDS + DAY_IN_SECONDS - 1 ); // time 23:59 $this->where_clauses[] = $wpdb->prepare( "u.user_registered BETWEEN %s AND %s", $from_date, $to_date ); @@ -416,7 +416,6 @@ if ( ! class_exists( 'um\core\Member_Directory_Meta' ) ) { break; case 'last_login': - $offset = 0; if ( ! $is_default ) { if ( isset( $_POST['gmt_offset'] ) && is_numeric( $_POST['gmt_offset'] ) ) { @@ -429,8 +428,8 @@ if ( ! class_exists( 'um\core\Member_Directory_Meta' ) ) { } } - $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 + $from_date = gmdate( 'Y-m-d H:i:s', (int) min( $value ) + ( $offset * HOUR_IN_SECONDS ) ); // client time zone offset + $to_date = gmdate( 'Y-m-d H:i:s', (int) max( $value ) + ( $offset * HOUR_IN_SECONDS ) + DAY_IN_SECONDS - 1 ); // time 23:59 $this->joins[] = "LEFT JOIN {$wpdb->prefix}um_metadata {$join_slug}{$i} ON {$join_slug}{$i}.user_id = u.ID"; @@ -764,11 +763,10 @@ if ( ! class_exists( 'um\core\Member_Directory_Meta' ) ) { $this->sql_order = " ORDER BY CAST( umm_sort.um_value AS CHAR ) {$order} "; - } elseif ( $sortby == 'last_login' ) { + } elseif ( 'last_login' === $sortby ) { - $this->joins[] = "LEFT JOIN {$wpdb->prefix}um_metadata umm_sort ON ( umm_sort.user_id = u.ID AND umm_sort.um_key = '_um_last_login' )"; - - $this->sql_order = " ORDER BY CAST( umm_sort.um_value AS SIGNED ) DESC "; + $this->joins[] = "LEFT JOIN {$wpdb->prefix}um_metadata umm_sort ON ( umm_sort.user_id = u.ID AND umm_sort.um_key = '_um_last_login' )"; + $this->sql_order = ' ORDER BY CAST( umm_sort.um_value AS DATETIME ) DESC '; } elseif ( $sortby == 'last_first_name' ) { diff --git a/includes/core/class-member-directory.php b/includes/core/class-member-directory.php index 379bbea2..01a7312c 100644 --- a/includes/core/class-member-directory.php +++ b/includes/core/class-member-directory.php @@ -364,7 +364,7 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) { 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; } @@ -419,7 +419,7 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) { 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; } @@ -527,10 +527,9 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) { } $field_key = $filter; - if ( $filter == 'last_login' ) { + if ( 'last_login' === $filter ) { $field_key = '_um_last_login'; - } - if ( $filter == 'role' ) { + } elseif ( 'role' === $filter ) { $field_key = 'role_select'; } @@ -812,29 +811,28 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) { break; } - case 'datepicker': { - + case 'datepicker': $range = $this->datepicker_filters_range( $filter ); $label = ! empty( $attrs['label'] ) ? $attrs['label'] : $attrs['title']; - if ( $range ) { ?> - + if ( $range ) { + $min = strtotime( $range[0] ); + $max = strtotime( $range[1] ); + ?> - - timepicker_filters_range( $filter ); @@ -996,19 +994,16 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) { return $placeholders; } - /** * @param $filter * * @return mixed */ - function datepicker_filters_range( $filter ) { + public function datepicker_filters_range( $filter ) { global $wpdb; switch ( $filter ) { - - default: { - + default: global $wpdb; $meta = $wpdb->get_col( $wpdb->prepare( "SELECT DISTINCT meta_value FROM {$wpdb->usermeta} @@ -1024,22 +1019,22 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) { $range = apply_filters( "um_member_directory_filter_{$filter}_datepicker", $range ); break; - } - case 'last_login': { - $meta = $wpdb->get_col( "SELECT DISTINCT meta_value + case 'last_login': + $meta = $wpdb->get_row( + "SELECT DISTINCT COUNT(*) AS total, + MIN(meta_value) AS min, + MAX(meta_value) AS max FROM {$wpdb->usermeta} - WHERE meta_key='_um_last_login' - ORDER BY meta_value DESC" ); - - if ( empty( $meta ) || count( $meta ) === 1 ) { + WHERE meta_key = '_um_last_login'", + ARRAY_A + ); + if ( empty( $meta['total'] ) || 1 === absint( $meta['total'] ) ) { $range = false; - } elseif ( ! empty( $meta ) ) { - $range = array( min( $meta ), max( $meta ) ); + } elseif ( array_key_exists( 'min', $meta ) && array_key_exists( 'max', $meta ) ) { + $range = array( $meta['min'], $meta['max'] ); } - break; - } - case 'user_registered': { + case 'user_registered': $meta = $wpdb->get_col( "SELECT DISTINCT user_registered FROM {$wpdb->users} @@ -1053,14 +1048,11 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) { } break; - } - } return $range; } - /** * @param $filter * @@ -1349,7 +1341,7 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) { 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; } @@ -1402,22 +1394,22 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) { $this->query_args['orderby'] = array( $sortby . '_c' => 'ASC' ); unset( $this->query_args['order'] ); - } elseif ( $sortby == 'last_login' ) { - - $this->query_args['orderby'] = array( 'um_last_login' => 'DESC' ); + } elseif ( 'last_login' === $sortby ) { + $this->query_args['orderby'] = array( 'um_last_login' => 'DESC' ); $this->query_args['meta_query'][] = array( - 'relation' => 'OR', + 'relation' => 'OR', array( - 'key' => '_um_last_login', - 'compare' => 'EXISTS', + 'key' => '_um_last_login', + 'compare' => 'EXISTS', + 'type' => 'DATETIME', ), 'um_last_login' => array( - 'key' => '_um_last_login', - 'compare' => 'NOT EXISTS', + 'key' => '_um_last_login', + 'compare' => 'NOT EXISTS', + 'type' => 'DATETIME', ), ); unset( $this->query_args['order'] ); - } elseif ( $sortby == 'last_first_name' ) { $this->query_args['meta_query'][] = array( @@ -1534,12 +1526,12 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) { if ( strstr( $sortby, '_desc' ) ) { $sortby = str_replace( '_desc', '', $sortby ); - $order = 'DESC'; + $order = 'DESC'; } if ( strstr( $sortby, '_asc' ) ) { $sortby = str_replace( '_asc', '', $sortby ); - $order = 'ASC'; + $order = 'ASC'; } $this->query_args['orderby'] = $sortby; @@ -1550,7 +1542,6 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) { add_filter( 'pre_user_query', array( &$this, 'sortby_randomly' ), 10, 1 ); } - /** * UM hook * @@ -1984,9 +1975,8 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) { 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 ) ) ); + $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( @@ -1995,7 +1985,7 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) { 'compare' => 'BETWEEN', 'type' => 'DATE', 'inclusive' => true, - ) + ), ); $this->query_args['meta_query'] = array_merge( $this->query_args['meta_query'], array( $meta_query ) ); @@ -2010,8 +2000,8 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) { $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" ) ); + $from_date = date( 'Y-m-d H:i:s', strtotime( date( 'Y-m-d H:i:s', min( $value ) ) . "+$offset hours" ) ); + $to_date = date( 'Y-m-d H:i:s', strtotime( date( 'Y-m-d H:i:s', max( $value ) ) . "+$offset hours" ) ); $date_query = array( array( @@ -2032,7 +2022,6 @@ 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']; @@ -2043,10 +2032,11 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) { $meta_query = array( array( 'key' => '_um_last_login', - 'value' => array( $from_date, $to_date ), + 'value' => array( gmdate( 'Y-m-d H:i:s', $from_date ), gmdate( 'Y-m-d H:i:s', $to_date ) ), 'compare' => 'BETWEEN', 'inclusive' => true, - ) + 'type' => 'DATETIME', + ), ); $this->custom_filters_in_query[ $field ] = $value; @@ -2054,7 +2044,6 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) { $this->query_args['meta_query'] = array_merge( $this->query_args['meta_query'], array( $meta_query ) ); break; } - } } @@ -2262,8 +2251,8 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) { $offset = $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" ) ); + $from_date = date( 'Y-m-d H:i:s', strtotime( date( 'Y-m-d H:i:s', min( $value ) ) . "+$offset hours" ) ); + $to_date = date( 'Y-m-d H:i:s', strtotime( date( 'Y-m-d H:i:s', max( $value ) ) . "+$offset hours" ) ); $date_query = array( array( @@ -2287,15 +2276,16 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) { $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 + $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 ), + 'value' => array( $from_date, $to_date ), 'compare' => 'BETWEEN', 'inclusive' => true, - ) + 'type' => 'DATETIME', + ), ); $this->query_args['meta_query'] = array_merge( $this->query_args['meta_query'], array( $meta_query ) );