2019-12-20 15:06:58 +02:00
< ? php
namespace um\core ;
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 string
*/
var $joins = array ();
2020-01-08 15:19:24 +02:00
var $where_clauses = array ();
var $roles = array ();
var $general_meta_joined = false ;
2020-01-29 13:22:03 +02:00
var $having = '' ;
var $select = '' ;
2019-12-20 15:06:58 +02:00
var $sql_limit = '' ;
var $sql_order = '' ;
/**
* Member_Directory_Meta constructor.
*/
function __construct () {
parent :: __construct ();
add_action ( 'updated_user_meta' , array ( & $this , 'on_update_usermeta' ), 10 , 4 );
add_action ( 'added_user_meta' , array ( & $this , 'on_update_usermeta' ), 10 , 4 );
2020-01-06 11:05:32 +02:00
add_action ( 'deleted_user_meta' , array ( & $this , 'on_delete_usermeta' ), 10 , 4 );
2020-04-10 17:32:32 +03:00
add_action ( 'um_add_new_field' , array ( & $this , 'on_new_field_added' ), 10 , 2 );
add_action ( 'um_delete_custom_field' , array ( & $this , 'on_delete_custom_field' ), 10 , 2 );
2020-01-06 11:05:32 +02:00
}
/**
* Delete custom field and metakey from UM usermeta table
*
* @param $metakey
2020-04-10 17:32:32 +03:00
* @param $args
2020-01-06 11:05:32 +02:00
*/
2020-04-10 17:32:32 +03:00
function on_delete_custom_field ( $metakey , $args ) {
2020-01-06 11:05:32 +02:00
$metakeys = get_option ( 'um_usermeta_fields' , array () );
2020-04-10 17:32:32 +03:00
if ( $args [ 'type' ] == 'user_location' ) {
if ( array_intersect ( array ( $metakey . '_lat' , $metakey . '_lng' , $metakey . '_url' ), $metakeys ) ) {
if ( false !== $searched = array_search ( $metakey . '_lat' , $metakeys ) ) {
unset ( $metakeys [ $searched ] );
}
if ( false !== $searched = array_search ( $metakey . '_lng' , $metakeys ) ) {
unset ( $metakeys [ $searched ] );
}
if ( false !== $searched = array_search ( $metakey . '_url' , $metakeys ) ) {
unset ( $metakeys [ $searched ] );
}
global $wpdb ;
$wpdb -> query ( $wpdb -> prepare (
" DELETE FROM { $wpdb -> prefix } um_metadata
WHERE um_key = %s OR
um_key = %s OR
um_key = %s " ,
$metakey . '_lat' ,
$metakey . '_lng' ,
$metakey . '_url'
) );
update_option ( 'um_usermeta_fields' , array_values ( $metakeys ) );
}
} else {
if ( in_array ( $metakey , $metakeys ) ) {
unset ( $metakeys [ array_search ( $metakey , $metakeys ) ] );
global $wpdb ;
$wpdb -> delete (
" { $wpdb -> prefix } um_metadata " ,
array (
'um_key' => $metakey
),
array (
'%s'
)
);
update_option ( 'um_usermeta_fields' , array_values ( $metakeys ) );
}
2020-01-06 11:05:32 +02:00
}
}
/**
* Add metakey to usermeta fields
*
* @param $metakey
2020-04-10 17:32:32 +03:00
* @param $args
2020-01-06 11:05:32 +02:00
*/
2020-04-10 17:32:32 +03:00
function on_new_field_added ( $metakey , $args ) {
2020-01-06 11:05:32 +02:00
$metakeys = get_option ( 'um_usermeta_fields' , array () );
2020-04-10 17:32:32 +03:00
if ( $args [ 'type' ] == 'user_location' ) {
$update = false ;
if ( ! in_array ( $metakey . '_lat' , $metakeys ) ) {
$update = true ;
$metakeys [] = $metakey . '_lat' ;
}
if ( ! in_array ( $metakey . '_lng' , $metakeys ) ) {
$update = true ;
$metakeys [] = $metakey . '_lng' ;
}
if ( ! in_array ( $metakey . '_url' , $metakeys ) ) {
$update = true ;
$metakeys [] = $metakey . '_url' ;
}
if ( $update ) {
update_option ( 'um_usermeta_fields' , array_values ( $metakeys ) );
}
} else {
if ( ! in_array ( $metakey , $metakeys ) ) {
$metakeys [] = $metakey ;
update_option ( 'um_usermeta_fields' , array_values ( $metakeys ) );
}
2020-01-06 11:05:32 +02:00
}
}
/**
* When you delete usermeta - remove row from um_metadata
*
* @param int|array $meta_ids
* @param int $object_id
* @param string $meta_key
* @param mixed $_meta_value
*/
function on_delete_usermeta ( $meta_ids , $object_id , $meta_key , $_meta_value ) {
$metakeys = get_option ( 'um_usermeta_fields' , array () );
if ( ! in_array ( $meta_key , $metakeys ) ) {
return ;
}
global $wpdb ;
$wpdb -> delete (
" { $wpdb -> prefix } um_metadata " ,
array (
'user_id' => $object_id ,
'um_key' => $meta_key
),
array (
'%d' ,
'%s'
)
);
2019-12-20 15:06:58 +02:00
}
2020-01-06 11:05:32 +02:00
/**
* When you add/update usermeta - add/update row from um_metadata
*
* @param int $meta_id
* @param int $object_id
* @param string $meta_key
* @param mixed $_meta_value
*/
2019-12-20 15:06:58 +02:00
function on_update_usermeta ( $meta_id , $object_id , $meta_key , $_meta_value ) {
$metakeys = get_option ( 'um_usermeta_fields' , array () );
if ( ! in_array ( $meta_key , $metakeys ) ) {
return ;
}
global $wpdb ;
2020-01-06 11:05:32 +02:00
$result = $wpdb -> get_var ( $wpdb -> prepare (
" SELECT umeta_id
FROM { $wpdb -> prefix } um_metadata
WHERE user_id = %d AND
um_key = %s
LIMIT 1 " ,
$object_id ,
$meta_key
) );
2019-12-20 15:06:58 +02:00
if ( empty ( $result ) ) {
$wpdb -> insert (
" { $wpdb -> prefix } um_metadata " ,
array (
'user_id' => $object_id ,
'um_key' => $meta_key ,
2020-01-06 12:50:21 +02:00
'um_value' => maybe_serialize ( $_meta_value ),
2019-12-20 15:06:58 +02:00
),
array (
'%d' ,
'%s' ,
'%s' ,
)
);
} else {
$wpdb -> update (
" { $wpdb -> prefix } um_metadata " ,
array (
2020-01-06 12:50:21 +02:00
'um_value' => maybe_serialize ( $_meta_value ),
2019-12-20 15:06:58 +02:00
),
array (
2020-01-06 11:05:32 +02:00
'umeta_id' => $result ,
2019-12-20 15:06:58 +02:00
),
array (
'%s' ,
),
array (
'%d' ,
)
);
}
}
2020-01-08 15:19:24 +02:00
/**
* @param $directory_data
* @param $field
* @param $value
* @param $i
* @param bool $is_default
*/
function handle_filter_query ( $directory_data , $field , $value , $i , $is_default = false ) {
global $wpdb ;
2020-01-10 17:31:55 +02:00
$join_slug = $is_default ? 'ummd' : 'umm' ;
2020-01-08 15:19:24 +02:00
$blog_id = get_current_blog_id ();
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_meta', 'function_name', 10, 4 ); ?>
* @example
* <?php
* add_filter( 'um_query_args_{$field}__filter_meta', 'my_query_args_filter', 10, 4 );
* function my_query_args_filter( $field_query ) {
* // your code here
* return $field_query;
* }
* ?>
*/
$skip_default = apply_filters ( " um_query_args_ { $field } __filter_meta " , false , $this , $field , $value , $filter_type , $is_default );
2020-02-21 09:01:18 +02:00
$skip_default = apply_filters ( 'um_query_args_filter_global_meta' , $skip_default , $this , $field , $value , $filter_type , $is_default );
2020-01-08 15:19:24 +02:00
if ( ! $skip_default ) {
switch ( $filter_type ) {
default :
do_action ( " um_query_args_ { $field } _ { $filter_type } __filter_meta " , $field , $value , $filter_type , $i , $is_default );
break ;
case 'text' :
2020-01-10 17:31:55 +02:00
$this -> joins [] = " LEFT JOIN { $wpdb -> prefix } um_metadata { $join_slug } { $i } ON { $join_slug } { $i } .user_id = u.ID " ;
2020-01-08 15:19:24 +02:00
$value = trim ( stripslashes ( $value ) );
2020-01-10 17:31:55 +02:00
$this -> where_clauses [] = $wpdb -> prepare ( " { $join_slug } { $i } .um_key = %s AND { $join_slug } { $i } .um_value = %s " , $field , $value );
2020-01-08 15:19:24 +02:00
if ( ! $is_default ) {
$this -> custom_filters_in_query [ $field ] = $value ;
}
break ;
case 'select' :
if ( ! is_array ( $value ) ) {
$value = array ( $value );
}
2020-01-10 17:31:55 +02:00
$this -> joins [] = " LEFT JOIN { $wpdb -> prefix } um_metadata { $join_slug } { $i } ON { $join_slug } { $i } .user_id = u.ID " ;
2020-01-08 15:19:24 +02:00
$values_array = array ();
foreach ( $value as $single_val ) {
$single_val = stripslashes ( $single_val );
2020-01-10 17:31:55 +02:00
$values_array [] = $wpdb -> prepare ( " { $join_slug } { $i } .um_value LIKE %s " , '%"' . trim ( $single_val ) . '"%' );
$values_array [] = $wpdb -> prepare ( " { $join_slug } { $i } .um_value LIKE %s " , '%' . serialize ( strval ( trim ( $single_val ) ) ) . '%' );
$values_array [] = $wpdb -> prepare ( " { $join_slug } { $i } .um_value = %s " , trim ( $single_val ) );
2020-01-08 15:19:24 +02:00
if ( is_numeric ( $single_val ) ) {
2020-01-10 17:31:55 +02:00
$values_array [] = $wpdb -> prepare ( " { $join_slug } { $i } .um_value LIKE %s " , '%' . serialize ( intval ( trim ( $single_val ) ) ) . '%' );
2020-01-08 15:19:24 +02:00
}
}
$values = implode ( ' OR ' , $values_array );
2020-01-10 17:31:55 +02:00
$this -> where_clauses [] = $wpdb -> prepare ( " ( { $join_slug } { $i } .um_key = %s AND ( { $values } ) ) " , $field );
2020-01-08 15:19:24 +02:00
if ( ! $is_default ) {
$this -> custom_filters_in_query [ $field ] = $value ;
}
break ;
case 'slider' :
2020-01-10 17:31:55 +02:00
$this -> joins [] = " LEFT JOIN { $wpdb -> prefix } um_metadata { $join_slug } { $i } ON { $join_slug } { $i } .user_id = u.ID " ;
2020-01-08 15:19:24 +02:00
$min = min ( $value );
$max = max ( $value );
2020-01-10 17:31:55 +02:00
$this -> where_clauses [] = $wpdb -> prepare ( " ( { $join_slug } { $i } .um_key = %s AND { $join_slug } { $i } .um_value BETWEEN %d AND %d ) " , $field , $min , $max );
2020-01-08 15:19:24 +02:00
if ( ! $is_default ) {
$this -> custom_filters_in_query [ $field ] = $value ;
}
break ;
case 'datepicker' :
$offset = 0 ;
if ( ! $is_default ) {
if ( isset ( $_POST [ 'gmt_offset' ] ) && is_numeric ( $_POST [ 'gmt_offset' ] ) ) {
$offset = ( int ) $_POST [ 'gmt_offset' ];
}
} else {
$gmt_offset = get_post_meta ( $directory_data [ 'form_id' ], '_um_search_filters_gmt' , true );
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
$from_date = date ( 'Y/m/d' , $from_date );
$to_date = date ( 'Y/m/d' , $to_date );
2020-01-10 17:31:55 +02:00
$this -> joins [] = " LEFT JOIN { $wpdb -> prefix } um_metadata { $join_slug } { $i } ON { $join_slug } { $i } .user_id = u.ID " ;
2020-01-08 15:19:24 +02:00
2020-01-10 17:31:55 +02:00
$this -> where_clauses [] = $wpdb -> prepare ( " ( { $join_slug } { $i } .um_key = %s AND { $join_slug } { $i } .um_value BETWEEN %s AND %s ) " , $field , $from_date , $to_date );
2020-01-08 15:19:24 +02:00
if ( ! $is_default ) {
$this -> custom_filters_in_query [ $field ] = array ( $from_date , $to_date );
}
break ;
case 'timepicker' :
2020-01-10 17:31:55 +02:00
$this -> joins [] = " LEFT JOIN { $wpdb -> prefix } um_metadata { $join_slug } { $i } ON { $join_slug } { $i } .user_id = u.ID " ;
2020-01-08 15:19:24 +02:00
if ( $value [ 0 ] == $value [ 1 ] ) {
2020-01-10 17:31:55 +02:00
$this -> where_clauses [] = $wpdb -> prepare ( " ( { $join_slug } { $i } .um_key = %s AND { $join_slug } { $i } .um_value = %s ) " , $field , $value [ 0 ] );
2020-01-08 15:19:24 +02:00
} else {
2020-01-10 17:31:55 +02:00
$this -> where_clauses [] = $wpdb -> prepare ( " ( { $join_slug } { $i } .um_key = %s AND CAST( { $join_slug } { $i } .um_value AS TIME ) BETWEEN %s AND %s ) " , $field , $value [ 0 ], $value [ 1 ] );
2020-01-08 15:19:24 +02:00
}
if ( ! $is_default ) {
$this -> custom_filters_in_query [ $field ] = $value ;
}
break ;
}
}
break ;
case 'role' :
$value = array_map ( 'strtolower' , $value );
if ( empty ( $this -> roles ) && ! is_multisite () ) {
$this -> joins [] = " LEFT JOIN { $wpdb -> prefix } um_metadata umm_roles ON ( umm_roles.user_id = u.ID AND umm_roles.um_key = ' " . $wpdb -> get_blog_prefix ( $blog_id ) . " capabilities' ) " ;
$this -> roles = $value ;
}
$roles_clauses = array ();
foreach ( $value as $role ) {
$roles_clauses [] = $wpdb -> prepare ( " umm_roles.um_value LIKE %s " , '%"' . $role . '"%' );
}
$this -> where_clauses [] = '( ' . implode ( ' OR ' , $roles_clauses ) . ' )' ;
if ( ! $is_default ) {
$this -> custom_filters_in_query [ $field ] = $value ;
}
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 ) ) );
2020-01-10 17:31:55 +02:00
$this -> joins [] = " LEFT JOIN { $wpdb -> prefix } um_metadata { $join_slug } { $i } ON { $join_slug } { $i } .user_id = u.ID " ;
2020-01-08 15:19:24 +02:00
2020-01-13 17:31:25 +02:00
$this -> where_clauses [] = $wpdb -> prepare ( " ( { $join_slug } { $i } .um_key = 'birth_date' AND { $join_slug } { $i } .um_value BETWEEN %s AND %s ) " , $to_date , $from_date );
2020-01-08 15:19:24 +02:00
if ( ! $is_default ) {
$this -> custom_filters_in_query [ $field ] = array ( $to_date , $from_date );
}
break ;
case 'user_registered' :
$offset = 0 ;
if ( ! $is_default ) {
if ( isset ( $_POST [ 'gmt_offset' ] ) && is_numeric ( $_POST [ 'gmt_offset' ] ) ) {
$offset = ( int ) $_POST [ 'gmt_offset' ];
}
} else {
$gmt_offset = get_post_meta ( $directory_data [ 'form_id' ], '_um_search_filters_gmt' , true );
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 " ) );
$to_date = date ( 'Y-m-d H:s:i' , strtotime ( date ( 'Y-m-d H:s:i' , max ( $value ) ) . " + $offset hours " ) );
$this -> where_clauses [] = $wpdb -> prepare ( " u.user_registered BETWEEN %s AND %s " , $from_date , $to_date );
if ( ! $is_default ) {
$this -> custom_filters_in_query [ $field ] = $value ;
}
break ;
case 'last_login' :
$offset = 0 ;
if ( ! $is_default ) {
if ( isset ( $_POST [ 'gmt_offset' ] ) && is_numeric ( $_POST [ 'gmt_offset' ] ) ) {
$offset = ( int ) $_POST [ 'gmt_offset' ];
}
} else {
$gmt_offset = get_post_meta ( $directory_data [ 'form_id' ], '_um_search_filters_gmt' , true );
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
2020-01-10 17:31:55 +02:00
$this -> joins [] = " LEFT JOIN { $wpdb -> prefix } um_metadata { $join_slug } { $i } ON { $join_slug } { $i } .user_id = u.ID " ;
2020-01-08 15:19:24 +02:00
2020-01-10 17:31:55 +02:00
$this -> where_clauses [] = $wpdb -> prepare ( " ( { $join_slug } { $i } .um_key = '_um_last_login' AND { $join_slug } { $i } .um_value BETWEEN %s AND %s ) " , $from_date , $to_date );
2020-01-08 15:19:24 +02:00
if ( ! $is_default ) {
$this -> custom_filters_in_query [ $field ] = $value ;
}
break ;
}
}
2019-12-20 15:06:58 +02:00
/**
* Main Query function for getting members via AJAX
*/
function ajax_get_members () {
UM () -> check_ajax_nonce ();
global $wpdb ;
$blog_id = get_current_blog_id ();
$directory_id = $this -> get_directory_by_hash ( $_POST [ 'directory_id' ] );
$directory_data = UM () -> query () -> post_data ( $directory_id );
//predefined result for user without capabilities to see other members
$this -> predefined_no_caps ( $directory_data );
do_action ( 'um_member_directory_before_query' );
// Prepare for BIG SELECT query
$wpdb -> query ( 'SET SQL_BIG_SELECTS=1' );
if ( ! empty ( $directory_data [ 'show_these_users' ] ) ) {
$show_these_users = maybe_unserialize ( $directory_data [ 'show_these_users' ] );
if ( is_array ( $show_these_users ) && ! empty ( $show_these_users ) ) {
$users_array = array ();
foreach ( $show_these_users as $username ) {
if ( false !== ( $exists_id = username_exists ( $username ) ) ) {
$users_array [] = $exists_id ;
}
}
if ( ! empty ( $users_array ) ) {
2020-01-08 15:19:24 +02:00
$this -> where_clauses [] = " u.ID IN ( ' " . implode ( " ',' " , $users_array ) . " ' ) " ;
2019-12-20 15:06:58 +02:00
}
}
}
2020-05-25 17:51:48 +03:00
if ( ! empty ( $directory_data [ 'exclude_these_users' ] ) ) {
$exclude_these_users = maybe_unserialize ( $directory_data [ 'exclude_these_users' ] );
if ( is_array ( $exclude_these_users ) && ! empty ( $exclude_these_users ) ) {
$users_array = array ();
foreach ( $exclude_these_users as $username ) {
if ( false !== ( $exists_id = username_exists ( $username ) ) ) {
$users_array [] = $exists_id ;
}
}
if ( ! empty ( $users_array ) ) {
$this -> where_clauses [] = " u.ID NOT IN ( ' " . implode ( " ',' " , $users_array ) . " ' ) " ;
}
}
}
2019-12-20 15:06:58 +02:00
$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;%' " ;
}
$cover_photo_where = '' ;
if ( $directory_data [ 'has_cover_photo' ] == 1 ) {
$cover_photo_where = " AND umm_general.um_value LIKE '%s:11: \" cover_photo \" ;b:1;%' " ;
}
if ( ! UM () -> roles () -> um_user_can ( 'can_edit_everyone' ) ) {
2020-01-08 15:19:24 +02:00
if ( ! $this -> general_meta_joined ) {
$this -> joins [] = " LEFT JOIN { $wpdb -> prefix } um_metadata umm_general ON umm_general.user_id = u.ID " ;
$this -> general_meta_joined = true ;
}
$this -> where_clauses [] = " ( umm_general.um_key = 'um_member_directory_data' AND
2019-12-20 15:06:58 +02:00
umm_general.um_value LIKE '%s:14: \" account_status \" ;s:8: \" approved \" ;%' AND umm_general.um_value LIKE '%s:15: \" hide_in_members \" ;b:0;%' { $profile_photo_where } { $cover_photo_where } ) " ;
} else {
if ( ! empty ( $cover_photo_where ) || ! empty ( $profile_photo_where ) ) {
2020-01-08 15:19:24 +02:00
if ( ! $this -> general_meta_joined ) {
$this -> joins [] = " LEFT JOIN { $wpdb -> prefix } um_metadata umm_general ON umm_general.user_id = u.ID " ;
$this -> general_meta_joined = true ;
}
$this -> where_clauses [] = " ( umm_general.um_key = 'um_member_directory_data' { $profile_photo_where } { $cover_photo_where } ) " ;
2019-12-20 15:06:58 +02:00
}
}
2020-01-08 15:19:24 +02:00
//$this->roles = array();
2019-12-20 15:06:58 +02:00
if ( UM () -> roles () -> um_user_can ( 'can_view_all' ) ) {
$view_roles = um_user ( 'can_view_roles' );
if ( ! $view_roles ) {
$view_roles = array ();
}
2020-01-08 15:19:24 +02:00
$this -> roles = array_merge ( $this -> roles , maybe_unserialize ( $view_roles ) );
2019-12-20 15:06:58 +02:00
}
if ( ! empty ( $directory_data [ 'roles' ] ) ) {
2020-01-08 15:19:24 +02:00
if ( ! empty ( $this -> roles ) ) {
$this -> roles = array_intersect ( $this -> roles , maybe_unserialize ( $directory_data [ 'roles' ] ) );
2019-12-20 15:06:58 +02:00
} else {
2020-01-08 15:19:24 +02:00
$this -> roles = array_merge ( $this -> roles , maybe_unserialize ( $directory_data [ 'roles' ] ) );
2019-12-20 15:06:58 +02:00
}
}
2020-01-08 15:19:24 +02:00
if ( ! empty ( $this -> roles ) ) {
2019-12-20 15:06:58 +02:00
$this -> joins [] = " LEFT JOIN { $wpdb -> prefix } um_metadata umm_roles ON ( umm_roles.user_id = u.ID AND umm_roles.um_key = ' " . $wpdb -> get_blog_prefix ( $blog_id ) . " capabilities' ) " ;
$roles_clauses = array ();
2020-01-08 15:19:24 +02:00
foreach ( $this -> roles as $role ) {
$roles_clauses [] = $wpdb -> prepare ( 'umm_roles.um_value LIKE %s' , '%"' . $role . '"%' );
2019-12-20 15:06:58 +02:00
}
2020-01-08 15:19:24 +02:00
$this -> where_clauses [] = '( ' . implode ( ' OR ' , $roles_clauses ) . ' )' ;
2019-12-20 15:06:58 +02:00
} else {
if ( is_multisite () ) {
// select users who have capabilities for current blog
$this -> joins [] = " LEFT JOIN { $wpdb -> prefix } um_metadata umm_roles ON ( umm_roles.user_id = u.ID AND umm_roles.um_key = ' " . $wpdb -> get_blog_prefix ( $blog_id ) . " capabilities' ) " ;
2020-01-08 15:19:24 +02:00
$this -> where_clauses [] = " umm_roles.um_value IS NOT NULL " ;
2019-12-20 15:06:58 +02:00
}
}
if ( ! empty ( $_POST [ 'search' ] ) ) {
2020-01-08 15:19:24 +02:00
$search_line = trim ( stripslashes ( $_POST [ 'search' ] ) );
2019-12-20 15:06:58 +02:00
$searches = array ();
foreach ( $this -> core_search_fields as $field ) {
2020-01-08 15:19:24 +02:00
$searches [] = $wpdb -> prepare ( " u. { $field } LIKE %s " , '%' . $search_line . '%' );
2019-12-20 15:06:58 +02:00
}
$core_search = implode ( ' OR ' , $searches );
$this -> joins [] = " LEFT JOIN { $wpdb -> prefix } um_metadata umm_search ON umm_search.user_id = u.ID " ;
2020-01-08 15:19:24 +02:00
2020-01-10 12:53:30 +02:00
$additional_search = apply_filters ( 'um_member_directory_meta_general_search_meta_query' , '' , stripslashes ( $_POST [ 'search' ] ) );
2020-01-29 15:53:39 +02:00
$search_like_string = apply_filters ( 'um_member_directory_meta_search_like_type' , '%' . $search_line . '%' , $search_line );
$this -> where_clauses [] = $wpdb -> prepare ( " ( umm_search.um_value = %s OR umm_search.um_value LIKE %s OR umm_search.um_value LIKE %s OR { $core_search } { $additional_search } ) " , $search_line , $search_like_string , '%' . serialize ( strval ( $search_line ) ) . '%' );
2019-12-20 15:06:58 +02:00
$this -> is_search = true ;
}
//filters
$filter_query = array ();
if ( ! empty ( $directory_data [ 'search_fields' ] ) ) {
$search_filters = maybe_unserialize ( $directory_data [ 'search_fields' ] );
if ( ! empty ( $search_filters ) && is_array ( $search_filters ) ) {
$filter_query = array_intersect_key ( $_POST , array_flip ( $search_filters ) );
}
}
// added for user tags extension integration on individual tag page
$ignore_empty_filters = apply_filters ( 'um_member_directory_ignore_empty_filters' , false );
if ( ! empty ( $filter_query ) || $ignore_empty_filters ) {
$this -> is_search = true ;
$i = 1 ;
foreach ( $filter_query as $field => $value ) {
$attrs = UM () -> fields () -> get_field ( $field );
// skip private invisible fields
if ( ! um_can_view_field ( $attrs ) ) {
continue ;
}
2020-01-08 15:19:24 +02:00
$this -> handle_filter_query ( $directory_data , $field , $value , $i );
2019-12-20 15:06:58 +02:00
$i ++ ;
}
}
//unable default filter in case if we select other filters in frontend filters
2020-01-10 17:31:55 +02:00
//if ( empty( $this->custom_filters_in_query ) ) {
$default_filters = array ();
if ( ! empty ( $directory_data [ 'search_filters' ] ) ) {
$default_filters = maybe_unserialize ( $directory_data [ 'search_filters' ] );
}
2019-12-20 15:06:58 +02:00
2020-01-10 17:31:55 +02:00
if ( ! empty ( $default_filters ) ) {
$i = 1 ;
foreach ( $default_filters as $field => $value ) {
2019-12-20 15:06:58 +02:00
2020-01-10 17:31:55 +02:00
$this -> handle_filter_query ( $directory_data , $field , $value , $i , true );
2019-12-20 15:06:58 +02:00
2020-01-10 17:31:55 +02:00
$i ++ ;
2019-12-20 15:06:58 +02:00
}
}
2020-01-10 17:31:55 +02:00
//}
2019-12-20 15:06:58 +02:00
$order = 'ASC' ;
$sortby = ! empty ( $_POST [ 'sorting' ] ) ? $_POST [ 'sorting' ] : $directory_data [ 'sortby' ];
2020-01-29 13:22:03 +02:00
$sortby = ( $sortby == 'other' ) ? $directory_data [ 'sortby_custom' ] : $sortby ;
2019-12-20 15:06:58 +02:00
2020-01-13 10:18:30 +02:00
$custom_sort = array ();
2020-01-29 13:22:03 +02:00
if ( ! empty ( $directory_data [ 'sorting_fields' ] ) ) {
$sorting_fields = maybe_unserialize ( $directory_data [ 'sorting_fields' ] );
foreach ( $sorting_fields as $field ) {
if ( is_array ( $field ) ) {
$field_keys = array_keys ( $field );
$custom_sort [] = $field_keys [ 0 ];
}
2020-01-13 10:18:30 +02:00
}
}
2019-12-20 15:06:58 +02:00
// handle sorting options
// sort members by
2020-01-13 10:18:30 +02:00
if ( $sortby == $directory_data [ 'sortby_custom' ] || in_array ( $sortby , $custom_sort ) ) {
2019-12-20 15:06:58 +02:00
2020-01-13 10:18:30 +02:00
$this -> joins [] = " LEFT JOIN { $wpdb -> prefix } um_metadata umm_sort ON ( umm_sort.user_id = u.ID AND umm_sort.um_key = ' { $sortby } ' ) " ;
2019-12-20 15:06:58 +02:00
2020-01-20 10:39:40 +02:00
$custom_sort_type = apply_filters ( 'um_member_directory_custom_sorting_type' , 'CHAR' , $sortby , $directory_data );
$this -> sql_order = " ORDER BY CAST( umm_sort.um_value AS { $custom_sort_type } ) { $order } " ;
2019-12-20 15:06:58 +02:00
} elseif ( 'display_name' == $sortby ) {
$display_name = UM () -> options () -> get ( 'display_name' );
if ( $display_name == 'username' ) {
$this -> sql_order = " ORDER BY u.user_login { $order } " ;
} else {
$this -> joins [] = " LEFT JOIN { $wpdb -> prefix } um_metadata umm_sort ON ( umm_sort.user_id = u.ID AND umm_sort.um_key = 'full_name' ) " ;
$this -> sql_order = " ORDER BY CAST( umm_sort.um_value AS CHAR ) { $order } , u.display_name { $order } " ;
}
} elseif ( in_array ( $sortby , array ( 'last_name' , 'first_name' , 'nickname' ) ) ) {
$this -> joins [] = " LEFT JOIN { $wpdb -> prefix } um_metadata umm_sort ON ( umm_sort.user_id = u.ID AND umm_sort.um_key = ' { $sortby } ' ) " ;
$this -> sql_order = " ORDER BY CAST( umm_sort.um_value AS CHAR ) { $order } " ;
} elseif ( $sortby == 'last_login' ) {
$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' ) " ;
2020-02-13 16:46:18 +02:00
$this -> sql_order = " ORDER BY CAST( umm_sort.um_value AS SIGNED ) DESC " ;
2019-12-20 15:06:58 +02:00
} elseif ( $sortby == 'last_first_name' ) {
$this -> joins [] = " LEFT JOIN { $wpdb -> prefix } um_metadata umm_sort ON ( umm_sort.user_id = u.ID AND umm_sort.um_key = 'last_name' ) " ;
$this -> joins [] = " LEFT JOIN { $wpdb -> prefix } um_metadata umm_sort2 ON ( umm_sort2.user_id = u.ID AND umm_sort2.um_key = 'first_name' ) " ;
$this -> sql_order = " ORDER BY CAST( umm_sort.um_value AS CHAR ) ASC, CAST( umm_sort2.um_value AS CHAR ) ASC " ;
} elseif ( $sortby == 'random' ) {
if ( um_is_session_started () === false ) {
@ session_start ();
}
// Reset seed on load of initial
if ( empty ( $_REQUEST [ 'directory_id' ] ) && isset ( $_SESSION [ 'um_member_directory_seed' ] ) ) {
unset ( $_SESSION [ 'um_member_directory_seed' ] );
}
// Get seed from session variable if it exists
$seed = false ;
if ( isset ( $_SESSION [ 'um_member_directory_seed' ] ) ) {
$seed = $_SESSION [ 'um_member_directory_seed' ];
}
// Set new seed if none exists
if ( ! $seed ) {
$seed = rand ();
$_SESSION [ 'um_member_directory_seed' ] = $seed ;
}
2020-01-14 22:22:11 +02:00
$this -> sql_order = 'ORDER BY RAND(' . $seed . ')' ;
2019-12-20 15:06:58 +02:00
} else {
if ( strstr ( $sortby , '_desc' ) ) {
$sortby = str_replace ( '_desc' , '' , $sortby );
$order = 'DESC' ;
}
if ( strstr ( $sortby , '_asc' ) ) {
$sortby = str_replace ( '_asc' , '' , $sortby );
$order = 'ASC' ;
}
$metakeys = get_option ( 'um_usermeta_fields' , array () );
if ( false !== array_search ( $sortby , $metakeys ) ) {
$this -> joins [] = " LEFT JOIN { $wpdb -> prefix } um_metadata umm_sort ON ( umm_sort.user_id = u.ID AND umm_sort.um_key = ' { $sortby } ' ) " ;
$this -> sql_order = " ORDER BY CAST( umm_sort.um_value AS CHAR ) { $order } " ;
} else {
$this -> sql_order = " ORDER BY u. { $sortby } { $order } " ;
}
}
2020-01-08 15:19:24 +02:00
$this -> sql_order = apply_filters ( 'um_modify_sortby_parameter_meta' , $this -> sql_order , $sortby );
2019-12-20 15:06:58 +02:00
$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' ];
}
$query_number = ( ! empty ( $directory_data [ 'max_users' ] ) && $directory_data [ 'max_users' ] <= $profiles_per_page ) ? $directory_data [ 'max_users' ] : $profiles_per_page ;
$query_paged = ! empty ( $_POST [ 'page' ] ) ? $_POST [ 'page' ] : 1 ;
$number = $query_number ;
if ( ! empty ( $directory_data [ 'max_users' ] ) && $query_paged * $query_number > $directory_data [ 'max_users' ] ) {
$number = ( $query_paged * $query_number - ( $query_paged * $query_number - $directory_data [ 'max_users' ] ) ) % $query_number ;
}
// limit
if ( isset ( $query_number ) && $query_number > 0 ) {
$this -> sql_limit .= $wpdb -> prepare ( 'LIMIT %d, %d' , $query_number * ( $query_paged - 1 ), $number );
}
do_action ( 'um_pre_users_query' , $this , $directory_data , $sortby );
2020-01-08 15:19:24 +02:00
$sql_join = implode ( ' ' , $this -> joins );
$sql_where = implode ( ' AND ' , $this -> where_clauses );
2020-01-10 12:53:30 +02:00
$sql_where = ! empty ( $sql_where ) ? 'AND ' . $sql_where : '' ;
2020-01-08 15:19:24 +02:00
2019-12-20 15:06:58 +02:00
global $wpdb ;
2020-01-08 15:19:24 +02:00
2019-12-20 15:06:58 +02:00
$user_ids = $wpdb -> get_col (
2020-01-29 13:22:03 +02:00
" SELECT SQL_CALC_FOUND_ROWS DISTINCT u.ID
{ $this -> select }
2019-12-20 15:06:58 +02:00
FROM { $wpdb -> users } AS u
{ $sql_join }
2020-01-08 15:19:24 +02:00
WHERE 1=1 { $sql_where }
2020-01-29 13:22:03 +02:00
{ $this -> having }
2019-12-20 15:06:58 +02:00
{ $this -> sql_order }
{ $this -> sql_limit } "
);
$total_users = ( int ) $wpdb -> get_var ( 'SELECT FOUND_ROWS()' );
$pagination_data = $this -> calculate_pagination ( $directory_data , $total_users );
$sizes = UM () -> options () -> get ( 'cover_thumb_sizes' );
$this -> cover_size = UM () -> mobile () -> isTablet () ? $sizes [ 1 ] : end ( $sizes );
$avatar_size = UM () -> options () -> get ( 'profile_photosize' );
$this -> avatar_size = str_replace ( 'px' , '' , $avatar_size );
$users = array ();
foreach ( $user_ids as $user_id ) {
$users [] = $this -> build_user_card_data ( $user_id , $directory_data );
}
um_reset_user ();
// end of user card
2020-01-24 14:59:47 +02:00
$member_directory_response = apply_filters ( 'um_ajax_get_members_response' , array (
'pagination' => $pagination_data ,
'users' => $users ,
'is_search' => $this -> is_search ,
), $directory_data );
wp_send_json_success ( $member_directory_response );
2019-12-20 15:06:58 +02:00
}
}
}