WordPressのパーマリンクはシンプルに%post_id%で設定している。
この数字が勝手に増えてDBが圧迫されるのは、初期設定のリビジョン・自動保存が理由とわかった。それらをオフにしても、なぜか記事IDが勝手に10くらい飛んだりする。記事と同じくアップロードした画像にもIDが割り振られることは把握しており、これも原因でない。
犯人はcustomize_changeset
wp_postsの中身を調べると、どうやらテーマをカスタマイズして更新するごとに、IDが増えて追加される仕組みになっているようだ。テーマ内テキストを変更したり、faviconの画像を更新したりといった、ちょっとした動作でも記録されてしまう。
見分け方としては、テーブルのpost_typeがcustomize_changesetになっている。post_statusはtrash。これはWordPress4.7のバージョンから追加された機能らしい。
「テーマ編集中のプレビュー中に状態保持する」ことが目的らしいが、メリットは微々たるものだ。そのせいでDBの中でも重要なwp_postsにゴミのようなデータが溜まっていくとすると、お節介にしか思えない。
調べた限り、管理画面からこのオートセーブ的な機能をオフにする方法はない。DBを直接操作してクリーンアップすることはできると思うが、すでに投稿してしまった記事に影響が出ると困る。
とりあえずテーマを編集する際はこまめに「公開」せず、最後にまとめて保存すれば無駄なIDの増加を防げる。根本的な解決にはならないが、テーマのカスタマイズなどそれほど頻繁に行う作業でもないので、DBへの悪影響は少ないと思う。
post_idを使うメリット
そもそもの問題は、記事のパーマリンクをpost_idに設定しているせいだ。さらに「この数字を無駄に増やしたくない」という個人的な好みがあるせいで、勝手にインクリメントされると気持ち悪く感じてしまう。
本来はGoogleが推奨するとおり、%postname%など意味の通る英数字をパーマリンクに設定すべきなのだろう。最初はそうしていたが、以下の理由で途中から%post_id%に切り替えた。
postnameよりpost_idが良いと思う理由
- 記事ごとに固有のURL(スラッグ)を考えるのが面倒くさい
- 似たような記事を書いていると、うっかりスラッグがかぶってしまうことがある
※固有名2、固有名3…のように増分していくのも気持ち悪いし、変な接尾辞も追加したくない(URLがどんどん長くなってしまう) - post_idで表現される最小限の数字に比べると、文字列が冗長
- スラッグの命名規則を途中で変えたくなる恐れがある(アンダーバーをハイフンにするなど)
ミニマリスト的な趣味としては、記事は単純にpost_idで管理して、スラッグも付けない方が好ましい。名前ひとつで識別は間に合うのに、余計な芸名やニックネームを与えるようなものだ。将来的に呼び名が混乱して、トラブルの原因になりそうな予感がする。
post_idを使うデメリット
一方でpost_idを使うデメリットとしては、URLが意味のない数字の羅列になるため、SEOで不利になるおそれがある。これは明確なルールというより、Googleがやんわり指摘しているだけなので、どこまで検索順位に影響するかはわからない(以前、postnameからpost_idに変えても目に見えてアクセス数は減らなかった)。
また、パーマリンクの設定をpostname(スラッグ名)からpost_idに変更すると自動的にリダイレクトがかかるが、逆の場合は動作しない(URLでIDを指定してもNot Foundになる)。
そのため、判断に迷うならとりあえずpostnameで設定しておいた方が、のちのち潰しがきく。post_idから他に変更する場合は、記事ごとに手動でリダイレクト設定する手間が生じてしまう。すでに何百記事もあるとおっくうだ。
記事IDなど気にしないのがベター
結局のところpost_idには画像もカウントされるので、記事IDを連続的に増分していくことは難しい。
将来的に嫌なのは、IDの桁数が増えてパーマリンクが1文字ずつ長くなってしまうことだ。ただし、今のペースで記事を追加していくなら、たとえ30年経ってもIDが10万の桁に届くことはないだろう。その頃にはもう更新をやめているか、WordPress自体が時代遅れになっている可能性の方が高い。
今はURLを手打ちすることはめったにないので、短いドメイン名やパーマリンクにこだわる必要はない。変な短縮名を使って後から混乱するよりは、多少長くて冗長でもわかりやすい英単語を連ねた方がいいと思う。プログラミングの変数・関数命名でも、その方が保守性は上がる。
せいぜい数千~数万の範囲でIDが繰り上がるだけなら、細かいことは気にしないのが得策だ。あくまで自己満足とわかっていても、ついつい文字列の短さやデータの小ささにこだわってしまうのは、ミニマリストの病だと思う。