昔、ブログのURI設計について言及した時に、極力シンプルである(日時とか記事のキーワードとかを混ぜない)のが良いよねということを言いました。それ以来、「ドメイン名+投稿ID」というシンプルなURIで運営してきたんですけども、こういう投稿ID主体のURI設計にも少し気になる問題点がありました
これは大きく3つあって、
- 投稿IDは記事IDではないということ
- 公開順に投稿IDが振られるわけではない
- WordPressの引っ越し時にURIが変わってしまう可能性がある
です。
1つめは、記事以外にも、画像をフォームからアップロードしたりすると、それも1つの投稿IDとしてカウントされちゃう問題。純粋に記事1つ1つで割り振られるわけではないんですね。
2つめは、要するに記事の公開順ではなく、(下書きを含んだ)保存順に投稿IDが振られてしまう問題。つまり、記事を下書きして保存するとその時点で1つの投稿IDが振られるので、先に公開した記事の投稿IDが”150″なのに、綿密に下書きして後に出した記事の投稿IDが”15″とかになっちゃう。コレはひじょーに気持ち悪い。
また、サーバー移転の際にWordPressを引っ越す方法として、引っ越し元のWordpressの管理パネルから記事のエクスポートをして、引っ越し先のそれから記事のインポートをするという方法があると思うのですが、これをすると投稿IDが1から割り振り直されちゃうのですね。つまり、公開日付順に(以前の投稿IDと異なっている可能性のある)投稿IDを割り振られて、URIが変わってしまうのですね。これはイクない。
ということで、投稿IDでURIを設計するのは結構冒険ということになります。加えて、投稿IDはシステムと深く結びついているので安易にプラグインでいじることもできません。
ということで、投稿IDの代わりにそれと独立した記事IDとして投稿スラッグを使うことにしました。投稿スラッグは記事ごとにユーザーが自由に設定できる変数でURIに含めることもできます。
ということで僕は今までの記事の投稿IDと投稿スラッグを同じにした上で、パーマリンク構造を変更してみました。記事もそれほど多くなかったので全部手動で作業。
ただ、新たに記事を公開する時に、最新の記事の記事ID(=投稿スラッグ)を逐一確認してから投稿スラッグに記入するのは煩雑なので、javascriptで自動(半手動)で最新の投稿スラッグを取得できるようにしてみました。面倒なので、プラグイン形式にはしていませんが、気が向いたらパッケージ化してみようと思います。
以下は古い内容です
追加ファイル・コード内容
以下は、あくまで当方の環境のみですが動作を確認しているコードです。
$xml = simplexml_load_file("http://note.openvista.jp/feed/");
$url = explode("/", $xml->channel->item[0]->link);
$slug = $url[count($url)-2];
$slug++;
echo $slug;
<fieldset id="slugdiv" class="dbx-box">
<h3 id="t891f01" class="dbx-handle"> _e('Post Slug') </h3>
<div class="dbx-content"><input name="post_name" type="text" size="13" id="post_name" value=" echo attribute_escape( $post->post_name ); " />
++ <input value="AddID" onclick="loadText()" type="button">
</div>
</fieldset>do_action('admin_head');
?>
++ <script type="text/javascript" src="../wp-includes/js/addID.js"></script>
</head>そして、wp-includes/js/に以下のファイルを配置。
- ダウンロード
- AddID.js v.0.2 (2008/01/07)
ちなみに、このjavascriptファイルはサイトのRSSを取得して、最新のURLを取得後、記事IDをゲットしているので、URI構造によって一部を変更する必要があります。詳しくは当該ファイルを参照のこと。
というわけで、あんまり汎用性はないかもしれませんが以上です。
ちなみにこのネタは2ちゃんねる ブログ板のWordPress (ワードプレス) その3 PHP MySQL OSSスレ(852-856, 859-860, 864, 894)で質問をしたことです。
URI運用方針の変更により、現在はこうした運用はしておりません。
ですが、最近までWordPress 2.5で運用していましたやり方を書いておきます。
まず、以下のソースコードのうち設定の部分を自分の環境に合わせたら、latest-articles.phpとUTF-8で保存して、wp-adminフォルダ内に置いておきます(置く場所自体はどこでも良いのですが、一応例として)
// URLを設定
define(url, "http://note.openvista.jp/");
// パーマリンクのタイプを以下から番号で選択
define(type, 2);
/** パーマリンク設定
***
*** 1: http://www.example.jp/(ポストスラッグ)
*** 2: http://www.example.jp/(何かの文字)/(ポストスラッグ)
*** 3: http://www.example.jp/(何かの文字)/(何かの文字)/(ポストスラッグ)
***
*** 例:http://blog.example.com/year/month/post_slug
*** (この場合は3に該当)
***
***/
$xml = simplexml_load_file(url."feed/");
$esc1 = array("/", ".");
$esc2 = array("\/","\.");
$url = str_replace($esc1, $esc2, url);
$latest_url = (string) $xml->channel->item[0]->link;
switch (type){
case 1 : $subject = "/".$url."([^\/]+)\/?$/"; break;
case 2 : $subject = "/".$url."[^\/]+\/([^\/]+)\/?$/"; break;
case 3 : $subject = "/".$url."[^\/]+\/[^\/]+\/([^\/]+)\/?$/"; break;
default: exit("Requested URL type is invalid"); break;
}
if (preg_match($subject, $latest_url, $match)){
$slug = preg_replace("/\.(php|html)$/", "", $match[1]);
$slug++;
echo $slug;
}
次に、wp-admin/edit-form-advanced.phpの86行目あたりのdiv要素直後に以下のpタグで囲われた一文を挿入します。挿入する箇所にあるURLは変更しておいてくださいね。
<div class="inside">
<p><input value="ID追加" onclick="document.getElementById('new-post-slug').value = ' echo file_get_contents('http://note.openvista.jp/wp-includes/latest-articles.php'); ';" type="button" /></p>2つのファイルをアップロードすれば設定は終了です。ボタンを押せばIDを設定することが出来ます。
Popularity: 3% [?]
- キーワード:



読者のコメント
0件