Last active
March 14, 2024 22:13
-
-
Save yuriinalivaiko/86bbcffb2e3d64ad9765cf704038b144 to your computer and use it in GitHub Desktop.
This code adds custom filters to the member directory of the Ultimate Member plugin. These filters are grouped - one filter searches in multiple fields.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
/** | |
* Add custom grouped filters to the member directory. | |
* | |
* Add filters you need to this array. Every filter is an array where: | |
* - key Filter key. Any valid string key. | |
* - type Filter type. Accepts: 'text', 'select', 'slider', 'datepicker', 'timepicker'. | |
* - label Filter label (used as the filter placeholder). | |
* - fields An array of usermeta keys. Filter searches a value in these usermeta. | |
*/ | |
$um_custom_filters = array( | |
array( | |
'key' => 'make', | |
'type' => 'text', | |
'label' => __( 'Make', 'ultimate-member' ), | |
'fields' => array( | |
'make1', | |
'make2', | |
'make3', | |
), | |
), | |
array( | |
'key' => 'model', | |
'type' => 'text', | |
'label' => __( 'Model', 'ultimate-member' ), | |
'fields' => array( | |
'model1', | |
'model2', | |
'model3', | |
), | |
), | |
array( | |
'key' => 'year', | |
'type' => 'text', | |
'label' => __( 'Year', 'ultimate-member' ), | |
'fields' => array( | |
'year1', | |
'year2', | |
'year3', | |
), | |
), | |
); | |
global $um_custom_filters; | |
// Add ustom filter fields. | |
add_filter( 'um_members_directory_filter_fields', function( $filter_fields ) { | |
global $um_custom_filters; | |
foreach( $um_custom_filters as $f ) { | |
$filter_fields[ $f['key'] ] = $f['label']; | |
} | |
return $filter_fields; | |
} ); | |
// Add custom filter types. | |
add_filter( 'um_members_directory_filter_types', function( $filter_types ) { | |
global $um_custom_filters; | |
foreach( $um_custom_filters as $f ) { | |
$filter_types[ $f['key'] ] = $f['type']; | |
} | |
return $filter_types; | |
} ); | |
// Add custom filters. | |
add_filter( 'um_frontend_member_search_filters', function( $search_filters ) { | |
global $um_custom_filters; | |
foreach( $um_custom_filters as $f ) { | |
$search_filters[] = $f['key']; | |
} | |
return $search_filters; | |
} ); | |
// Add custom filter labels. | |
add_filter( 'um_search_fields', function( $attrs, $field_key ) { | |
global $um_custom_filters; | |
foreach( $um_custom_filters as $f ) { | |
if ( $f['key'] === $field_key ) { | |
$attrs['label'] = $f['label']; | |
} | |
} | |
return $attrs; | |
}, 10, 2 ); | |
// Modify the um_get_members query (default usermeta table). | |
add_filter( 'um_prepare_user_query_args', function( $query_args, $directory_data ) { | |
global $um_custom_filters; | |
foreach( $um_custom_filters as $f ) { | |
if ( ! empty( $_POST[ $f['key'] ] ) && ! empty( $f['fields'] ) ) { | |
$value = sanitize_text_field( $_POST[ $f['key'] ] ); | |
$filter_query = array( | |
'relation' => 'OR', | |
); | |
foreach ( $f['fields'] as $field ) { | |
$filter_query[] = array( | |
'key' => $field, | |
'value' => $value, | |
'compare' => 'LIKE', | |
); | |
} | |
$query_args['meta_query'][] = $filter_query; | |
} | |
} | |
return $query_args; | |
}, 10, 2 ); | |
// Modify the um_get_members query (custom usermeta table). | |
add_action( 'um_pre_users_query', function( $directory, $directory_data ) { | |
global $wpdb; | |
global $um_custom_filters; | |
foreach( $um_custom_filters as $f ) { | |
if ( ! empty( $_POST[ $f['key'] ] ) && ! empty( $f['fields'] ) ) { | |
$value = sanitize_text_field( $_POST[ $f['key'] ] ); | |
$table = $wpdb->prefix . 'um_metadata'; | |
$alias = 'umm' . $f['key']; | |
$keys = "'" . implode( "','", $f['fields'] ) . "'"; | |
$like = '%' . $wpdb->esc_like( $value ) . '%'; | |
$filter_query = $wpdb->prepare( | |
"INNER JOIN %i AS %i ON ( %i.user_id = u.ID AND %i.um_key IN ({$keys}) AND %i.um_value LIKE %s )", | |
$table, | |
$alias, | |
$alias, | |
$alias, | |
$alias, | |
$like | |
); | |
$directory->joins[] = $filter_query; | |
} | |
} | |
}, 10, 2 ); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
This code adds three filters:
make1
,make2
ormake3
.model1
,model2
ormodel3
.year1
,year2
oryear3
.Extend the
$um_custom_filters
array to add more filters.Extend the
fields
array in the filter array to add more related fields.Screenshots
Fields which data are used for filtering members.
Added custom filters in the member directory.