diff --git a/includes/core/class-member-directory-meta.php b/includes/core/class-member-directory-meta.php index 4f321cf6..7b187931 100644 --- a/includes/core/class-member-directory-meta.php +++ b/includes/core/class-member-directory-meta.php @@ -328,7 +328,27 @@ if ( ! class_exists( 'um\core\Member_Directory_Meta' ) ) { // phpcs:enable WordPress.DB.PreparedSQL.InterpolatedNotPrepared -- $join_alias is pre-escaped. } - $values = implode( ' OR ', $values_array ); + /** + * Filters change select filter relation. + * + * @param {string} $relation. + * @param {string} $field field key. + * + * @return {string} relation. + * + * @since 2.8.5 + * @hook um_members_directory_filter_select_meta + * + * @example Change relation to 'AND'. + * function my_um_members_directory_filter_select_meta( $relation, $field ) { + * // your code here + * $relation = 'AND'; + * return $relation; + * } + * add_filter( 'um_members_directory_filter_select_meta', 'my_um_members_directory_filter_select_meta', 10, 2 ); + */ + $relation = apply_filters( 'um_members_directory_filter_select_meta', 'OR', $field ); + $values = implode( ' ' . esc_sql( $relation ) . ' ', $values_array ); // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared -- $join_alias and $values variables are pre-escaped or $wpdb->prepare. $this->where_clauses[] = $wpdb->prepare( "( {$join_alias}.um_key = %s AND ( {$values} ) )", $field ); diff --git a/includes/core/class-member-directory.php b/includes/core/class-member-directory.php index 34f87665..a6acb377 100644 --- a/includes/core/class-member-directory.php +++ b/includes/core/class-member-directory.php @@ -1872,35 +1872,54 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) { case 'select': if ( is_array( $value ) ) { - $field_query = array( 'relation' => 'OR' ); + /** + * Filters change select filter relation. + * + * @param {array} $args query args. + * @param {string} $field field key. + * + * @return {array} query args. + * + * @since 2.8.5 + * @hook um_members_directory_filter_select + * + * @example Change relation to 'AND'. + * function my_um_members_directory_filter_select( $args, $field ) { + * // your code here + * $args = array( 'relation' => 'AND' ) + * return $args; + * } + * add_filter( 'um_members_directory_filter_select', 'my_um_members_directory_filter_select', 10, 2 ); + */ + $field_query = apply_filters( 'um_members_directory_filter_select', array( 'relation' => 'OR' ), $field ); foreach ( $value as $single_val ) { $single_val = trim( stripslashes( $single_val ) ); $arr_meta_query = array( array( - 'key' => $field, - 'value' => $single_val, - 'compare' => '=', + 'key' => $field, + 'value' => $single_val, + 'compare' => '=', ), array( - 'key' => $field, - 'value' => serialize( (string) $single_val ), - 'compare' => 'LIKE', + 'key' => $field, + 'value' => serialize( (string) $single_val ), + 'compare' => 'LIKE', ), array( - 'key' => $field, - 'value' => '"' . $single_val . '"', - 'compare' => 'LIKE', - ) + 'key' => $field, + 'value' => '"' . $single_val . '"', + 'compare' => 'LIKE', + ), ); if ( is_numeric( $single_val ) ) { $arr_meta_query[] = array( - 'key' => $field, - 'value' => serialize( (int) $single_val ), - 'compare' => 'LIKE', + 'key' => $field, + 'value' => serialize( absint( $single_val ) ), + 'compare' => 'LIKE', ); } @@ -2168,35 +2187,36 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) { $value = array( $value ); } - $field_query = array( 'relation' => 'OR' ); + /** This filter is documented in includes/core/class-member-directory.php */ + $field_query = apply_filters( 'um_members_directory_filter_select', array( 'relation' => 'OR' ), $field ); foreach ( $value as $single_val ) { $single_val = trim( $single_val ); $arr_meta_query = array( array( - 'key' => $field, - 'value' => $single_val, - 'compare' => '=', + 'key' => $field, + 'value' => $single_val, + 'compare' => '=', ), array( - 'key' => $field, - 'value' => serialize( (string) $single_val ), - 'compare' => 'LIKE', + 'key' => $field, + 'value' => serialize( (string) $single_val ), + 'compare' => 'LIKE', ), array( - 'key' => $field, - 'value' => '"' . $single_val . '"', - 'compare' => 'LIKE', - ) + 'key' => $field, + 'value' => '"' . $single_val . '"', + 'compare' => 'LIKE', + ), ); if ( is_numeric( $single_val ) ) { $arr_meta_query[] = array( - 'key' => $field, - 'value' => serialize( (int) $single_val ), - 'compare' => 'LIKE', + 'key' => $field, + 'value' => serialize( absint( $single_val ) ), + 'compare' => 'LIKE', ); }