WP-XML-RPCLIB Archive
WordPressではpost_idをパーマリンクの中に入れておくと、移転時にpost_idがずれたときにパーマリンクが切れてしまうという問題があるらしいです。idがずれるとか、そんなバカな話があるか!とも思いますが、致し方ないので対応策を考えてみました。
結論から言うとまだ上手くいっていないのですが、とりあえず何を試してどこで躓いているかを記したいと思います。
まずよく言われるのが、パーマリンクをpost_nameで指定するという方法。でもこれでは記事のタイトルを後で変更したときに、タイトルとスラッグに不一致が出てしまい、個人的に好きじゃありません。一度エントリをあげてからよく手直しをする自分としては嬉しくなく、数字のIDが使いたいのです。そこで他の方法を探してみました。で参考になったのは池田百合子さんによる以下のページへのコメント欄。
「過去記事の post_name として post_id を指定すれば単純に解決」
WordPress のパーマリンク設定を変更 | Numb.
なるほど~。投稿スラッグにpost_idを入れればいいのか!過去記事に対して投稿スラッグにpost_idを指定するバッチ処理をした上で、投稿時に投稿スラッグにpost_idを設定するWordPressのプラグインを作っておくというやり方が良いかもしれないですね。
そこでまずバッチ処理用のコンソールアプリを作成。WordPressのXML-RPC APIを利用して全てのエントリのスラッグをidで上書きします。SQL文でも出来るような気もしますが、せっかく作ったライブラリを使ってみます。
※実行には.Net Framework 3.5 SP1がインストールされている必要があります。
SharpLab.WP-PostSlugRewriter.zip
ソースコード:SharpLab.WP-PostSlugRewriter.sln.zip
実行するに当たっては、前もって必ずBlogのデータのバックアップを取っておいてください。万が一データが破損した場合でも責任は負えません。また、このコンソールアプリでは既に設定されている投稿スラッグも構わず上書きします。あえて残しておきたいスラッグがある場合は(特にページ)、メモしておいて後で直してください。
続いて作りたるは投稿時にスラッグを書き換えるWordPressのプラグイン。フィルタするだけなので簡単お手軽。
中身はこの通り。
<?php
/*
Plugin Name:wp-idslug
Plugin URI:http://www.sharplab.net/
Description:新規エントリの投稿時にエントリのスラッグにidをセットします。
Author:shiroica
Version:1.00
Author URI:http://blog.sharplab.net/
*/
function sharplab_wpidslug_rewriteNewPost($id){
$currentState = get_post($id);
if($currentState->post_name != $currentState->ID){
$post = array();
$post['ID'] = $currentState->ID;
$post['post_name'] = $currentState->ID;
wp_update_post($post);
}
}
add_filter('save_post','sharplab_wpidslug_rewriteNewPost')
?>
これをWordPressのプラグインフォルダに放り込んでおいた上で、有効化しておきます。これで、全ての記事のスラッグにidが入るようになりました。そこでパーマリンク設定を変更します。
post_idになっているものを
/%category%/%post_id%/
postnameに。
/%category%/%postname%/
postnameにはpost_idが入っているはずなので、これで上手くいくはず…なのですが、なぜか上手くいきません。上手く表示されるページもあるのですが、ページによっては404 Not Foundが返されるのですね。
しかし、年月とpostnameによるパーマリンクでは、(パーマリンクは変わりますが)上手く表示されるという…。
/%year%/%monthnum%/%postname%/
どなたか解決策が分かる方いらっしゃいませんでしょうか…。
今日はWordCamp Tokyoですね。自分も参加していて、WordPressの開発者、Matt Mullenwegによる基調講演を聴き終わり、今昼飯を食べながらMattへの質問を考えているところです。いや~P2(WordPress Prologue)は初めて知ったのですが、WordPressをtwitterクローンに出来るWPテーマだそうで、結構期待したいですね。
さて、WordPressといえば前にWordPressのXML-RPC APIを叩くための.netのライブラリを作ったものの、呼び出しの書き難い状態のままで放置していて、まずい状態だなぁということで、一念奮起して一から書き直してみました。今度はLINQ to XMLを使って書き直し。前のに比べたらソースコードもすっきりして、使いやすく、またメンテし易くなったかと思います。(ただ、XML-RPCの値を表すクラスをバリューオブジェクトとして実装したのは設計としてちょっと失敗だったかもしれません。。。)
前のバージョンと同じく、XML-RPCを使うための汎用ライブラリと、それを利用して実装したWordPressのXML-RPC API操作用のライブラリ、及びそれらのCompact Framework版を用意しています。
APIを通じたBlog操作の自動化はなかなか面白いものですので、一度お試しいただければと思います。
WP-XML-RPCLib、バグフィックスのため差し替えました。原因はblogger系のXMLRPCメソッドに渡すべきパラメータをちゃんと把握していなかったため。例えばdeletePostメソッドですが、
/* blogger.deletePost ...deletes a post */
function blogger_deletePost($args) {
$this->escape($args);
$post_ID = (int) $args[1];
$user_login = $args[2];
$user_pass = $args[3];
$publish = $args[4];
上のxmlrpc.phpの抜粋を見てわかるように、使うパラメータのインデックスが1から始まっています。実は元々のbloggerのAPIでは0番目のパラメータとしてappkeyが入る仕様だったようですが、WordPressではそこは空ける仕様になっていました。
というわけでWP-XML-RPCLibをリリースしました。先日WordPress2.7β3がリリースされたなど、いよいよWP2.7も正式公開が見えてきており、それに合わせて公開した格好です。もともとは何かWP2.7の新機能を生かしたアプリを作ろうかと考えてComment APIのみを実装したCompact Framework用ライブラリを作っていたのですが、最近大学が忙しくなってきたりしたためアプリの方は今回は断念、そのかわり、ライブラリの方にWP2.7時点での全XMLRPCメソッドを実装し、今回の公開に繋げた次第です。.Net Framework 3.5ベースで記述していますが、少し書き直すだけで2.0でも動くでしょうし、そうすればMonoでも動くはずです。また、Compact Framework向けにプロジェクトを作り直したWP-XML-RPCCLibというライブラリも公開しています。
ところでWP-XML-RPCLibの中身は
- SharpLab.WP-XML-RPCLib
- SharpLab.XML-RPCLib
という二つのライブラリからなっており、SharpLab.XML-RPCLibの方は汎用的なXML-RPCクライアントライブラリとなっています。SharpLab.WP-XML-RPCLibの方はこれを利用する形で実装しているのですが、XML-RPC APIを使うWebサービスならば、同様にして実装することが可能な筈です。こちらもどうぞご利用ください。
追記
hiromasa.another :o)のhiromasaさんがMonoでのテストをしてくれました!
おー!おー!動いている!やっぱりMonoは凄いですねー。hiromasaさん有り難う御座いました。
What’s this?
This project is terminated. WP-XML-RPCLib2 is the successor project.