diff --git a/assets/js/admin/forms.js b/assets/js/admin/forms.js
index ea7522b8..913919a0 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 9327ff6d..c96c3719 100644
--- a/includes/admin/core/class-admin-metabox.php
+++ b/includes/admin/core/class-admin-metabox.php
@@ -1187,6 +1187,8 @@ 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_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 9cb32539..0e73947c 100644
--- a/includes/admin/templates/directory/search.php
+++ b/includes/admin/templates/directory/search.php
@@ -10,8 +10,10 @@ $_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_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 ); ?>
@@ -38,6 +40,30 @@ $_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_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 only include in the search', 'ultimate-member' ),
+ 'value' => $_um_search_include_fields,
+ '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',
'type' => 'checkbox',
diff --git a/includes/core/class-member-directory-meta.php b/includes/core/class-member-directory-meta.php
index 560b79fe..3b2f7b57 100644
--- a/includes/core/class-member-directory-meta.php
+++ b/includes/core/class-member-directory-meta.php
@@ -720,8 +720,27 @@ if ( ! class_exists( 'um\core\Member_Directory_Meta' ) ) {
$search_like_string = apply_filters( 'um_member_directory_meta_search_like_type', '%' . $wpdb->esc_like( $search_line ) . '%', $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 );
+ $include_fields = get_post_meta( $directory_id, '_um_search_include_fields', true );
+ if ( ! empty( $exclude_fields ) ) {
+ $custom_fields_sql = 'AND umm_search.um_key NOT IN (';
+ foreach ( $exclude_fields as $exclude_field ) {
+ $custom_fields_sql .= "'" . $exclude_field . "',";
+ }
+ $custom_fields_sql = rtrim( $custom_fields_sql, ',' );
+ $custom_fields_sql .= ') ';
+ }
+ 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 .= ') ';
+ }
// phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared -- $core_search and $additional_search are pre-prepared.
- $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, '%' . $wpdb->esc_like( maybe_serialize( (string) $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}) {$custom_fields_sql}", $search_line, $search_like_string, '%' . $wpdb->esc_like( maybe_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 b93dea1a..6f82e7a0 100644
--- a/includes/core/class-member-directory.php
+++ b/includes/core/class-member-directory.php
@@ -1734,22 +1734,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 );
@@ -1761,6 +1769,12 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) {
$sql['join']
);
}
+
+ 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