diff --git a/includes/core/class-member-directory.php b/includes/core/class-member-directory.php index c1e2668e..6c403722 100644 --- a/includes/core/class-member-directory.php +++ b/includes/core/class-member-directory.php @@ -1580,6 +1580,17 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) { $meta_value = '%' . $wpdb->esc_like( $search ) . '%'; $search_meta = $wpdb->prepare( '%s', $meta_value ); + + preg_match( '~(?<=\{)(.*?)(?=\})~', $search_meta, $matches, PREG_OFFSET_CAPTURE, 0 ); + + // workaround for standard mySQL hashes which are used by $wpdb->prepare instead of the %symbol + // sometimes it breaks error for strings like that wp_postmeta.meta_value LIKE '{12f209b48a89eeab33424902879d05d503f251ca8812dde03b59484a2991dc74}AMS{12f209b48a89eeab33424902879d05d503f251ca8812dde03b59484a2991dc74}' + // {12f209b48a89eeab33424902879d05d503f251ca8812dde03b59484a2991dc74} isn't applied by the `preg_replace()` below + if ( $matches[0][0] ) { + $search_meta = str_replace( '{' . $matches[0][0] . '}', '#%&', $search_meta ); + $sql['where'] = str_replace( '{' . $matches[0][0] . '}', '#%&', $sql['where'] ); + } + // str_replace( '/', '\/', wp_slash( $search_meta ) ) means that we add backslashes to special symbols + add backslash to slash(/) symbol for proper regular pattern. preg_match( '/^(.*).meta_value LIKE ' . str_replace( '/', '\/', wp_slash( $search_meta ) ) . '[^\)]/im', @@ -1587,12 +1598,18 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) { $join_matches ); + $sql['where'] = str_replace( '#%&', '{' . $matches[0][0] . '}', $sql['where'] ); + 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; + } + $data = UM()->fields()->get_field( $field_key ); if ( ! um_can_view_field( $data ) ) { continue;