WP Facebook Portal 復活方法

WP Facebook Portal を使いたいという人がいたので調べてみたら、どうもFacebook APIの仕様変更に伴い、正常に動作しないことになっていました。

WP Facebook Portal

APIの仕様を熟読するほど暇がないので、適当に情報検索したり、コードを眺めたり、APIの返り値を覗いたり・・・。

その中でとりあえず簡単に動作させる方法を見つけたので記事にしておきます。

前提として、Facebook for Developersで、client_id、client_secret 、facebook page id が取得できているものとします。

必要なものは「アクセストークン」で、簡単に取得する方法として他のプラグイン”Custom Facebook Feed“を導入します。

Custom Facebook Feed

設定画面を進めて行くと、Facebook Access Tokenが表示されます。

これをコピーしておいてください。 ※プラグインはもう必要ないので削除してOKです。

次にWP Facebook Portal プラグインのファイルを直接編集します。

/wp-content/plugins/wp-facebook-portal/libraries/facebook.php の167行目付近に $this->accessToken=”コピーしたトークン“; を1行追記してください。
これで動作するようになります。

    public function getAccessToken($config = array())
    {
        if (empty($config)) {
            if ($this->accessToken !== null) {
                return $this->accessToken;
            }
        } else {
            $this->setConfig($config);
        }
        $params = array(
            'client_id' => $this->appId,
            'client_secret' => $this->appSecret,
            'grant_type' => 'client_credentials',
        );
        if ($response = $this->apiRequest('/oauth/access_token', $params)) {
            if (is_array($response)) {
                $result = $response;
            } else {
                parse_str($response, $result);
            }
            if (!empty($result['access_token'])) {
                $this->setAccessToken($result['access_token']);
            }
        }
        $this->accessToken = "***********************";
        return $this->accessToken;
    }

Custom Facebook Feedで取得したトークンの有効期限は無期限になっているので、1度手を加えればAPIの変更がない限り永続して使えるかと思います。今回、プラグインのアクセストークンを取得する部分を改修しようと思いましたが、なかなか面倒くさく、この簡単な方法で対応しております。
一応、他のサイトを参考にしながら無期限のアクセストークンを取得するプログラムを作ってみたので参考に置いておきます。

有効期限の確認はアクセストークンデバッガーをお使いください。

<?php
session_start();
$client_id = "**************"; // 【client_id】
$client_secret = "****************"; // 【client_secret】
$redirect_uri = "***************"; // 【redirect_uri】

$code = $_REQUEST['code'];
$error = $_REQUEST['error'];
$error_reason = $_REQUEST['error_reason'];
$error_description = $_REQUEST['error_description'];

if (empty($code) && empty($error)) {

    // Facebook認証後のリダイレクトによるアクセスではない場合
    // (= GETパラメータに "code" または "error" がない場合)
    
    // CSRF protection
    $_SESSION['state'] = md5(uniqid(rand(), TRUE));
        
    // Facebook認証に遷移
    // 例;
    // Facebook未ログインの場合 → Facebookログイン画面を表示
    // Facebookログイン済 + アプリを許可済の場合
    // → "redirect_uri" に指定したURLに、GETパラメータ "code" 付きで
    // リダイレクトされる
    header('Location: https://graph.facebook.com/oauth/authorize'
                   . '?client_id=' . $client_id
                   . '&redirect_uri=' . urlencode($redirect_uri)
                   . '&scope=publish_pages,public_profile'
                   . '&display=popup'
                   . '&state=' . $_SESSION['state']);
} else {
    
    // Facebook認証後のリダイレクトによるアクセスの場合
    
    if (!empty($code)) {
        
        // Facebook認証成功の場合
        
        // "redirect_uri" に指定したURLに、
        // GETパラメータ "code" が付加されてリダイレクトされる
        if($_REQUEST['state'] == $_SESSION['state']) { // CSRF protection
            
            // アクセストークン取得用のURL生成
            $token_url = 'https://graph.facebook.com/oauth/access_token' 
                       . '?client_id=' . $client_id
                       . '&redirect_uri=' . urlencode($redirect_uri) 
                       . '&client_secret=' . $client_secret 
                       . '&code=' . $code;
            
            // アクセストークン取得 - [短い 有効期限]
            $ch = curl_init();
            curl_setopt($ch, CURLOPT_URL, $token_url);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
            $token = curl_exec($ch);
            
            // アクセストークンを表示
            //echo $token;
            $tk = json_decode($token);
            //echo $tk->{'access_token'};
            
            // アクセストークン取得用のURL生成
            $token_url = 'https://graph.facebook.com/oauth/access_token' 
                       . '?grant_type=fb_exchange_token'
                       . '&client_id=' . $client_id
                       . '&redirect_uri=' . urlencode($redirect_uri) 
                       . '&client_secret=' . $client_secret 
                       . '&code=' . $code
                       . '&fb_exchange_token=' . $tk->{'access_token'};
            
            // アクセストークン取得 - [長い 有効期限]
            $ch = curl_init();
            curl_setopt($ch, CURLOPT_URL, $token_url);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
            $token = curl_exec($ch);
            $tk = json_decode($token);
            echo $tk->{'access_token'};

            $token_url = "https://graph.facebook.com/v3.1/me/accounts?access_token=".$tk->{'access_token'};
            
            // アクセストークン取得 - [無期限 有効期限]
            $ch = curl_init();
            curl_setopt($ch, CURLOPT_URL, $token_url);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
            $token = curl_exec($ch);
            $tk = json_decode($token["data"]);

            // アクセストークンを表示
            echo $tk->{'access_token'};
        }
        
    } else if (!empty($error)) {
        
        // アクセス拒否の場合
        
        // Facebookアプリのインストール / 権限許可の画面で
        // "キャンセル" ボタンを押す等した場合、
        // "redirect_uri" に指定したURLにGETパラメータ 
        // "error" "error_reason" "error_description"
        // が付加されてリダイレクトされる
        echo 'error:' . $error 
          . '/error_reason:' . $error_reason 
          . '/error_description:' . $error_description;
    }
}

?>

参考サイト:Facebook API ページの無期限 Access Token 取得方法
参考サイト:アクセストークンを取得する (User Login Server-side Flow)

viva