From 16e0981e33e0fa5ff6e03fb2f99783ef5112e729 Mon Sep 17 00:00:00 2001 From: nikitasinelnikov Date: Fri, 10 Jan 2020 17:31:55 +0200 Subject: [PATCH] - default admin filters using with frontend filters; --- assets/js/um-conditional.min.js | 2 +- includes/admin/assets/css/um-admin-forms.css | 13 +++- includes/admin/assets/js/um-admin-forms.js | 35 ++++++++--- includes/admin/core/class-admin-forms.php | 2 +- includes/admin/core/class-admin-metabox.php | 6 +- includes/core/class-member-directory-meta.php | 62 ++++++++++--------- includes/core/class-member-directory.php | 61 +++++++++++++----- 7 files changed, 122 insertions(+), 59 deletions(-) diff --git a/assets/js/um-conditional.min.js b/assets/js/um-conditional.min.js index 8074be31..d883e980 100644 --- a/assets/js/um-conditional.min.js +++ b/assets/js/um-conditional.min.js @@ -1 +1 @@ -var arr_all_conditions=[],um_field_conditions={},um_field_default_values={};function um_get_field_default_value(e){var i="",n=um_get_field_type(e);switch(n){case"text":case"number":case"date":case"textarea":case"select":i=e.find("input:text,input[type=number],textarea,select").val();break;case"multiselect":i=e.find("select").val();break;case"radio":1<=e.find("input[type=radio]:checked").length&&(i=e.find("input[type=radio]:checked").val());break;case"checkbox":if(1<=e.find("input[type=checkbox]:checked").length)if(1parseInt(i.value)?u[i.owner][e]=!0:u[i.owner][e]=!1),"less than"==i.operator&&(jQuery.isNumeric(i.value)&&parseInt(t)parseInt(i.value)?u[i.owner][e]=!0:u[i.owner][e]=!1),"less than"==i.operator&&(jQuery.isNumeric(i.value)&&parseInt(t) - " . __( 'Remove', 'ultimate-member' ) . "" . UM()->member_directory()->show_filter( $value, array( 'form_id' => $post->ID ), $values[ $value ] ) . ""; + " . __( 'Remove', 'ultimate-member' ) . "" . UM()->member_directory()->show_filter( $value, array( 'form_id' => $post->ID ), $values[ $value ], true ) . ""; } } elseif ( ! empty( $field_data['show_default_number'] ) && is_numeric( $field_data['show_default_number'] ) && $field_data['show_default_number'] > 0 ) { $i = 0; diff --git a/includes/admin/core/class-admin-metabox.php b/includes/admin/core/class-admin-metabox.php index 394f3cd8..eac5b9a6 100644 --- a/includes/admin/core/class-admin-metabox.php +++ b/includes/admin/core/class-admin-metabox.php @@ -19,6 +19,7 @@ if ( ! class_exists( 'um\admin\core\Admin_Metabox' ) ) { * @var bool */ private $form_nonce_added = false; + private $directory_nonce_added = false; /** @@ -687,7 +688,10 @@ if ( ! class_exists( 'um\admin\core\Admin_Metabox' ) ) { include_once $path . 'includes/admin/templates/directory/'. $box['id'] . '.php'; - wp_nonce_field( basename( __FILE__ ), 'um_admin_save_metabox_directory_nonce' ); + if ( ! $this->directory_nonce_added ) { + $this->directory_nonce_added = true; + wp_nonce_field( basename( __FILE__ ), 'um_admin_save_metabox_directory_nonce' ); + } } diff --git a/includes/core/class-member-directory-meta.php b/includes/core/class-member-directory-meta.php index 600f2a53..bf3a4b4d 100644 --- a/includes/core/class-member-directory-meta.php +++ b/includes/core/class-member-directory-meta.php @@ -185,6 +185,8 @@ if ( ! class_exists( 'um\core\Member_Directory_Meta' ) ) { function handle_filter_query( $directory_data, $field, $value, $i, $is_default = false ) { global $wpdb; + $join_slug = $is_default ? 'ummd' : 'umm' ; + $blog_id = get_current_blog_id(); switch ( $field ) { @@ -225,11 +227,11 @@ if ( ! class_exists( 'um\core\Member_Directory_Meta' ) ) { case 'text': - $this->joins[] = "LEFT JOIN {$wpdb->prefix}um_metadata umm{$i} ON umm{$i}.user_id = u.ID"; + $this->joins[] = "LEFT JOIN {$wpdb->prefix}um_metadata {$join_slug}{$i} ON {$join_slug}{$i}.user_id = u.ID"; $value = trim( stripslashes( $value ) ); - $this->where_clauses[] = $wpdb->prepare( "umm{$i}.um_key = %s AND umm{$i}.um_value = %s", $field, $value ); + $this->where_clauses[] = $wpdb->prepare( "{$join_slug}{$i}.um_key = %s AND {$join_slug}{$i}.um_value = %s", $field, $value ); if ( ! $is_default ) { $this->custom_filters_in_query[ $field ] = $value; @@ -242,24 +244,24 @@ if ( ! class_exists( 'um\core\Member_Directory_Meta' ) ) { $value = array( $value ); } - $this->joins[] = "LEFT JOIN {$wpdb->prefix}um_metadata umm{$i} ON umm{$i}.user_id = u.ID"; + $this->joins[] = "LEFT JOIN {$wpdb->prefix}um_metadata {$join_slug}{$i} ON {$join_slug}{$i}.user_id = u.ID"; $values_array = array(); foreach ( $value as $single_val ) { $single_val = stripslashes( $single_val ); - $values_array[] = $wpdb->prepare( "umm{$i}.um_value LIKE %s", '%"' . trim( $single_val ) . '"%' ); - $values_array[] = $wpdb->prepare( "umm{$i}.um_value LIKE %s", '%' . serialize( strval( trim( $single_val ) ) ) . '%' ); - $values_array[] = $wpdb->prepare( "umm{$i}.um_value = %s", trim( $single_val ) ); + $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 ) ); if ( is_numeric( $single_val ) ) { - $values_array[] = $wpdb->prepare( "umm{$i}.um_value LIKE %s", '%' . serialize( intval( trim( $single_val ) ) ) . '%' ); + $values_array[] = $wpdb->prepare( "{$join_slug}{$i}.um_value LIKE %s", '%' . serialize( intval( trim( $single_val ) ) ) . '%' ); } } $values = implode( ' OR ', $values_array ); - $this->where_clauses[] = $wpdb->prepare( "( umm{$i}.um_key = %s AND ( {$values} ) )", $field ); + $this->where_clauses[] = $wpdb->prepare( "( {$join_slug}{$i}.um_key = %s AND ( {$values} ) )", $field ); if ( ! $is_default ) { $this->custom_filters_in_query[ $field ] = $value; @@ -268,12 +270,12 @@ if ( ! class_exists( 'um\core\Member_Directory_Meta' ) ) { break; case 'slider': - $this->joins[] = "LEFT JOIN {$wpdb->prefix}um_metadata umm{$i} ON umm{$i}.user_id = u.ID"; + $this->joins[] = "LEFT JOIN {$wpdb->prefix}um_metadata {$join_slug}{$i} ON {$join_slug}{$i}.user_id = u.ID"; $min = min( $value ); $max = max( $value ); - $this->where_clauses[] = $wpdb->prepare( "( umm{$i}.um_key = %s AND umm{$i}.um_value BETWEEN %d AND %d )", $field, $min, $max ); + $this->where_clauses[] = $wpdb->prepare( "( {$join_slug}{$i}.um_key = %s AND {$join_slug}{$i}.um_value BETWEEN %d AND %d )", $field, $min, $max ); if ( ! $is_default ) { $this->custom_filters_in_query[ $field ] = $value; @@ -299,9 +301,9 @@ if ( ! class_exists( 'um\core\Member_Directory_Meta' ) ) { $from_date = date( 'Y/m/d', $from_date ); $to_date = date( 'Y/m/d', $to_date ); - $this->joins[] = "LEFT JOIN {$wpdb->prefix}um_metadata umm{$i} ON umm{$i}.user_id = u.ID"; + $this->joins[] = "LEFT JOIN {$wpdb->prefix}um_metadata {$join_slug}{$i} ON {$join_slug}{$i}.user_id = u.ID"; - $this->where_clauses[] = $wpdb->prepare( "( umm{$i}.um_key = %s AND umm{$i}.um_value BETWEEN %s AND %s )", $field, $from_date, $to_date ); + $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 ); if ( ! $is_default ) { $this->custom_filters_in_query[ $field ] = array( $from_date, $to_date ); @@ -310,11 +312,11 @@ if ( ! class_exists( 'um\core\Member_Directory_Meta' ) ) { break; case 'timepicker': - $this->joins[] = "LEFT JOIN {$wpdb->prefix}um_metadata umm{$i} ON umm{$i}.user_id = u.ID"; + $this->joins[] = "LEFT JOIN {$wpdb->prefix}um_metadata {$join_slug}{$i} ON {$join_slug}{$i}.user_id = u.ID"; if ( $value[0] == $value[1] ) { - $this->where_clauses[] = $wpdb->prepare( "( umm{$i}.um_key = %s AND umm{$i}.um_value = %s )", $field, $value[0] ); + $this->where_clauses[] = $wpdb->prepare( "( {$join_slug}{$i}.um_key = %s AND {$join_slug}{$i}.um_value = %s )", $field, $value[0] ); } else { - $this->where_clauses[] = $wpdb->prepare( "( umm{$i}.um_key = %s AND CAST( umm{$i}.um_value AS TIME ) BETWEEN %s AND %s )", $field, $value[0], $value[1] ); + $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] ); } if ( ! $is_default ) { @@ -352,9 +354,9 @@ if ( ! class_exists( 'um\core\Member_Directory_Meta' ) ) { $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 ) ) ); - $this->joins[] = "LEFT JOIN {$wpdb->prefix}um_metadata umm{$i} ON umm{$i}.user_id = u.ID"; + $this->joins[] = "LEFT JOIN {$wpdb->prefix}um_metadata {$join_slug}{$i} ON {$join_slug}{$i}.user_id = u.ID"; - $this->where_clauses[] = $wpdb->prepare( "( umm{$i}.um_key = 'birth_date' AND umm{$i}.um_value BETWEEN %s AND %s )", $from_date, $to_date ); + $this->where_clauses[] = $wpdb->prepare( "( {$join_slug}{$i}.um_key = 'birth_date' AND {$join_slug}{$i}.um_value BETWEEN %s AND %s )", $from_date, $to_date ); if ( ! $is_default ) { $this->custom_filters_in_query[ $field ] = array( $to_date, $from_date ); @@ -402,9 +404,9 @@ 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 - $this->joins[] = "LEFT JOIN {$wpdb->prefix}um_metadata umm{$i} ON umm{$i}.user_id = u.ID"; + $this->joins[] = "LEFT JOIN {$wpdb->prefix}um_metadata {$join_slug}{$i} ON {$join_slug}{$i}.user_id = u.ID"; - $this->where_clauses[] = $wpdb->prepare( "( umm{$i}.um_key = '_um_last_login' AND umm{$i}.um_value BETWEEN %s AND %s )", $from_date, $to_date ); + $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 ); if ( ! $is_default ) { $this->custom_filters_in_query[ $field ] = $value; @@ -571,22 +573,22 @@ 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(); - if ( ! empty( $directory_data['search_filters'] ) ) { - $default_filters = maybe_unserialize( $directory_data['search_filters'] ); - } + //if ( empty( $this->custom_filters_in_query ) ) { + $default_filters = array(); + if ( ! empty( $directory_data['search_filters'] ) ) { + $default_filters = maybe_unserialize( $directory_data['search_filters'] ); + } - if ( ! empty( $default_filters ) ) { - $i = 1; - foreach ( $default_filters as $field => $value ) { + if ( ! empty( $default_filters ) ) { + $i = 1; + foreach ( $default_filters as $field => $value ) { - $this->handle_filter_query( $directory_data, $field, $value, $i, true ); + $this->handle_filter_query( $directory_data, $field, $value, $i, true ); - $i++; - } + $i++; } } + //} $order = 'ASC'; diff --git a/includes/core/class-member-directory.php b/includes/core/class-member-directory.php index 95d43474..2ea69740 100644 --- a/includes/core/class-member-directory.php +++ b/includes/core/class-member-directory.php @@ -208,6 +208,14 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) { if ( ! empty( $_POST[ $k . '_from' ] ) && ! empty( $_POST[ $k . '_to' ] ) ) { $temp_value[ $k ] = array( $_POST[ $k . '_from' ], $_POST[ $k . '_to' ] ); } + } elseif ( $filter_type == 'select' ) { + if ( ! empty( $_POST[ $k ] ) ) { + if ( is_array( $_POST[ $k ] ) ) { + $temp_value[ $k ] = array_map( 'trim', $_POST[ $k ] ); + } else { + $temp_value[ $k ] = array( trim( $_POST[ $k ] ) ); + } + } } else { if ( ! empty( $_POST[ $k ] ) ) { $temp_value[ $k ] = trim( $_POST[ $k ] ); @@ -373,15 +381,27 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) { * @param string $filter * @param array $directory_data * @param mixed $default_value + * @param bool $admin * * @return string $filter */ - function show_filter( $filter, $directory_data, $default_value = false ) { + function show_filter( $filter, $directory_data, $default_value = false, $admin = false ) { if ( empty( $this->filter_types[ $filter ] ) ) { return ''; } + if ( $default_value === false ) { + $default_filters = array(); + if ( ! empty( $directory_data['search_filters'] ) ) { + $default_filters = maybe_unserialize( $directory_data['search_filters'] ); + } + + if ( ! empty( $default_filters[ $filter ] ) && $this->filter_types[ $filter ] != 'select' ) { + return ''; + } + } + $field_key = $filter; if ( $filter == 'last_login' ) { $field_key = '_um_last_login'; @@ -459,13 +479,11 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) { break; } case 'text': { - $filter_from_url = ! empty( $_GET[ 'filter_' . $filter . '_' . $unique_hash ] ) ? $_GET[ 'filter_' . $filter . '_' . $unique_hash ] : $default_value; - - if( ! $directory_data['search_filters'][ $filter ] ) { ?> - - + + -