C# で XML-RPC を使用した WordPress 投稿を試してみたのでその備忘録。
.NET用ライブラリ
調べてみると既にライブラリ化された DLL が公開されていた。
「商用プログラムでも使用」と自己紹介されているので有名なライブラリなのだろう。
ダウンロードページから安定版らしき xml-rpc.net.2.5.0.zip をダウンロード。
解凍して /bin/CookComputing.XmlRpcV2.dll を参照設定すれば使えるようになる。
(要 .NET Framework 2.0 以上)
WordPressで使用できるAPI
WordPressは何種類かのXML-RPC API対応しているようだ。
http://codex.wordpress.org/Category:Feeds
- Blogger API
- MetaWeblog API
- Movable Type API
- WordPress API
など。
折角なので今回はWordPress用の XML-RPC WordPress API を使ってみる。
インターフェイス定義
まず IXmlRpcProxy を継承して専用のインターフェイス(IWordpress)を定義する。
1 2 3 4 5 | public interface IWordpress : IXmlRpcProxy { [XmlRpcMethod( "wp.newPost" )] string newPost( int blog_id, string username, string password, WpContent content); } |
XmlRpcMethod はサーバーが対応する実際のメソッド名と思われる。
新しい記事を投稿するだけであれば上記 newPost の定義のみで可能。
構造体定義
インターフェイスで使用している構造体(WpContent)を定義。
1 2 3 4 5 6 7 8 | public struct WpContent { public string post_title; // タイトル public string post_content; // 本文 public XmlRpcStruct terms_names; // タクソノミー(分類) public string post_status; // 投稿状態 public DateTime post_date; // 公開日付 } |
XML-RPC WordPress API を参考。
使用したい要素のみの定義で問題ないようなので基本的な5つを定義してみた。
タクソノミー(terms_names)はカテゴリやタグなどの分類を”名前”で指定できる。
上では未定義だが似たような terms という要素は”名前”ではなく”ID”を指定する。
本来ならユニーク値である”ID”を使うのが正しいと思うが、あえて”名前”を使う理由は事前に作成しなくても未定義のカテゴリやタグを自動で作成してくれる為。
C# 以外の言語のライブラリだと連想配列を使用しているようだが、XML-RPC.NET の場合はXmlRpcStruct型を使用する。
使い方
実際に投稿するコンソールアプリケーションのソース。
アドレス「http://HOGE.com/」のワードプレスに新規記事をポストして記事IDを表示する。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | static void Main( string [] args) { IWordpress proxy = XmlRpcProxyGen.Create<IWordpress>(); WpContent content = new WpContent() { post_title = "記事のタイトル" , post_content = "記事の本文" , terms_names = new XmlRpcStruct(), post_status = "publish" , post_date = DateTime.Now, }; content.terms_names.Add( "category" , new string [] { "カテゴリ1" , "カテゴリ2" }); content.terms_names.Add( "post_tag" , new string [] { "タグ1" , "タグ2" }); string id = proxy.newPost(1, "username" , "password" , content); Console.Write(id); } |
以下、解説。
IWordpress のインスタンスは XmlRpcProxyGen.Create を使用して取得。
3 | IWordpress proxy = XmlRpcProxyGen.Create<IWordpress>(); |
URL は ワードプレスアドレス直下の xmlrpc.php を指定。
4 |
post_status は投稿状態を文字列で指定している。
11 | post_status = "publish" , |
- draft(下書き)
- publish(公開)
- future(予約投稿)
- pending(レビュー待ち?)
- private(非公開?)
等があるようだが、上3つ以外は未検証。
カテゴリ指定は terms_names に キー「category」で追加する。値は配列で指定。
カテゴリが存在しない場合は自動で作成され、スラッグ=名前になる。
14 | content.terms_names.Add( "category" , new string [] { "カテゴリ1" , "カテゴリ2" }); |
タグ指定は terms_names に キー「post_tag」で追加する。値は配列で指定。
タグが存在しない場合も自動で作成され、スラッグ=名前になる。
15 | content.terms_names.Add( "post_tag" , new string [] { "タグ1" , "タグ2" }); |
投稿自体の処理は次の部分。
17 | string id = proxy.newPost(1, "username" , "password" , content); |
第一引数のポストIDは通常「1」で問題ない。マルチサイトだと変化するのかも。
第二引数はワードプレスのユーザー名、第三引数はユーザーのパスワード。
第四引数は投稿内容で、戻り値は作成された投稿IDが返ってくる。
まとめ
XML-RPC.NET のおかげで非常に簡単に投稿できた。
(動作を確認にしたワードプレスのバージョンは4.0)
構造体の定義に不備があった場合でもエラーメッセージにそれらしい原因が表示されるので、ドキュメントを見ながら修正すればなんとかなる。
MetaWeblog API で未定義のカテゴリーを指定すると「未分類」になるのに対して、WordPress API は terms_names を使用することにより自動で作成される点も便利だ。
ただし、カテゴリー(タグ)名に一意性がない場合は、前述の terms 要素で ID を使用したほうが良いと思う。