Skip to content

Instantly share code, notes, and snippets.

@imath
Created July 28, 2014 16:14
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save imath/08d0cc4e9e9c47dfe770 to your computer and use it in GitHub Desktop.
Save imath/08d0cc4e9e9c47dfe770 to your computer and use it in GitHub Desktop.
BuddyPress members directory : Filtrer selon meta_key/value ou trier selon meta_key
<?php
/**
* Tu peux tester en créant un fichier bp-custom.php dans ton répertoire plugins
* @see http://codex.buddypress.org/plugindev/bp-custom-php/
*/
/******************************************************************
* 1/ filter par rapport à un couple meta_key/meta_value
*/
/**
* D'abord on rajoute une option dans le selectbox du
* répertoire des membres.
*
* @see bp-templates/bp-legacy/buddypress/members/index.php
*/
function willy_add_members_directory_filter_options() {
?>
<option value="contributor"><?php _e( 'List contributors', 'willy-bp-custom' ); ?></option>
<?php
}
add_action( 'bp_members_directory_order_options', 'willy_add_members_directory_filter_options' );
/**
* Depuis la version 2.0 on peut utiliser le filtre
* bp_before_{identifiant}_parse_args pour modifier
* les valeurs des arguments du loop des membres.
*
* @see bp_has_members() && bp_parse_args()
*/
function willy_filter_has_members_args( $args = array() ) {
/**
* Si nous ne sommes pas sur le répertoire des membres
* ou que notre nouvelle option n'est pas choisie on retourne
* sans changement les arguments.
*/
if ( ! bp_is_members_directory() || 'contributor' != $args['type'] ) {
return $args;
}
// On est bon, on rajoute la meta à satisfaire.
$args = array_merge( $args, array(
'meta_key' => 'wp_user_level',
'meta_value' => 1,
) );
return $args;
}
add_filter( 'bp_before_has_members_parse_args', 'willy_filter_has_members_args', 10, 1 );
/**
* Avant la 2.0 ou alternativement tu peux aussi filtrer assez tardivement
* la bp_ajax_query_string.
*
* J'ai commenté mais tu peux décommenter et commenter
* add_filter( 'bp_before_has_members_parse_args', 'willy_filter_has_members_args', 10, 1 );
* si tu préfères cette méthode.
*/
function willy_filter_ajax_query_string( $query_string = false , $object = '' ) {
/**
* si ça ne concerne pas les membres et qu'on est pas dans la page listant tous les membres,
* on retourne sans changement. On pourrait directement checker 'members', ici j'utilise l'id
* du composant Members qui est précisément 'members'
*/
if ( $object != buddypress()->members->id && ! bp_is_members_directory() ) {
return $query_string;
}
/**
* Ensuite, on va parser la querystring pour vérifier que "contributor" est sélectionné
*/
$parse_query = wp_parse_args( $query_string, array() );
/**
* Si notre option n'est pas sélectionné, on retourne sans changement la query string
*/
if ( 'contributor' != $parse_query['type'] ) {
return $query_string;
}
// On est bon, on rajoute la meta à satisfaire.
$query_string = array_merge( $parse_query, array(
'meta_key' => 'wp_user_level',
'meta_value' => 1,
) );
return $query_string;
}
//add_filter( 'bp_ajax_querystring', 'willy_filter_ajax_query_string', 20, 2 );
/*******************************************************************
* 2/ Si on veut plutôt "trier" en admettant que tous les utilisateurs aient une valeur dans la meta_key en question
* c'est légèrement différent
*/
/**
* D'abord on rajoute une option dans le selectbox du
* répertoire des membres.
*
* @see bp-templates/bp-legacy/buddypress/members/index.php
*/
function willy_add_members_directory_order_options() {
?>
<option value="roles"><?php _e( 'by roles', 'willy-bp-custom' ); ?></option>
<?php
}
add_action( 'bp_members_directory_order_options', 'willy_add_members_directory_order_options' );
/**
* Cette fois-ci on ne spécifie pas la meta_value
*/
function willy_order_has_members_args( $args = array() ) {
/**
* Si nous ne sommes pas sur le répertoire des membres
* ou que notre nouvelle option n'est pas choisie on retourne
* sans changement les arguments.
*/
if ( ! bp_is_members_directory() || 'roles' != $args['type'] ) {
return $args;
}
// On est bon, on rajoute la meta à satisfaire.
$args = array_merge( $args, array(
'meta_key' => 'wp_user_level',
) );
return $args;
}
add_filter( 'bp_before_has_members_parse_args', 'willy_order_has_members_args', 10, 1 );
/**
* Il faut donc changer la requête pour effectuer notre tri
*/
function willy_pre_user_query( $user_query = null ) {
global $wpdb;
// si notre type / meta key n'est pas celui selectionné inutile de poursuivre.
if ( empty( $user_query ) || 'roles' != $user_query->query_vars['type'] || 'wp_user_level' != $user_query->query_vars['meta_key'] ) {
return;
}
// On modifie la requête des membres :
// On rajoute la table des metas
$user_query->uid_clauses['select'] .= " LEFT JOIN {$wpdb->usermeta} m ON( u.ID = m.user_id )";
/**
* on est obligé je pense de rajouter les champs meta car BuddyPress pour maximiser les perfs
* commence par sélectionner les utilisateurs qui remplissent la condition
* voir bp-core/bp-core-classes.php BP_User_Query::prepare_user_ids_query()
*/
$user_query->uid_clauses['where'] .= $wpdb->prepare( ' AND m.meta_key = %s', $user_query->query_vars['meta_key'] );
/**
* Ensuite on s'occupe de l'ordre.. Cet exemple un peu débile va donc lister
* les utilisateurs selon leurs rôles de manière décroissante (Administrateur, Editeur...)
*/
$user_query->uid_clauses['orderby'] = 'ORDER BY m.meta_value';
$user_query->uid_clauses['order'] = 'DESC';
}
add_action( 'bp_pre_user_query', 'willy_pre_user_query', 10, 1 );
@solhuebner
Copy link

Nice

@W-prog
Copy link

W-prog commented Oct 2, 2023

Great, it's work fine. It's possible to set this order option as default?

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