Ajouter une page à un groupe

de | 10 juillet 2014

Le composant Groupe de BuddyPress permet de bâtir très facilement une micro-communauté d’utilisateurs. Un groupe une fois constitué se présente avec un menu spécifique situé au bas de l’en-tête de groupe. Ce menu sous forme d’onglets donne accès:

  • au fil d’activité du groupe (Accueil)
  • à l’annuaire des membres du groupe (Membres)
  • à l’outil d’invitation (Inviter)
  • au forum du groupe (si activé)
  • à la gestion front-end du groupe (Admin)

Il peut néanmoins être nécessaire d’intégrer des éléments supplémentaires à ce menu initial. Pour ce faire, BuddyPress dispose d’une API dédiée, BP_Group_Extension. Grâce à elle, on va pouvoir facilement retirer ou ajouter des éléments au composant. Notez que par défaut, l’API s’étend à tous les groupes. Si un changement quelconque ne devait s’appliquer qu’à un seul groupe, il faut absolument le spécifier dans votre code.

add_page_to_group

Exemple d’utilisation

Nous voulons ajouter un règlement intérieur à l’attention des membres d’un seul groupe.

Tâches à accomplir

  1. Rédiger le règlement. Soit sous forme d’article, soit sur une page statique. Dans les 2 cas, nous créons ainsi un post.
  2. Ajouter un item au menu existant.
  3. Afficher le contenu au composant.

Limitation

En affichant un contenu de type post sur le template de groupe, on se heurte à un problème de compatibilité de thème. En effet, un post est prévu pour être affiché sur le template de blog ou éventuellement sur le template des activités. Cela implique que certains filtres (kses, oembed, shortcode et autres) n’agirons à cet endroit. Dans le cas présent, un article ou une page affichera proprement le texte et les éventuelles images. Mais un shortcode ou une URL de vidéo ne seront pas interprétés et apparaîtront en clair. En effet, nous travaillons sur la page virtuelle du groupe, c’est à dire celle que vous avez créé lors de l’installation du composant. L’URL de la nouvelle page de groupe ne changera pas lorsque le post est affiché:
Ce sera votre_site.com/groupes/nom_du_groupe et pas votre_site.com/nom_du_groupe/nom_page/ ou votre_site.com//nom_du_groupe/nom_du_post (ou autre structure de permalien)
Vous voilà prévenu concernant l’affichage d’un post sur le composant Groupe: celui-ci restera basique (txt+html autorisé).

add_page_to_group_result

Le code

On commence par nommer une nouvelle class qu’on va ajouter à BP_Group_Extension. On passe ensuite à la fonction _construct() qui va créer le nouvel item de menu, puis à la fonction display() qui gère l’affichage. Là-dedans il y a 2 exemples. Le premier pour afficher un post, le second pour afficher une vidéo. Vous éliminerez évidemment la partie qui ne vous intéresse pas. Enfin la dernière partie concerne les déclarations relatives à l’extension de la class à un seul groupe. Cette partie est également à ajuster selon votre besoin en prenant soin de conserver la ligne avec la fonction bp_register_group_extension(), selon que vous voudrez appliquer cette modif à un ou tous les groupes.

Ce que fait ce code:

  1. ajoute un item de menu nommé Additionnal Page au groupe My New Group, qui a pour ID 14
  2. affiche un article, dont le ID est 140 (pur hasard: rien à voir avec ID précédent)
  3. affiche une vidéo
  4. affiche le tout dans UN SEUL groupe
function bpfr_add_page_to_group() {

if ( class_exists( 'BP_Group_Extension' ) ) :
	
class BPFR_Custom_Group_Extension extends BP_Group_Extension {
	
	/**
	* 	building the tab 
	*/
		
    function __construct() {
        $args = array(
            'slug' => 'additionnal-page', // tab slug - mandatory
            'name' => 'Additionnal Page'  // tab name - mandatory		
        );
        parent::init( $args );
    } // end construct()
	
	/**
	* content display 
	*/	
	
    function display() {	
	
	// grab page or post ID
 	$id = 140;	
	$p = get_post($id);	 	
	
		/** 
		 * example 1 (post) 
		 * images are visible, videos are not.		 
		 * autoembeding is not working here.
		*/
		
		// output the title		
		echo '<h3>'.apply_filters('the_content', $p->post_title).'</h3>';
		// output the post		
		echo apply_filters('the_content', $p->post_content); 
		// end option 1
		
	
		/**
		* example 2 (video)
		* adding a video to the group
		*/		
		
		// output a Youtube video
		echo '<p style="text-align:center">'.wp_oembed_get( 'http://www.youtube.com/watch?v=dQw4w9WgXcQ', array(
			'width'  => 600,
			'height' => 400
			) ).'</p>';
		// end option 2
	
	}   // end display() 
} // end class

////////////////////////////////////////////////////////////
/* display content only in one group (ex. group_ID is 14) */
////////////////////////////////////////////////////////////
	
	// check for a group ID
		if( bp_has_groups() ) {
			// Grab current group ID
			bp_the_group();
			$group_id = bp_get_group_ID();
		}
	
	//////////////////////////////////////////
	/* apply our changes only to this group */
	//////////////////////////////////////////
	
		// conditionnal action
		if ( $group_id == 14 ) {	
			bp_register_group_extension( 'BPFR_Custom_Group_Extension' );			
		}		
		
endif; 
}
add_filter('bp_groups_default_extension', 'bpfr_add_page_to_group' );

Documentation

Codex BuddyPress Group Extension API
Codex WordPress wp_oembed_get
Codex WordPress Embeds (liste des services vidéos)

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