Merge pull request #1480 from ultimatemember/feature/select_filter_relation_hook

Select filter relation hook
This commit is contained in:
Mykyta Synelnikov
2024-03-28 11:04:59 +02:00
committed by GitHub
2 changed files with 69 additions and 29 deletions
+21 -1
View File
@@ -328,7 +328,27 @@ if ( ! class_exists( 'um\core\Member_Directory_Meta' ) ) {
// phpcs:enable WordPress.DB.PreparedSQL.InterpolatedNotPrepared -- $join_alias is pre-escaped. // 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 <caption>Change relation to 'AND'.</caption>
* 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. // 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 ); $this->where_clauses[] = $wpdb->prepare( "( {$join_alias}.um_key = %s AND ( {$values} ) )", $field );
+48 -28
View File
@@ -1872,35 +1872,54 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) {
case 'select': case 'select':
if ( is_array( $value ) ) { 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 <caption>Change relation to 'AND'.</caption>
* 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 ) { foreach ( $value as $single_val ) {
$single_val = trim( stripslashes( $single_val ) ); $single_val = trim( stripslashes( $single_val ) );
$arr_meta_query = array( $arr_meta_query = array(
array( array(
'key' => $field, 'key' => $field,
'value' => $single_val, 'value' => $single_val,
'compare' => '=', 'compare' => '=',
), ),
array( array(
'key' => $field, 'key' => $field,
'value' => serialize( (string) $single_val ), 'value' => serialize( (string) $single_val ),
'compare' => 'LIKE', 'compare' => 'LIKE',
), ),
array( array(
'key' => $field, 'key' => $field,
'value' => '"' . $single_val . '"', 'value' => '"' . $single_val . '"',
'compare' => 'LIKE', 'compare' => 'LIKE',
) ),
); );
if ( is_numeric( $single_val ) ) { if ( is_numeric( $single_val ) ) {
$arr_meta_query[] = array( $arr_meta_query[] = array(
'key' => $field, 'key' => $field,
'value' => serialize( (int) $single_val ), 'value' => serialize( absint( $single_val ) ),
'compare' => 'LIKE', 'compare' => 'LIKE',
); );
} }
@@ -2168,35 +2187,36 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) {
$value = array( $value ); $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 ) { foreach ( $value as $single_val ) {
$single_val = trim( $single_val ); $single_val = trim( $single_val );
$arr_meta_query = array( $arr_meta_query = array(
array( array(
'key' => $field, 'key' => $field,
'value' => $single_val, 'value' => $single_val,
'compare' => '=', 'compare' => '=',
), ),
array( array(
'key' => $field, 'key' => $field,
'value' => serialize( (string) $single_val ), 'value' => serialize( (string) $single_val ),
'compare' => 'LIKE', 'compare' => 'LIKE',
), ),
array( array(
'key' => $field, 'key' => $field,
'value' => '"' . $single_val . '"', 'value' => '"' . $single_val . '"',
'compare' => 'LIKE', 'compare' => 'LIKE',
) ),
); );
if ( is_numeric( $single_val ) ) { if ( is_numeric( $single_val ) ) {
$arr_meta_query[] = array( $arr_meta_query[] = array(
'key' => $field, 'key' => $field,
'value' => serialize( (int) $single_val ), 'value' => serialize( absint( $single_val ) ),
'compare' => 'LIKE', 'compare' => 'LIKE',
); );
} }