私は、人々が投稿にコメントできるようにするために私が使用しているコードをどのように改善するかについてのアドバイスをお願いします。
ユーザーがFacebookに接続している場合にのみコメントを送信できます。私はcomments.phpテンプレートの中でこの機能を直接開発し始めました。それは動作しますが、コメントを送信する前にチェックボックスをオンにした場合にメッセージを自分の壁に公開できるようにする機能がもう1つあります。
Facebookクラスのインスタンスが必要なので、この機能を開発するにはいくつか問題があります。私はすでにcomments.phpにそれを持っています、そしてそれを新しいものを作成する代わりにそれを使用する方法があるかどうか疑問に思いました。これがコードです:
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);
//}
}
?>
Facebookオブジェクトを渡すために何をお勧めしますか?これらの機能の開発方法は正しいですか?または私はプラグインを作成する必要がありますか?それが事実であるならば、なぜですか?
または私はプラグインを作成する必要がありますか?それが事実であるならば、なぜですか?
はい、あなたはすべきです:懸念の分離。テーマはアプリケーションのビューです。 Facebookの機能はアプリケーションの一部であるため、プラグインに属しています。
テーマをプラグインに移行することには大きな利点が1つあります。テーマを交換する場合は、機能を失うことなく、またそのすべてをコーディングすることなく、テーマを簡単に切り替えることができます。
そして、ものをテンプレートに取り込むためには、常にフックと(さらに優れた)フィルタを使用してください。 the_content
、start_loop
、end_loop
、the_post
のようなフックは、プラグイン出力をビューに添付するのに最適です。そして、コアがそれらをループに注入するので、デフォルトで存在します。
この小さなプラグインを開発したとき、 Danny van Kooten のプラグインのコードの一部を使用しました。 ' 最近のFacebook投稿 '。プラグインフォルダの内容は次のとおりです。
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;
}
}
テーマ内のファイルcomments.php
<div class="coms">
<?php echo do_shortcode('[fbconnect-wp-comments]'); ?>
</div>
コードをすばやくきれいにしたので、テストするときに見栄えがよいかどうかわかりません。