Triage par group types sur l’annuaire des groupes

de | 12 octobre 2016

J’ai profité de la phase de test de BP 2.7 beta -> RC2 pour m’amuser à afficher les types de groupes (apparus dans BP 2.6) sur un site BuddyPress. Dans la version 2.7, on peut maintenant accéder aux types dans l’admin de groupe, en front. Pou autant, la première chose qui m’a interpellé dans cette nouvelle fonctionnalité, c’est qu’elle n’est pas orientée – pour le moment – pour un usage front. Seul l’admin du site a accès aux réglages et c’est ensuite à chaque admin de groupe de choisir à quel type il veut appartenir. Résultat immédiat de cette opération pour l’usager: aucun, si ce n’est une petite phrase sybilline sur l’en-tête, quand on se trouve sur la page d’un groupe: Type:Machin.
Comme pour les champs de profils, Machin est clickable et renvoi sur une liste de groupes de type Machin. Un peu court comme service, à mon avis. Mais ce n’est que le début.

En attendant, on a rien de cet ordre sur l’annuaire principal des groupes. Ce qui est un non-sens à mon avis, puisqu’une des premières choses que l’on fait pour connaître les groupes est jutement de visiter l’annuaire. Et là, non seulement le type et la description n’apparaissent pas, mais en plus le visiteur n’en sait rien tant qu’il ne se rend pas sur la page d’un groupe. Et dans le filtre de tri des groupes, il n’y a rien non plus. Pas très user friendly tout ça ! Pour le moment, pardon pour cette répétition.

Voilà une drôle de fonctionnalité, et bien discrète de surcroît. Je me suis donc mis en tête de la rendre plus visible! Les membres ont bien leurs types. Pourquoi n’en ferait-on pas autant pour les groupes ? Et je me suis mis au boulot.

annuaire de groupe

Exemple d’annuaire de groupe présentant 3 types

Ce fut relativement facile, dans la mesure où j’ai déjà travaillé sur les member types, et que le code utilisé pour les type de groupe est somme toute très similaire. Voici donc, en 5 étapes ou 5 fonctions, comme vous voudrez, comment afficher les groupes par type sur l’annuaire des groupes. 5 fonctions que je vous recommande d’utiliser sur votre site sous forme de plugin plutôt que de surcharger le fichier bp-custom. A vous de voir !

La première fonction définit les types de groupe qu’on veut utiliser. Aucune règle particulière: sky is the limit !
Ces types apparaîtront en admin, dans l’admin d’un groupe, dans la colonne de droite, parmi les options de groupe existantes. Ils apparaissent aussi sur le site dans l’étape 2 de création de groupe, sos forme de cases à cocher, accompagnés d’une description. Celle-ci est ajoutée via la fonction ci-après.

On va créer 3 types: Team, Ninja et Jaguar

// 1. create group types
function bpex_add_custom_group_types() {
// Type team
    bp_groups_register_group_type( 'team', array(
        'labels' => array(
            'name' => 'Teams',
            'singular_name' => 'Team'
			),
        'has_directory' => 'teams',
        'show_in_create_screen' => true,
        'show_in_list' => true,
        'description' => 'Teams are good',
        'create_screen_checked' => true
    ) );
// Type ninja
    bp_groups_register_group_type( 'ninja', array(
        'labels' => array(
            'name' => 'Ninjas',
            'singular_name' => 'Ninja'
			), 
        'has_directory' => 'ninjas',
        'show_in_create_screen' => true,
        'show_in_list' => true,
        'description' => 'Ninjas are masters',
        'create_screen_checked' => true
    ) );
// Type jaguar
    bp_groups_register_group_type( 'jaguar', array(
        'labels' => array(
            'name' => 'Jaguars',
            'singular_name' => 'Jaguar'
			), 
        'has_directory' => 'jaguars',
        'show_in_create_screen' => true,
        'show_in_list' => true,
        'description' => 'Jaguars are wild',
        'create_screen_checked' => true
    ) );
}
add_action( 'bp_groups_register_group_types', 'bpex_add_custom_group_types' );

On va à présent utiliser la fonction suivante pour afficher un onglet par type sur l’annuaire des membres. Ceux-ci iront s’ajouter aux items existants: Tous les Groupes, Mes Groupes et Créer un Groupe grâce à un nouvel action hook ‘bp_groups_directory_group_types’, qui ajoute une nouvelle bare de navigation sous la principale. Ce qui n’est pas mal si vous manquez de place sur cette dernière, pour mettre en valeur les types ou pour n’importe qu’elle autre raison d’ailleurs. J’ai mis les deux add_action, ce qui vous permettra de juger du résultat qui vous convient le mieux.

// 2. display group type tabs
function bpex_display_directory_tabs() {
	$group_types = bp_groups_get_group_types( array(), 'objects' );

	// Loop in group types to build the tabs
	foreach ( $group_types as $group_type ) : ?>

	<li id="groups-<?php echo esc_attr( $group_type->name ) ;?>">
		 <a href="<?php bp_groups_directory_permalink(); ?>"><?php printf( '%s <span>%d</span>', $group_type->labels['name'], bpex_count_group_types( $group_type->name ) ); ?></a>
	</li>

	<?php endforeach;
}
// group main nav bar
//add_action( 'bp_groups_directory_group_filter', 'bpex_display_directory_tabs' );
// group second nav bar
add_action( 'bp_groups_directory_group_types', 'bpex_display_directory_tabs' );

