WordPressのpost_idが記事・画像以外で勝手に増える原因

WordPressのパーマリンクはシンプルに%post_id%で設定している。

この数字が勝手に増えてDBが圧迫されるのは、初期設定のリビジョン・自動保存が理由とわかった。それらをオフにしても、なぜか記事IDが勝手に10くらい飛んだりする。記事と同じくアップロードした画像にもIDが割り振られることは把握しており、これも原因でない。

犯人はcustomize_changeset

wp_postsの中身を調べると、どうやらテーマをカスタマイズして更新するごとに、IDが増えて追加される仕組みになっているようだ。テーマ内テキストを変更したり、faviconの画像を更新したりといった、ちょっとした動作でも記録されてしまう。

見分け方としては、テーブルのpost_typeがcustomize_changesetになっている。post_statusはtrash。これはWordPress4.7のバージョンから追加された機能らしい。

customize_changeset

「テーマ編集中のプレビュー中に状態保持する」ことが目的らしいが、メリットは微々たるものだ。そのせいで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を手打ちすることはめったにないので、短いドメイン名やパーマリンクにこだわる必要はない。変な短縮名を使って後から混乱するよりは、多少長くて冗長でもわかりやすい英単語を連ねた方がいいと思う。プログラミングの変数・関数命名でも、その方が保守性は上がる。

パーマリンクのpost_id設定

せいぜい数千~数万の範囲でIDが繰り上がるだけなら、細かいことは気にしないのが得策だ。あくまで自己満足とわかっていても、ついつい文字列の短さやデータの小ささにこだわってしまうのは、ミニマリストの病だと思う。