Voor een WordPress website met BuddyPress was ik op zoek naar een mogelijkheid om het sorteren van gebruikers aan te passen. Voor deze website heb ik een aantal eigen velden (custom fields) toegevoegd waaronder achternaam waarop gesorteerd moet worden. De voorkeur ging uit naar een stukje PHP code die dit doet.
Een nadeel van deze code is dat het veld wel waarop gesorteerd wordt ingevuld moet zijn. Dit komt omdat sortering alleen op een waarde plaats kan vinden. Een simpele oplossing is het veld verplicht maken.
Stap 1:
Bepaal het id van het veld waar op je wilt sorteren door in “wp-admin” gedeelte te klikken op “Gebruikers” en dan op “Profielvelden”. Klik nu op de knop “Bewerken” onder het veld waarop je wilt sorteren. Boven in de adresbalk van je browser zie je dit staan:
http://www.domeinnaam.nl/wp-admin/users.php?page=bp-profile-setup&group_id=1&field_id=24&mode=edit_field
Het id vind je achter het woord “field_id” en is in bovenstaand voorbeeld het getal 24.
Stap 2:
Kopieer de code die hieronder staat naar het bestand “functions.php” in jouw thema of child thema.
Pas het getal 20 in de functie “get_custom_ids()” aan naar het getal dat je opgezocht hebt in stap 1.
Wil je het aantal gebruikers per pagina aanpassen? Pas dan de variabele “$perpage” in de functie “custom_members_query()” aan.
/* Show by default all users orderd on the field lastname, this field must be filled in */ class BP_Custom_User_Ids { private $custom_ids = array(); public function __construct() { $this->custom_ids = $this->get_custom_ids(); add_action( 'bp_pre_user_query_construct', array( $this, 'custom_members_query' ), 1, 1 ); add_filter( 'bp_get_total_member_count', array( $this, 'custom_members_count' ), 1, 1 ); } private function get_custom_ids() { global $wpdb; // Get users orderd by their lastname, custom field is identified with the id 20. $custom_ids = $wpdb->get_col("SELECT user_id FROM {$wpdb->prefix}bp_xprofile_data WHERE field_id = 20 ORDER BY value"); return array_merge($custom_ids); } function custom_members_query( $query_array ) { // Determine which set of custom_ids must be returned to respect pagination system of BuddyPress. $upage = isset($_GET['upage']) ? (int)$_GET['upage'] : 1; $perpage = 20; $customIds = array_slice($this->custom_ids, ($upage - 1) * $perpage, $perpage); $query_array->query_vars['user_ids'] = $customIds; $query_array->total_users = count($this->custom_ids); } function custom_members_count ( $count ) { $new_count = count( $this->custom_ids ); return $count - $new_count; } } function custom_user_ids( ) { new BP_Custom_User_Ids (); } add_action( 'bp_before_directory_members', 'custom_user_ids' );
Stap 3:
Sorteren van gebruikers kan invloed hebben op het totaal aantal omdat gebruikers zonder “achternaam” worden overgeslagen. Om dit weer kloppend te maken vind je hierboven code die kijkt welke pagina er op dit moment getoond wordt en hoeveel gebruikers er per pagina getoond moeten worden. Er moet ook nog een wijziging in de template members-loop.php doorgevoerd worden.
Kopieer de template “members-loop.php” van:
/plugins/buddypbress/bp-legacy/buddypress/members/members-loop.php
Naar je thema in:
/themes/jouw thema naam/buddypress/members/members-loop.php
Pas in het gekopieerde bestand de onderstaande regel aan:
/**/ if ( bp_has_members( bp_ajax_querystring('members') ) :
Naar:
/**/ if ( bp_has_members( bp_ajax_querystring('members') . 'per_page=20' ) ) :
Het aantal achter “per_page” moet gelijk zijn aan het aantal dat je ingevuld hebt voor “$perpage” in de functie “custom_members_query()”.
BuddyPress maakt standaard gebruik van ajax techniek voor paginering om herladen van de pagina te voorkomen. Om de code uit stap 2 te gebruiken schakelen wij deze functionaliteit hieronder uit.
Pas in het gekopieerde bestand de onderstaande regel aan (deze komt boven- en onderin voor):
<div id=”pag-top” class=”pagination”>
Naar:
<div id=”pag-top” class=”pagination no-ajax”>