パーマリンク問題・その後

昨日のパーマリンク問題ですが、応急処置はしたもののやっぱりスッキリしないので、解決策を考えました。

Step 1: パーマリンク設定を%post_name%を用いたものにする

これまでのフォーマットに近いプリセットの2つ目「日付と投稿名」を使います。すなわち

/%year%/%monthnum%/%day%/%post_name%/

と設定します。

Step 2: 既存の記事全てについて、スラッグに投稿日時の時分秒の6桁の数字を入力する

これにより、%post_name%%hour%%minute%%second%の出力結果が同じになりますので、Step 1のパーマリンク設定でもこれまでと同じURLにすることができました。

既存の記事についてはこれで完了ですが、今後追加する記事には問題があります。投稿スラッグは自分で入力しない場合にはタイトルが自動的に入力されてしまうからです。記事を書いている時点では投稿日時の時分秒を正確に知ることは出来ませんから、URLのフォーマットを既存の記事と合わせるためには、適当な6桁の数字を手入力しなければなりません。それはちょっと面倒です。

なので、投稿時に自動で6桁の数字をスラッグに入力してくれるシンプルなプラグインを作りました。数字としては%post_id%を用いて、6桁に整形します。これでスラッグの一意性も確保されるはずです。

Step 3: 下記のコードを用いたプラグインを作成し、インストール・有効化する

function postid_as_slug( $slug, $post_ID, $post_status, $post_type ) {
	if ( $post_type == 'post' ) {
		$slug = sprintf( "%06d", $post_ID );
	}
	return $slug;
}
add_filter( 'wp_unique_post_slug', 'postid_as_slug', 10, 4  );

このサイトの場合、実際には最初の1桁を3に固定し、残りの5桁に%post_id%を使うようにしてあります。既存の記事に使われている時分秒と確実に違う数字にしないといけないので。

当然ながらStep 2が一番時間のかかる作業でした。幸い今日は日曜日でしたので、1日かけてなんとか終わらせました。SQLを書けばもっと短時間で終わらせられたのでしょうが、間違ったSQLコマンドを流して予期しない結果になると大変なので全て手作業でやりました。もしかしたらタイプミスした投稿もあるかもしれませんが、少なくともブログ内でリンクされている記事は大丈夫のはずです。外部からリンクされた記事にミスがあったらごめんなさい。

WordPressの管理画面ではなくデータベース内のpost_nameの値を直接変更したので同じ時分秒を持つ投稿があったとしても正しく設定することができましたが(管理画面から編集すると既存のものと同じスラッグを設定しようとすると末尾に「-1」などの文字が追加されてしまう)、もしかしたらそれに伴う動作の不具合があるかもしれません。見つけたらその時に修正することにします。

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください