From 4041bbc6214ce4ce1c8400f3d929a2b0c99a67e5 Mon Sep 17 00:00:00 2001 From: ashubawork Date: Mon, 29 Jan 2024 11:12:22 +0200 Subject: [PATCH 1/7] - exclude fields for default usermeta table --- includes/admin/core/class-admin-metabox.php | 1 + includes/admin/templates/directory/search.php | 16 +++++++++-- includes/core/class-member-directory.php | 28 +++++++++++++++++++ 3 files changed, 43 insertions(+), 2 deletions(-) diff --git a/includes/admin/core/class-admin-metabox.php b/includes/admin/core/class-admin-metabox.php index f48dcad8..e8d54a7c 100644 --- a/includes/admin/core/class-admin-metabox.php +++ b/includes/admin/core/class-admin-metabox.php @@ -1187,6 +1187,7 @@ if ( ! class_exists( 'um\admin\core\Admin_Metabox' ) ) { delete_post_meta( $post_id, '_um_tagline_fields' ); delete_post_meta( $post_id, '_um_reveal_fields' ); delete_post_meta( $post_id, '_um_search_fields' ); + delete_post_meta( $post_id, '_um_search_exclude_fields' ); delete_post_meta( $post_id, '_um_roles_can_search' ); delete_post_meta( $post_id, '_um_roles_can_filter' ); delete_post_meta( $post_id, '_um_show_these_users' ); diff --git a/includes/admin/templates/directory/search.php b/includes/admin/templates/directory/search.php index 9cb32539..95b4a2b0 100644 --- a/includes/admin/templates/directory/search.php +++ b/includes/admin/templates/directory/search.php @@ -10,8 +10,9 @@ $_um_roles_search_value = empty( $_um_roles_search_value ) ? array() : $_um_role $_um_roles_filter_value = get_post_meta( $post_id, '_um_roles_can_filter', true ); $_um_roles_filter_value = empty( $_um_roles_filter_value ) ? array() : $_um_roles_filter_value; -$_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_search_exclude_fields = get_post_meta( $post_id, '_um_search_exclude_fields', true ); +$_um_search_fields = get_post_meta( $post_id, '_um_search_fields', true ); +$_um_search_filters = get_post_meta( $post_id, '_um_search_filters', true ); ?>
@@ -38,6 +39,17 @@ $_um_search_filters = get_post_meta( $post_id, '_um_search_filters', true ); ?> 'columns' => 3, 'conditional' => array( '_um_search', '=', 1 ), ), + array( + 'id' => '_um_search_exclude_fields', + 'type' => 'multi_selects', + 'label' => __( 'Choose fields to exclude from search', 'ultimate-member' ), + 'value' => $_um_search_exclude_fields, + 'conditional' => array( '_um_filters', '=', 1 ), + 'options' => UM()->member_directory()->filter_fields, + 'add_text' => __( 'Add New Custom Field to Exclude', 'ultimate-member' ), + 'show_default_number' => 0, + 'sorting' => true, + ), array( 'id' => '_um_filters', 'type' => 'checkbox', diff --git a/includes/core/class-member-directory.php b/includes/core/class-member-directory.php index 81e79a6d..dc11e710 100644 --- a/includes/core/class-member-directory.php +++ b/includes/core/class-member-directory.php @@ -1642,10 +1642,34 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) { */ public function general_search() { //general search + // phpcs:disable WordPress.Security.NonceVerification if ( ! empty( $_POST['search'] ) ) { // complex using with change_meta_sql function $search = $this->prepare_search( $_POST['search'] ); if ( ! empty( $search ) ) { + $directory_id = $this->get_directory_by_hash( sanitize_key( $_POST['directory_id'] ) ); + $exclude_fields = get_post_meta( $directory_id, '_um_search_exclude_fields', true ); + if ( ! empty( $exclude_fields ) ) { + global $wpdb; + $exclude_users = array(); + $search_meta = '%' . $wpdb->esc_like( $search ) . '%'; + foreach ( $exclude_fields as $field ) { + $field_users = $wpdb->get_col( + $wpdb->prepare( + "SELECT user_id + FROM {$wpdb->usermeta} + WHERE meta_key = %s + AND meta_value LIKE %s", + $field, + $search_meta + ) + ); + + $exclude_users = array_merge( $exclude_users, $field_users ); + } + $exclude_users = array_unique( $exclude_users ); + } + $meta_query = array( 'relation' => 'OR', array( @@ -1665,10 +1689,14 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) { $meta_query = apply_filters( 'um_member_directory_general_search_meta_query', $meta_query, $search ); $this->query_args['meta_query'][] = $meta_query; + if ( ! empty( $exclude_users ) ) { + $this->query_args['exclude'] = $exclude_users; + } $this->is_search = true; } } + // phpcs:enable WordPress.Security.NonceVerification } /** From a6dae55d3d7248779a2fd42b9201b42f86c14710 Mon Sep 17 00:00:00 2001 From: ashubawork Date: Mon, 29 Jan 2024 11:36:07 +0200 Subject: [PATCH 2/7] - fix excluded users --- includes/core/class-member-directory.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/includes/core/class-member-directory.php b/includes/core/class-member-directory.php index dc11e710..00e7792f 100644 --- a/includes/core/class-member-directory.php +++ b/includes/core/class-member-directory.php @@ -1690,6 +1690,9 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) { $this->query_args['meta_query'][] = $meta_query; if ( ! empty( $exclude_users ) ) { + if ( ! empty( $this->query_args['exclude'] ) ) { + $exclude_users = array_unique( array_merge( $exclude_users, $this->query_args['exclude'] ) ); + } $this->query_args['exclude'] = $exclude_users; } From 278b0def5cee6eb5c51db3a7a7a63499dd422111 Mon Sep 17 00:00:00 2001 From: ashubawork Date: Mon, 29 Jan 2024 15:56:18 +0200 Subject: [PATCH 3/7] - fix excluded fields --- includes/core/class-member-directory.php | 39 +++++------------------- 1 file changed, 8 insertions(+), 31 deletions(-) diff --git a/includes/core/class-member-directory.php b/includes/core/class-member-directory.php index 00e7792f..b34a2626 100644 --- a/includes/core/class-member-directory.php +++ b/includes/core/class-member-directory.php @@ -1642,34 +1642,10 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) { */ public function general_search() { //general search - // phpcs:disable WordPress.Security.NonceVerification if ( ! empty( $_POST['search'] ) ) { // complex using with change_meta_sql function $search = $this->prepare_search( $_POST['search'] ); if ( ! empty( $search ) ) { - $directory_id = $this->get_directory_by_hash( sanitize_key( $_POST['directory_id'] ) ); - $exclude_fields = get_post_meta( $directory_id, '_um_search_exclude_fields', true ); - if ( ! empty( $exclude_fields ) ) { - global $wpdb; - $exclude_users = array(); - $search_meta = '%' . $wpdb->esc_like( $search ) . '%'; - foreach ( $exclude_fields as $field ) { - $field_users = $wpdb->get_col( - $wpdb->prepare( - "SELECT user_id - FROM {$wpdb->usermeta} - WHERE meta_key = %s - AND meta_value LIKE %s", - $field, - $search_meta - ) - ); - - $exclude_users = array_merge( $exclude_users, $field_users ); - } - $exclude_users = array_unique( $exclude_users ); - } - $meta_query = array( 'relation' => 'OR', array( @@ -1689,17 +1665,10 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) { $meta_query = apply_filters( 'um_member_directory_general_search_meta_query', $meta_query, $search ); $this->query_args['meta_query'][] = $meta_query; - if ( ! empty( $exclude_users ) ) { - if ( ! empty( $this->query_args['exclude'] ) ) { - $exclude_users = array_unique( array_merge( $exclude_users, $this->query_args['exclude'] ) ); - } - $this->query_args['exclude'] = $exclude_users; - } $this->is_search = true; } } - // phpcs:enable WordPress.Security.NonceVerification } /** @@ -1787,6 +1756,14 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) { } } + $directory_id = $this->get_directory_by_hash( sanitize_key( $_POST['directory_id'] ) ); + $exclude_fields = get_post_meta( $directory_id, '_um_search_exclude_fields', true ); + if ( ! empty( $exclude_fields ) ) { + foreach ( $exclude_fields as $field ) { + $sql['join'] = str_replace( ",'" . $field . "'", '', $sql['join'] ); + } + } + return $sql; } From 37739fdd4774c2264e430e39fe0040bacfcd1804 Mon Sep 17 00:00:00 2001 From: ashubawork Date: Tue, 30 Jan 2024 12:56:31 +0200 Subject: [PATCH 4/7] - exclude fields for um meta table --- includes/core/class-member-directory-meta.php | 12 +++++++++++- includes/core/class-member-directory.php | 16 ++++++++-------- 2 files changed, 19 insertions(+), 9 deletions(-) diff --git a/includes/core/class-member-directory-meta.php b/includes/core/class-member-directory-meta.php index bb094cde..a97020df 100644 --- a/includes/core/class-member-directory-meta.php +++ b/includes/core/class-member-directory-meta.php @@ -601,7 +601,17 @@ if ( ! class_exists( 'um\core\Member_Directory_Meta' ) ) { $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( (string) $search_line ) . '%' ); + $directory_id = $this->get_directory_by_hash( sanitize_key( $_POST['directory_id'] ) ); + $exclude_fields = get_post_meta( $directory_id, '_um_search_exclude_fields', true ); + if ( ! empty( $exclude_fields ) ) { + $exclude_fields_sql = 'AND umm_search.um_key NOT IN ('; + foreach ( $exclude_fields as $exclude_field ) { + $exclude_fields_sql .= "'" . $exclude_field . "',"; + } + $exclude_fields_sql = rtrim( $exclude_fields_sql, ',' ); + $exclude_fields_sql .= ') '; + } + $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}) {$exclude_fields_sql}", $search_line, $search_like_string, '%' . serialize( (string) $search_line ) . '%' ); $this->is_search = true; } diff --git a/includes/core/class-member-directory.php b/includes/core/class-member-directory.php index b34a2626..5e96d1cc 100644 --- a/includes/core/class-member-directory.php +++ b/includes/core/class-member-directory.php @@ -1739,6 +1739,14 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) { $sql['join'] ); } + + $directory_id = $this->get_directory_by_hash( sanitize_key( $_POST['directory_id'] ) ); + $exclude_fields = get_post_meta( $directory_id, '_um_search_exclude_fields', true ); + if ( ! empty( $exclude_fields ) ) { + foreach ( $exclude_fields as $field ) { + $sql['join'] = str_replace( ",'" . $field . "'", '', $sql['join'] ); + } + } } // Add OR instead AND to search in WP core fields user_email, user_login, user_display_name @@ -1756,14 +1764,6 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) { } } - $directory_id = $this->get_directory_by_hash( sanitize_key( $_POST['directory_id'] ) ); - $exclude_fields = get_post_meta( $directory_id, '_um_search_exclude_fields', true ); - if ( ! empty( $exclude_fields ) ) { - foreach ( $exclude_fields as $field ) { - $sql['join'] = str_replace( ",'" . $field . "'", '', $sql['join'] ); - } - } - return $sql; } From e1eaebce06fd1a91c566098ba987f8b7fffe88b3 Mon Sep 17 00:00:00 2001 From: ashubawork Date: Wed, 7 Feb 2024 11:50:41 +0200 Subject: [PATCH 5/7] - include for core usermeta --- assets/js/admin/forms.js | 8 ++++++ includes/admin/core/class-admin-metabox.php | 1 + includes/admin/templates/directory/search.php | 12 ++++++++ includes/core/class-member-directory.php | 28 +++++++++++-------- 4 files changed, 38 insertions(+), 11 deletions(-) diff --git a/assets/js/admin/forms.js b/assets/js/admin/forms.js index f1eecce0..4d3317e6 100644 --- a/assets/js/admin/forms.js +++ b/assets/js/admin/forms.js @@ -433,6 +433,14 @@ jQuery(document).ready( function() { addClass('um-forms-field um-long-field').removeClass('um-hidden-multi-selects').attr('id', list.data('id_attr') + '-' + k); }); + jQuery('.um-multi-selects-add-option[data-name="um_metadata[_um_search_exclude_fields][]"]').on('click', function() { + jQuery('.um-multi-selects-list[data-field_id="_um_search_include_fields"] li.um-multi-selects-option-line').remove(); + }); + + jQuery('.um-multi-selects-add-option[data-name="um_metadata[_um_search_include_fields][]"]').on('click', function() { + jQuery('.um-multi-selects-list[data-field_id="_um_search_exclude_fields"] li.um-multi-selects-option-line').remove(); + }); + 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 ); diff --git a/includes/admin/core/class-admin-metabox.php b/includes/admin/core/class-admin-metabox.php index e8d54a7c..c9e79f8b 100644 --- a/includes/admin/core/class-admin-metabox.php +++ b/includes/admin/core/class-admin-metabox.php @@ -1188,6 +1188,7 @@ if ( ! class_exists( 'um\admin\core\Admin_Metabox' ) ) { delete_post_meta( $post_id, '_um_reveal_fields' ); delete_post_meta( $post_id, '_um_search_fields' ); delete_post_meta( $post_id, '_um_search_exclude_fields' ); + delete_post_meta( $post_id, '_um_search_include_fields' ); delete_post_meta( $post_id, '_um_roles_can_search' ); delete_post_meta( $post_id, '_um_roles_can_filter' ); delete_post_meta( $post_id, '_um_show_these_users' ); diff --git a/includes/admin/templates/directory/search.php b/includes/admin/templates/directory/search.php index 95b4a2b0..7d78ef5c 100644 --- a/includes/admin/templates/directory/search.php +++ b/includes/admin/templates/directory/search.php @@ -11,6 +11,7 @@ $_um_roles_filter_value = get_post_meta( $post_id, '_um_roles_can_filter', true $_um_roles_filter_value = empty( $_um_roles_filter_value ) ? array() : $_um_roles_filter_value; $_um_search_exclude_fields = get_post_meta( $post_id, '_um_search_exclude_fields', true ); +$_um_search_include_fields = get_post_meta( $post_id, '_um_search_include_fields', true ); $_um_search_fields = get_post_meta( $post_id, '_um_search_fields', true ); $_um_search_filters = get_post_meta( $post_id, '_um_search_filters', true ); ?> @@ -50,6 +51,17 @@ $_um_search_filters = get_post_meta( $post_id, '_um_search_filters', true 'show_default_number' => 0, 'sorting' => true, ), + array( + 'id' => '_um_search_include_fields', + 'type' => 'multi_selects', + 'label' => __( 'Choose fields to include to search', 'ultimate-member' ), + 'value' => $_um_search_include_fields, + 'conditional' => array( '_um_filters', '=', 1 ), + 'options' => UM()->member_directory()->filter_fields, + 'add_text' => __( 'Add New Custom Field to Include', 'ultimate-member' ), + 'show_default_number' => 0, + 'sorting' => true, + ), array( 'id' => '_um_filters', 'type' => 'checkbox', diff --git a/includes/core/class-member-directory.php b/includes/core/class-member-directory.php index 5e96d1cc..ed0f1a0b 100644 --- a/includes/core/class-member-directory.php +++ b/includes/core/class-member-directory.php @@ -1712,22 +1712,30 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) { $sql['where'] = str_replace( '#%&', '{' . $matches[0][0] . '}', $sql['where'] ); + $directory_id = $this->get_directory_by_hash( sanitize_key( $_POST['directory_id'] ) ); + $exclude_fields = get_post_meta( $directory_id, '_um_search_exclude_fields', true ); + $include_fields = get_post_meta( $directory_id, '_um_search_include_fields', true ); + if ( isset( $join_matches[1] ) ) { $meta_join_for_search = trim( $join_matches[1] ); // skip private invisible fields $custom_fields = array(); - foreach ( array_keys( UM()->builtin()->all_user_fields ) as $field_key ) { - if ( empty( $field_key ) ) { - continue; - } + if ( empty( $include_fields ) ) { + foreach ( array_keys( UM()->builtin()->all_user_fields ) as $field_key ) { + if ( empty( $field_key ) ) { + continue; + } - $data = UM()->fields()->get_field( $field_key ); - if ( ! um_can_view_field( $data ) ) { - continue; - } + $data = UM()->fields()->get_field( $field_key ); + if ( ! um_can_view_field( $data ) ) { + continue; + } - $custom_fields[] = $field_key; + $custom_fields[] = $field_key; + } + } else { + $custom_fields = $include_fields; } $custom_fields = apply_filters( 'um_general_search_custom_fields', $custom_fields ); @@ -1740,8 +1748,6 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) { ); } - $directory_id = $this->get_directory_by_hash( sanitize_key( $_POST['directory_id'] ) ); - $exclude_fields = get_post_meta( $directory_id, '_um_search_exclude_fields', true ); if ( ! empty( $exclude_fields ) ) { foreach ( $exclude_fields as $field ) { $sql['join'] = str_replace( ",'" . $field . "'", '', $sql['join'] ); From ee1e1e1c1a4de96dad2a7228cf0ccb3e7cdd2180 Mon Sep 17 00:00:00 2001 From: ashubawork Date: Wed, 7 Feb 2024 12:07:48 +0200 Subject: [PATCH 6/7] - include for custom usermeta --- includes/core/class-member-directory-meta.php | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/includes/core/class-member-directory-meta.php b/includes/core/class-member-directory-meta.php index a97020df..4ae8c47e 100644 --- a/includes/core/class-member-directory-meta.php +++ b/includes/core/class-member-directory-meta.php @@ -603,15 +603,24 @@ if ( ! class_exists( 'um\core\Member_Directory_Meta' ) ) { $directory_id = $this->get_directory_by_hash( sanitize_key( $_POST['directory_id'] ) ); $exclude_fields = get_post_meta( $directory_id, '_um_search_exclude_fields', true ); + $include_fields = get_post_meta( $directory_id, '_um_search_include_fields', true ); if ( ! empty( $exclude_fields ) ) { - $exclude_fields_sql = 'AND umm_search.um_key NOT IN ('; + $custom_fields_sql = 'AND umm_search.um_key NOT IN ('; foreach ( $exclude_fields as $exclude_field ) { - $exclude_fields_sql .= "'" . $exclude_field . "',"; + $custom_fields_sql .= "'" . $exclude_field . "',"; } - $exclude_fields_sql = rtrim( $exclude_fields_sql, ',' ); - $exclude_fields_sql .= ') '; + $custom_fields_sql = rtrim( $custom_fields_sql, ',' ); + $custom_fields_sql .= ') '; } - $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}) {$exclude_fields_sql}", $search_line, $search_like_string, '%' . serialize( (string) $search_line ) . '%' ); + if ( ! empty( $include_fields ) ) { + $custom_fields_sql = 'AND umm_search.um_key IN ('; + foreach ( $include_fields as $include_field ) { + $custom_fields_sql .= "'" . $include_field . "',"; + } + $custom_fields_sql = rtrim( $custom_fields_sql, ',' ); + $custom_fields_sql .= ') '; + } + $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}) {$custom_fields_sql}", $search_line, $search_like_string, '%' . serialize( (string) $search_line ) . '%' ); $this->is_search = true; } From fca552229745e8961dc8f0a9e8ef851611057beb Mon Sep 17 00:00:00 2001 From: ashubawork Date: Wed, 7 Feb 2024 12:13:05 +0200 Subject: [PATCH 7/7] - fix options --- includes/admin/templates/directory/search.php | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/includes/admin/templates/directory/search.php b/includes/admin/templates/directory/search.php index 7d78ef5c..0e73947c 100644 --- a/includes/admin/templates/directory/search.php +++ b/includes/admin/templates/directory/search.php @@ -45,22 +45,24 @@ $_um_search_filters = get_post_meta( $post_id, '_um_search_filters', true 'type' => 'multi_selects', 'label' => __( 'Choose fields to exclude from search', 'ultimate-member' ), 'value' => $_um_search_exclude_fields, - 'conditional' => array( '_um_filters', '=', 1 ), + 'conditional' => array( '_um_search', '=', 1 ), 'options' => UM()->member_directory()->filter_fields, 'add_text' => __( 'Add New Custom Field to Exclude', 'ultimate-member' ), 'show_default_number' => 0, 'sorting' => true, + 'tooltip' => __( 'Choose fields to exclude them from search. This option will delete all included fields.', 'ultimate-member' ), ), array( 'id' => '_um_search_include_fields', 'type' => 'multi_selects', - 'label' => __( 'Choose fields to include to search', 'ultimate-member' ), + 'label' => __( 'Choose fields to only include in the search', 'ultimate-member' ), 'value' => $_um_search_include_fields, - 'conditional' => array( '_um_filters', '=', 1 ), + 'conditional' => array( '_um_search', '=', 1 ), 'options' => UM()->member_directory()->filter_fields, 'add_text' => __( 'Add New Custom Field to Include', 'ultimate-member' ), 'show_default_number' => 0, 'sorting' => true, + 'tooltip' => __( 'Choose fields to only include them in the search. This option will delete all excluded fields.', 'ultimate-member' ), ), array( 'id' => '_um_filters',