Ajouter un bouton « envoyer un article » dans buddypress

Quand on développe avec WordPress / Buddypress, il y a parfois des fonctionnalités qui ne sont pas natives et qui manquent.
De nombreux plugins permettent de partager des liens, des infos avec les membres, mais il n’existe pas (à ma connaissance) de module qui permet de partager du contenu interne à son site avec des membres du même site (de la communauté buddypress).

Il existe une fonction native qui permet de pré-remplir le nom d’un destinataire de message, elle se situe dans :
/plugins/buddypress/bp-messages/bp-messages-template.php

La fonction qui permet de remplir le contenu du message :

bp_messages_content_value()

Cette fonction expose un filter WordPress :

bp_get_messages_content_value()

Ce filtre permet tout simplement d’injecter des informations dans le message.
Mais le code ne prend en charge que les données en POST :

$content = '';
if ( !empty( $_POST['content'] ) )
	$content = $_POST['content'];
return apply_filters( 'bp_get_messages_content_value', $content );

Pour réaliser un simple bouton de partage d’article, nous n’avons peut-être pas besoin de faire un formulaire pour chaque article.
Nous allons donc étendre ce filtre avec la gestion des données en GET.
Dans notre fichier functions.php (ou autre suivant votre organisation de code) :

function add_message_content($content){
	if ( !empty( $_GET['content'] ) ) {
		return $content . $_GET['content'];
	}
}
add_filter( 'bp_get_messages_content_value', 'add_message_content' );

Et voilà, il ne reste plus qu’à ajouter un lien vers l’écran de composition de message de buddypress dans une boucle d’articles.
Dans un template d’archive par exemple :

   <p><a class="msg" href="<?php echo wp_nonce_url( bp_loggedin_user_domain() . bp_get_messages_slug() . 
   '/compose/?r=' . bp_core_get_username( $user_id ). '&content=' . get_permalink() ); ?>">
   <?php echo __( 'Send'); ?></a></p>


Le paramètre content peut être un peu enrichi, mais il va falloir surveiller la longueur de la query string !
On peut bien sûr faire de même avec le champ « subject » qui a lui aussi un filtre wordpress.