Comme on travaille sur l’annuaire, on va respecter la tradition BuddyPress en rajoutant un compteur de type à côté de chaque en-tête d’onglet. J’ai un peu galéré là-dessus quand je me suis rappelé que j’avais cela en magasin depuis très longtemps, pour les types de membres. Et grâce aux talents de @imath, que je remercie pour ça au passage. Il m’a suffit de changer 2-3 bricoles pour l’adapter, et zou !
Notez qu’il s’agit là d’une exclusivité, dans le sens où ce n’est pas du tout implémenté dans BuddyPress 2.7 pour le moment.

// 3. get the group type count
function bpex_count_group_types( $group_type = '', $taxonomy = 'bp_group_type' ) {
	global $wpdb;
	$group_types = bp_groups_get_group_types();

	if ( empty( $group_type ) || empty( $group_types[ $group_type ] ) ) {
		return false;
	}

	$count_types = wp_cache_get( 'bpex_count_group_types', 'using_gt_bp_group_type' );

	if ( ! $count_types ) {
		if ( ! bp_is_root_blog() ) {
			switch_to_blog( bp_get_root_blog_id() );
		}

		$sql = array(
			'select' => "SELECT t.slug, tt.count FROM {$wpdb->term_taxonomy} tt LEFT JOIN {$wpdb->terms} t",
			'on'     => 'ON tt.term_id = t.term_id',
			'where'  => $wpdb->prepare( 'WHERE tt.taxonomy = %s', $taxonomy ),
		);

		$count_types = $wpdb->get_results( join( ' ', $sql ) );
		wp_cache_set( 'bpex_count_group_types', $count_types, 'using_gt_bp_group_type' );

		restore_current_blog();
	}

	$type_count = wp_filter_object_list( $count_types, array( 'slug' => $group_type ), 'and', 'count' );
	$type_count = array_values( $type_count );

	if ( empty( $type_count ) ) {
		return 0;
	}

	return (int) $type_count[0];
}

On approche de la fin, mais il nous faut d’abord ajouter du contenu à nos 3 onglets. La fonction suivante va s’en charger.

// 4. display group type tab content
function bpex_set_has_groups_type_arg( $args = array() ) {
	// Get group types to check scope
	$group_types = bp_groups_get_group_types();

	// Set the group type arg if scope match one of the registered group type
	if ( ! empty( $args['scope'] ) && ! empty( $group_types[ $args['scope'] ] ) ) {
		$args['group_type'] = $args['scope'];
	}

	return $args;
} 
add_filter( 'bp_before_has_groups_parse_args', 'bpex_set_has_groups_type_arg', 10, 2 );

Et le meilleur pour la fin, puisque c’est pour çà que j’ai bossé: afficher la description du type de chaque groupe sur l’annuaire général des groupes. Je ne vous cache pas que je me suis fait aider sur ce coup par les devs de BP, parce que je ne m’en sortais plus entre les array et les strings, pour ne choper qu’une seule description au lieu de la liste complète prévue par défaut. Moi y’en a pas dev et pas au courant de toutes les subtilités apportées par des nouveautés inconnues.
Là aussi, une exclusivité bp-fr, avec 2 options d’affichage: une brute et une avec du style. A vous de choisir laquelle convient le mieux à votre thème.

// 5. display group type on directory
function bpex_group_directory_show_group_type( $group_id = NULL )  {
    if ( empty( $group_id ) ) {
        $group_id = bp_get_group_id();
    }

    // Group directory.
    if( bp_is_active( 'groups' ) && bp_is_groups_directory() ) {
        // Passing false means supporting multiple group types.
        $group_type = (array) bp_groups_get_group_type( $group_id, false );
		
		$sep = '&ndash;';
   
        foreach ( $group_type as $type ) {
            $obj = bp_groups_get_group_type_object( $type );

            // Group type name/description.
            if ( ! empty( $obj->description ) ) {
				// no style
              //  printf( '%1$s %2$s %3$s', $obj->labels['singular_name'], $sep, esc_html( $obj->description ) );
				// add style
				printf( '<div class="dir-desc-'.$obj->labels['singular_name'].'"><span class="dir-desc-span-name">%1$s</span><span class="dir-desc-span-sep">%2$s</span><span class="dir-desc-span-desc">%3$s</span>.', $obj->labels['singular_name'], $sep, esc_html( $obj->description ).'</div>' );
            }
        }
    }
}
add_action( 'bp_directory_groups_item', 'bpex_group_directory_show_group_type' );

En prime, voici quelques règles CSS pour colorer les types, à adapter selon l’option utilisée précédemment. Telles quelles, elles s’appliquent à l’option stylée. A placer dans le fichier style.css de votre thème-enfant bien sûr.

/* group type styles */
.dir-desc-Team {
/* dir-desc-span-name dir-desc-span-desc */
background-color: #adc6c9;
}
.dir-desc-Jaguar {
/* dir-desc-span-name dir-desc-span-desc */
background-color: #9bf2a5;
}
.dir-desc-Ninja {
/* dir-desc-span-name dir-desc-span-desc */
background-color: #f29bac;
}
.dir-desc-Team span.dir-desc-span-sep { 
color: #f20404;
font-weight: bold;
}

Il ne me reste plus qu’à préciser que tout ceci va fonctionner sur chaque onglet avec le filtre de tri d’origine. Que ceci est évidemment de la R&D artisanale pouvant certainement être améliorée ou étendue et mise à la disposition du public pour tester la nouvelle group API et en saisir tout le potentiel.

Bon test et amusez-vous bien !

Références
Group Types
Group queries have been rewritten for BP 2.7
Template Updates 2.7 (Très important à lire si vous utilisez un thème-enfant très personnalisé.)

Partagez...Tweet about this on TwitterShare on Google+Share on FacebookEmail this to someone