このエントリーをはてなブックマークに追加

更新日: 2016年2月25日

実行時間: 0.0216

CI_Trackback

 「CI_Trackback」ライブラリクラスは、ブログの機能の一つであるトラックバックの送信と 受信を行うための機能を提供しています。

 トラックバックとは、他の人のブログ記事を参照し、その記事と関連する内容を自分のブログに掲載したことを 相手に通知する機能です。

 この「通知」する行為を「トラックバック送信」または、「トラックバックPing送信」と言います。
 また、トラックバックを受け取る行為を「トラックバック受信」「トラックバックPing受信」と言います。

 トラックバックPing受信した側は、送られたPingデータをデータベースに保存する等の処理を行い、
自分のブログ記事上に表示します。

 しかし、「トラックバックスパム」などの問題もあるため、受信側は、受け付けたトラックバックデータを
自動で全て記事に表示せず、 受け付けたトラックバックは管理者が許可したものだけを表示する、
または、トラックバックの送信そのものを制限する等の処理が必要かもしれません。
 このあたりはブログシステムを開発する側のポリシーに次第ですので、必要な機能を開発してください。

CI_Trackbackクラスのロード

 「 CI_Loader 」クラスの「 library() 」メソッドでロードします。
 トラックバックには、大きく分けて「送信」と「受信」の機能がありますが、どちらも以下の方法で ライブラリクラスをロードしてからこれらの機能を利用します。

    $this->load->library('trackback');

トラックバック Ping 送信

送信データ

 トラックバックで送信できるデータは下記の5つがあります。

キー 説明 必須
url 自分のブログ記事のURL
title 自分のブログ記事のタイトル
excert 自分のブログ記事内容
(最大50byteまでの文字が送信されます。)
blog_name 自分のブログの名前
charset 送信するデータの文字コード
デフォルトはUTR-8です。
×

send($tb_data)

 トラックバックPing送信を行います。

 引数に、トラックバック送信データと相手のブログ記事の「トラックバック Ping URL」を連想配列
で指定します。

「トラックバック Ping URL」はブログ記事のURLではありません。
通常、トラックバックを受け付けているブログサイトでは、ブログ記事の下部などに
「トラックバックURL」として記載されています。

    $this->load->library('trackback');
    
    $tb_data = array(
        'ping_url' => 'http://reffere.blog.site/hoge/foo/9876',
        'url' => 'http://my.blog.site/mypage/20120923/',
        'title' => '9月23日の出来事',
        'excerpt' => 'あんなことやこんなこと',
        'blog_name' => 'わたしのブログ',
        'charset' => $this->config->item('charset')
    );
    
    if ($this->trackback->send($tb_data)) {
        // 成功時の処理
    }
    else {
        // 失敗時の処理
    }
    

display_errors($open = '<p>', $close = '</p>')

 トラックバックPing送信に失敗した場合、エラーメッセージを返します。

 第一引数には、エラーメッセージの前に付加するHTML開始タグ、 第二引数には、HTML閉じタグを指定することができます。
 デフォルトは、「<p>」「</p>」タグです。

    if (! $this->trackback->send($tb_data)) {
        $error_message = $this->trackback->display_errors('', '');
    }
    
    • The send() method must be passed an array
      • send()メソッドに配列以外のデータが渡された
    • Required item missing: 項目キー
      • send()メソッドに指定されたPingデータに必須のデータ項目がない
    • Invalid Connection: Ping URL
      • 通信接続エラー
    • An unknown error was encountered
      • 通信接続は成功したがエラーメッセージがない
    • 相手がレスポンスしたエラーメッセージ

トラックバック Ping 受信

トラックバック受信 コントローラ

 「トラックバック Ping 送信」を受け付けるには、トラックバック Ping 受信を行うコントローラクラスを 用意する必要があります。

 また、トラックバックを受信する際に、どのブログ記事に対するトラックバックなのか識別するための
ブログ記事IDを指定してもらう必要があります。

 以下の例では、コントローラ名を「tb」、アクションメソッド名を「receive」、そして、URIの第三セグメントに 「ブログ記事ID」を指定されることを想定しています。

    • トラックバックURL
    http://your.site/tb/receive/12345/
    • トラックバック受信コントローラ
    class Tb extends CI_Controller {
    
        public function receive($tb_id=NULL)
        {
            // Blog IDが無い場合はエラーを返します
            if (empty($tb_id)) {
                $error_msg = 'Blog ID is required.';
                $this->trackback->send_error($error_msg);
            }
    
            // トラックバック受信処理
        }
    }
    

receive()

 「receive()」メソッドにより、トラックバックに必要なデータが送られているかのチェックが行われ、 適宜、マルチバイト文字列を内部文字コードにエンコードして、「trackback」インスタンス変数に記憶します。

    $this->load->library('trackback');
    $this->load->model('blog_model');
    
    $this->output->set_content_type('application/xml');
    
    if ( ! $this->trackback->receive()) {
        // 受信失敗時の処理
        $error_msg = $this->trackback->display_errors('', '');
        $this->trackback->send_error($error_msg);
        // send_error()内で「exit」されるため、この後の処理は実行されません。
    }
    
    // 受信成功時の処理
    $tb_data = array(
        'url' => $this->trackback->data('url');
        'title' => $this->trackback->data('title');
        'blog_name' => $this->trackback->data('blog_name');
        'excerpt' => $this->trackback->data('excerpt');
    );
    
    // モデルクラス等でデータを処理します。
    if ($this->blog_model->set_tb($tb_data)) {
        $this->trackback->send_success();
    }
    else {
        $error_msg = $this->blog_model->error_msg();
        $this->trackback->send_error($error_msg);
    }
    
    // この後の処理は実行されません。
    

data($item)

 トラックバックデータを受信すると、データは「trackback」インスタンス変数に記憶されていますので、 「data()」メソッドからデータを取得することができます。

 引数に、取得したいデータのキーを指定します。 取得できるデータは、以下の5つです。

キー 説明
url 相手(Ping送信者)のブログ記事のURL
title 相手(Ping送信者)のブログ記事のタイトル
excert 相手(Ping送信者)のブログ記事内容
(最大50byteまでの文字が受信されます。)
blog_name 相手(Ping送信者)のブログの名前
charset 送信されたデータの文字コード
    $this->trackback->data('url');
    $this->trackback->data('title');
    $this->trackback->data('blog_name');
    $this->trackback->data('excerpt');
    $this->trackback->data('charset');
    

レスポンス

 トラックバックデータの処理が正常に終了したら、成功のレスポンスを出力し、 エラーが発生した場合は、失敗のレスポンスを出力する必要があります。

 成功レスポンス、失敗レスポンス共に、レスポンスを出力した直後に「exit」がコールされるため、 レスポンスメソッド以降の処理は実行されないので注意してください。

 また、レスポンスメソッド実行前に、何らかの出力を行うと、トラックバックを送信した側が 正常にレスポンスを受信できないので、レスポンスメソッド以外の出力は行わないようにしてください。


send_success()

 成功レスポンスを出力します。

    $this->trackback->send_success();
    
    // この後の処理は実行されません。
    

send_error($message = 'Incomplete Information')

 失敗レスポンスを出力します。
 引数にエラーメッセージを指定することができます。

    $error_msg = $this->trackback->display_errors('', '');
    $this->trackback->send_error($error_msg);
    
    // この後の処理は実行されません。