PHPでBloggerにカテゴリを設定する方法

Blogger API+Zend GData APIでラベル/タグ付き記事を投稿する

この記事は次のブログに引っ越しました。

Blogger API+Zend GData APIでラベル/タグ付き記事を投稿する 13:39 Blogger API+Zend GData APIでラベル/タグ付き記事を投稿するを含むブックマーク CommentsAdd Star PHPGoogleBlogger(Blogspot)に記事を投稿する場合、ZendのGoogleDataAPIが便利なのですが、記事にラベルやタグといったカテゴリーを付けて投稿する事ができます。ルーク、ソースを読みたいのって人はこちら 仕組み的には、BloggerAPIにXMLフィードをポストする際に、カテゴリ情報を下記形式で添えて渡さないといけません。 category scheme="http://www.blogger.com/atom/ns#" term="Label1" / category scheme="http://www.blogger.com/atom/ns#" term="Label2" / つまり、term属性(term attribute)に値をセットしているわけです。 では、具体的にZend_GDataを使ってどのようにセットするかと言うと、記事のエントリー(投稿)用のオブジェクトに"setCategory"メソッドを使ってカテゴリー名やラベル名などの配列を渡します。 ?php $uri = 'http://www.blogger.com/feeds/' . $blogID . '/posts/default'; $entry = $gdClient- newEntry(); $entry- setCategory( array($label1, $label2) ); // ←ここでカテゴリやラベルをセット $createdPost = $gdClient- insertEntry($entry, $uri); ? 上記でカテゴリをセットしている(配列でラベル・データを渡している)ところでの注意点ですが、これは文字列の配列ではなくオブジェクトの配列を渡します。つまり、上記の"$label1"と"$label2"はオブジェクトなのです。 具体的には"Zend_Gdata_App_Extension_Category"クラスを使って作ったオフジェクトを配列にセットしたものを渡します。 ?php function createPublishedPost($oGdClient){ //ポストする情報 $sTitle = 'Hello, world!'; $sContent = 'I am blogging on the internet.'); $sBlogID = 'Set your blogID here'; //ポスト先のBloggerAPIのURL $sUri = 'http://www.blogger.com/feeds/' . $sBlogID . '/posts/default'; //エントリー用オブジェクトの生成(ポストする記事の投稿用オブジェクトを作成します) $oEntry = $oGdClient - newEntry(); //エントリー用オブジェクトに記事のデータをセット $oEntry - title = $oGdClient- newTitle($sTitle); $oEntry - content = $oGdClient- newContent($sContent); $oEntry - content - setType('text'); /* 【今回のポイント】ポスト情報のカテゴリー設定 */ $oLabel1 = new Zend_Gdata_App_Extension_Category( 'カテゴリ1', 'http://www.blogger.com/atom/ns#'); $oLabel2 = new Zend_Gdata_App_Extension_Category( 'カテゴリラ', 'http://www.blogger.com/atom/ns#'); $oEntry- setCategory( array($oLabel1, $oLabel2)); //ポストする情報入りのエントリー用オブジェクトを投稿 $oCreatedPost = $oGdClient- insertEntry($entry, $uri); //投稿後に割り当てられる記事IDの取得 $aTextID = split('-', $oCreatedPost- id- text); $sNewPostID = $aTextID[2]; //取りあえず記事IDを返す return $sNewPostID; } BloggerAPIのデベロッパーガイドにある、Zend Google Data APIのクライアント・ライブラリを使ったチュートリアルには明記されていないので分かりづらいのですが、これによりBloggerAPIに渡すXMLフィードにある"category"エレメントの属性(Attribute)にカテゴリ情報をセットしてくれます。 ※参考資料:"Labeling Blogger Posts" - Google Data API Tips 【所感】 なぜ、Blogger側のインターフェースを使わずに、わざわざPHPを使うのかと言うと、報告書、申請書、カタログなど、フォーマットの決まったレイアウトを投稿する場合、BloggerのインターフェースではTooMuchなケースがあるためです。 もちろん、Google Spreadsheetsにデータを入れてもらい、読み込んだものをSmartyなどでレイアウトして表示させる方法もあります。Excel感覚だけでレポートを作成できるので便利です。 しかし、レポートを「入力する人」「チェックする人」「修正する人」の事を考えると、いくつかの問題が出てしまいます。 最初の問題は、セキュリティの実装で、できればGoogleAppsの許可されたアカウントの人だけ利用できるようにしたいという事。 次に、Spreadsheetでは、セキュリティは確保できても、1行1データとして、項目(カラム)が200項目以上ある場合、Standard版の仕様的な限界で使えないだけでなく、横長になるためか、入力時に操作上のヒューマン・エラー(ポカ)が発生する事がわかりました。 そこで、もともと独自ドメインGoogleApps)のBloggerを非公開に設定し、限られた人にだけメンテナンス・レポートを閲覧/編集する環境(習慣)があるので、BloggerをDB替わりに使って、可逆可能な方法を模索しようかとBloggerに戻ってきたわけです。 ■主な流れ フォームからデータを受け取る XHTMLテンプレートにSmartyでデータを流し込む(各タグにはIDを付ける) 流し込んだものを記事として投稿 表示(閲覧)時は、CSSでレイアウトを極力整える データの編集の際には、simpleXMLなどを使ってデータとして復元 編集フォームにデータを流しこむ(1に戻る) デメリットとしては、GoogleDocsのように変更履歴(修正履歴)が見れたり、バージョンバックなど版を管理することができない点でしょうか。 ■PHP+ZendData+Bloggerでカテゴリ付投稿 ?php /* ----------------------------------------------------- Blogger新規投稿用関数 -----------------------------------------------------*/ function fPostBlogger($sUserID,$sPassword,$sTitle,$sContent,$sBlogID, $aTags=array()){ if(!Class_exists('Zend_Loader')){ require_once 'Zend/Loader.php'; Zend_Loader::loadClass('Zend_Gdata'); Zend_Loader::loadClass('Zend_Gdata_Query'); Zend_Loader::loadClass('Zend_Gdata_ClientLogin'); } $sService = 'blogger'; $oClient = Zend_Gdata_ClientLogin::getHttpClient( $sUserID, $sPassword, $sService, null, Zend_Gdata_ClientLogin::DEFAULT_SOURCE, null, null, Zend_Gdata_ClientLogin::CLIENTLOGIN_URI, 'GOOGLE' ); $oGdClient = new Zend_Gdata($oClient); /* ポスト先のBloggerAPIのURL */ $sUri = 'http://www.blogger.com/feeds/' . $sBlogID . '/posts/default'; /* エントリー用オブジェクトの生成(ポストする記事の投稿用オブジェクトを作成します) */ $oEntry = $oGdClient - newEntry(); /* エントリー用オブジェクトに記事のデータをセット */ $oEntry - title = $oGdClient- newTitle($sTitle); $oEntry - content = $oGdClient- newContent($sContent); $oEntry - content - setType('text'); /* エントリーのカテゴリー設定 */ foreach($aTags as $sTag){ if(!Is_Array($sTag)){ $aCategoryObject[] = new Zend_Gdata_App_Extension_Category( $sTag , 'http://www.blogger.com/atom/ns#'); } } $oEntry- setCategory( $aCategoryObject); /* ポストする情報入りのエントリー用オブジェクトを投稿 */ $oCreatedPost = $oGdClient- insertEntry($oEntry, $sUri); /* 投稿後に割り当てられる記事IDの取得 */ $aTextID = split('-', $oCreatedPost- id- text); $sNewPostID = $aTextID[2]; /* 取りあえず記事IDを返す */ return $sNewPostID; }