Je voudrais des conseils sur la façon d’améliorer le code que j’utilise pour permettre aux gens de commenter des publications.
Les utilisateurs ne peuvent soumettre un commentaire que s'ils sont connectés à Facebook. J'ai commencé à développer cette fonctionnalité directement dans le modèle comments.php. Cela fonctionne, mais il existe une autre fonctionnalité qui permet aux gens de publier un message sur leur mur s'ils cochent une case avant d'envoyer le commentaire.
J'ai quelques problèmes pour développer cette fonctionnalité car j'ai besoin d'une instance de la classe Facebook. Je l'ai déjà dans mon comments.php et je me demandais s'il y avait un moyen de l'utiliser au lieu d'en créer un nouveau. Voici le code:
comments.php:
<?php
locate_template( 'include/facebook.php', true );
$config = array();
$config['appId'] = get_option( 'appId' );
$config['secret'] = get_option( 'secret' );
$facebook = new Facebook($config);
$session = $facebook->getUser();
if(!$session){
$loginUrl = $facebook->getLoginUrl(array('scope'=>'publish_stream, email', 'redirect_uri'=>'http://www.myredirecturi.fr'));
}
if( !isset( $session ) || empty( $session ) ){
?>
<div class="btns">
<div class="fb-connect">
<a href="<?php echo $loginUrl; ?>"><img src="<?php echo get_template_directory_uri(); ?>/img/btn-fb.png" alt=""></a>
</div>
</div>
<?php
}
$nb_coms = get_comments_number();
if( $nb_coms != 0 ){
wp_list_comments('callback=custom_comment&avatar_size=50');
}
?>
<?php
if($session){
try {
$me = $facebook->api('/me');
$username = $me['username'];
$firstname = $me['first_name'];
$email = $me['email'];
// I display here my custom comment form
}
catch(FacebookApiException $e){
error_log($e);
}
}
?>
functions.php
<?php
add_action( 'comment_post', 'custom_save_comment_data' );
function custom_save_comment_data( $comment_id ) {
add_comment_meta( $comment_id, 'fb_username', $_POST['fb_username'] );
//if( isset($_POST['publish']) ){
// $params = array(
// 'message' => "Hurray! This works :)",
// 'name' => "This is my title",
// 'caption' => "My Caption",
// 'description' => "Some Description...",
// 'link' => "http://stackoverflow.com",
// 'picture' => "http://i.imgur.com/VUBz8.png",
// );
// $user = $_POST['fb_userid'];
// $post = $facebook->api("/$user/feed","POST",$params);
//}
}
?>
Que recommandez-vous pour passer l'objet facebook? Est-ce que la façon dont j'ai développé ces fonctionnalités est correcte? ou dois-je créer un plugin? si c'est le cas, pourquoi?
ou dois-je créer un plugin? si c'est le cas, pourquoi?
Oui, vous devriez: Séparer les problèmes. Un thème est la vue de l'application. Comme la fonctionnalité facebook fait partie de votre application, elle appartient à un plugin.
Le fait de déplacer des éléments dans des plugins présente un grand avantage: si vous échangez votre thème, vous pouvez facilement changer de thème sans perdre la fonctionnalité et devoir coder tout cela à nouveau.
Et utilisez toujours des crochets et (encore mieux) des filtres pour importer des éléments dans les modèles. Des crochets tels que the_content
, start_loop
, end_loop
et the_post
sont parfaits pour attacher une sortie de plug-in à la vue. Et ils sont présents par défaut car le noyau les injecte dans les boucles.
Lorsque j'ai développé ce petit plugin, j'ai utilisé une partie du code du plugin de Danny van Kooten : ' Messages récents sur Facebook '. Le contenu du dossier du plugin est:
classes /
facebook-php-sdk/
base_facebook.php
facebook.php
fb_ca_chain_bundle.crt
class-fcwpc.php
fbconnect_wordpress_comments.php
fbconnect_wordpress_comments.php:
<?php
/*
Plugin Name: FB Connect WP Comments
Description: Allow people to comment if they are Facebook connected.
Version: 1.0
*/
require_once dirname(__FILE__) . '/classes/class-fcwpc.php';
$FBWPC = FBWPC::get_instance();
?>
class-fcwpc.php:
<?php
class FBWPC {
private static $instance;
private static $fb_instance;
private $options;
public static function get_instance() {
if(!self::$instance) self::$instance = new FBWPC();
return self::$instance;
}
public function __construct() {
add_action('init', array($this, 'on_init'));
add_action( 'comment_post', array($this, 'save_comment_data') );
add_shortcode('fbconnect-wp-comments', array($this, 'shortcode_output'));
}
public function on_init() {
if(!session_id() && !headers_sent()) {
session_start();
}
}
public function get_options() {
if(!$this->options) {
$defaults = array(
'app_id' => get_option( 'appId' ),
'app_secret' => get_option( 'secret' )
);
$this->options = $defaults;
}
return $this->options;
}
public function getFBApi() {
if(!self::$fb_instance) {
// Only load Facebook class if it has not been loaded yet
// Other plugins may have loaded the class already at this point.
if(!class_exists("Facebook")) {
require_once dirname(__FILE__) . '/facebook-php-sdk/facebook.php';
}
$opts = $this->get_options();
self::$fb_instance = new Facebook(array(
'appId' => trim($opts['app_id']),
'secret' => trim($opts['app_secret']),
));
}
return self::$fb_instance;
}
public function get_session() {
$fb = $this->getFBApi();
$session = $fb->getUser();
return $session;
}
public function save_comment_data( $comment_id ) {
$fb = $this->getFBApi();
// I need this data to display the profil picture thanks to the url : http://graph.facebook.com/'. $fb_username .'/picture
add_comment_meta( $comment_id, 'fb_username', $_POST['fb_username'] );
// test message
if( isset($_POST['publish']) ){
$params = array(
'message' => "Hurray! This works :)",
'name' => "This is my title",
'caption' => "My Caption",
'description' => "Some Description...",
'link' => "http://stackoverflow.com",
'picture' => "http://i.imgur.com/VUBz8.png",
);
$user = $_POST['fb_userid'];
$post = $fb->api("/$user/feed","POST",$params);
}
}
public function shortcode_output()
{
$session = $this->get_session();
$fb = $this->getFBApi();
if(!$session){
$loginUrl = $fb->getLoginUrl(array('scope'=>'publish_stream, email', 'redirect_uri'=>'http://yourRedirectUri.com/'));
}
if( !isset( $session ) || empty( $session ) ){
$output = '<div class="btns">
<div class="fb-connect">
<a href="'. $loginUrl. '"><img src="'. get_template_directory_uri(). '/img/btn-fb.png" alt=""></a>
</div>
</div>';
}
$output .= '<ul>';
if( $nb_coms != 0 ){
$comments = get_comments();
foreach($comments as $comment) :
$fb_username = get_comment_meta( $comment->comment_ID, 'fb_username', true );
$output .= '<li id="list-comment-'. $comment->comment_ID .'">
<img src="http://graph.facebook.com/'. $fb_username .'/picture" alt="" height="100" width="100">
<span class="name">'. $comment->comment_author .'</span>
<p>'. $comment->comment_content .'</p>
<div class="date">'. $comment->comment_date .'</div>
</li>';
endforeach;
}
$output .= '</ul>';
if ( comments_open() ) :
if($session){
try {
$me = $fb->api('/me');
$username = $me['username'];
$firstname = $me['first_name'];
$email = $me['email'];
$output .= '<form action="'. get_site_url(). '/wp-comments-post.php" method="post">
<img src="http://graph.facebook.com/'. $username. '/picture" alt="" height="50" width="50">
<div class="fieldslist">
<input id="author" name="author" type="hidden" value="'. $firstname. '">
<input id="fb_username" name="fb_username" type="hidden" value="'. $username. '">
<input id="email" name="email" type="hidden" value="'. $email. '">
<input id="fb_userid" name="fb_userid" type="hidden" value="'. $session. '">
<textarea name="comment" cols="45" rows="8" aria-required="true"></textarea>
<div class="submit">
<input type="checkbox" name="publish">
<label>Publish on your wall</label>
<input type="hidden" name="comment_post_ID" value="'. get_the_ID(). '" id="comment_post_ID">
<input type="submit" value="Comment">
</div>
</div>
</form>';
}
catch(FacebookApiException $e){
error_log($e);
}
}
endif;
return $output;
}
}
Le fichier comments.php de votre thème
<div class="coms">
<?php echo do_shortcode('[fbconnect-wp-comments]'); ?>
</div>
J'ai nettoyé très rapidement le code, donc je ne sais pas s'il paraîtra bien lorsque vous testerez.