アーカイブリストからtwilogを除外したい(MTEntriesで特定カテゴリの記事を除外する)

blogをあまり書いていないので、それならtwitterのstatusをブログにしてしまおうと、
twitterの一日分のstatusを取得して、XMLRPCでMovable Typeにpostするということをしていました。(twitterのブログなのでtwilogと読んでます)
しかし、blogをたまに書いたときに記事がtwilogに埋もれてしまうという反面がありました。

そこで最新の記事リストからtwilogを除外しようと思いました。最初は記事のタイトルで”twilog”を含んでいたら除外・・ということを考えていたのですが、twilogをカテゴリに入れて該当カテゴリを除外、としたほうが汎用性があるかなと思いました。

残念ながら、twilogは今までカテゴリに入れていなかったので、手順としては。

・twilogカテゴリを作成する
・twilogエントリのpost時にカテゴリを指定する
・過去のtwilogエントリをtwilogに移動する
・記事リストでtwilogカテゴリを除外
というようになります。

カテゴリは普通にMTにログインして作成しました。次にtwilogのポストでカテゴリの指定する方法ですが、metaWeblog.newPostの仕様を見ても、mt/lib/XMLRPCServer.pmを見てもカテゴリの指定ができそうにありません。タグは追加できそうな雰囲気なのに・・・
結局のところmetaWeblog.newPostを呼んでから、mt.setPostCategoriesを呼ぶことにしました。

一部コード抜粋です。phpでPEARのXML/RPC.phpを使っています。

function mt_post_entry($title, $description, $categoryid, $publish)
{
  $xtitle   = new XML_RPC_Value($title, 'string');
  $xdesc    = new XML_RPC_Value($description, 'string');
  $xpublish   = new XML_RPC_Value($publish, 'boolean');
  $xcontent   = new XML_RPC_Value(array("title"=>$xtitle,"description"=>$xdesc), 'struct');
  $postdata   = array($this->xblogid,$this->xuser,$this->xpass,$xcontent,$xpublish);
  $xmsg   = new XML_RPC_Message('metaWeblog.newPost',$postdata);
  $postid   = $this->xclient->send($xmsg);
  $fcode    = $postid->faultCode();
  if ($fcode==0 && $categoryid != null) {
    $xcat = new XML_RPC_Value(array("categoryId"=>new XML_RPC_Value($categoryid,'string'),"isPrimary"=>new XML_RPC_Value(1,'boolean')),'struct');
    $xcats = new XML_RPC_Value(array($xcat),'array');
    $porstdata = array($postid->value(),$this->xuser,$this->xpass,$xcats);
    $xmsg = new XML_RPC_Message('mt.setPostCategories', $porstdata);
    $result = $this->xclient->send($xmsg);
  }
  if ($fcode==0 && $publish) {
    $porstdata = array($postid->value(),$this->xuser,$this->xpass);
    $xmsg = new XML_RPC_Message('mt.publishPost', $porstdata);
    $result = $this->xclient->send($xmsg);
  }
  return ($fcode != 0);
}

もうtwilogポスト用なのでかなり割り切ったコードです。あらかじめcategoryidもわかっていることにしてます。

次に過去のtwilogエントリのカテゴリ移動ですが、70件以上あってこれを手動でやるのは面倒なのでSQLを実行。。。

INSERT mt_placement (placement_blog_id,placement_category_id,placement_entry_id,placement_is_primary)
SELECT 1 AS placement_blog_id, 16 AS placement_category_id,  entry_id AS placement_entry_id, 1 AS placement_is_primary
FROM mt_entry WHERE entry_title LIKE '%twilog%'
;

これでtwilogエントリはカテゴリに入りました。あとは記事リストからこのカテゴリのエントリを除外するのみです。

MTEntriesには仕様を見る限り、カテゴリを除外するよな引数は残念ながらないようでした。それならば追加するか、とmt/lib/MT/Template/ContextHandlers.pmを眺めていたところ、、どうもNOTが使えそうな雰囲気です。

そこで試しに

<MTEntries lastn="10" category="NOT twilog">

としてみたら・・・
なんと”twilog”カテゴリが除外されました。素晴らしい。仕様書にはORのみ。って書いてあったのですがNOTも使えるようです。