Skip to content

Instantly share code, notes, and snippets.

@yuriinalivaiko
Last active March 14, 2024 22:13
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save yuriinalivaiko/86bbcffb2e3d64ad9765cf704038b144 to your computer and use it in GitHub Desktop.
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.
<?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 );
@yuriinalivaiko
Copy link
Author

This code adds three filters:

  • Filter Make displays members who have needed value in fields with meta key make1, make2 or make3.
  • Filter Model displays members who have needed value in fields with meta key model1, model2 or model3.
  • Filter Year displays members who have needed value in fields with meta key year1, year2 or year3.

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.
2024-03-14_232948

Added custom filters in the member directory.
2024-03-14_233543

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment