WordPressのスラッグに-2が付く原因|犯人はゴミ箱

朝いちで公開したブログ記事のアドレスを開いたら、末尾に見覚えのない文字が2つ付いとりました。「-2」です。自分で付けた覚えはありません。

WordPressは、指定したスラッグ(記事URLの末尾に入る英語の名前のこと)が他とかぶっとる時に、末尾へ「-2」から始まる連番を勝手に足します。かぶり相手は、いま公開されとる記事だけやありません。ゴミ箱に残っとる記事や、アップロードした画像も名前を握ったままのことがあります。だから「同じ名前の記事なんか無いはずやのに」という時ほど付きます。

公開したはずのURLに、余計な文字が2つ付いとった

記事は指定した時刻に自動で公開されるようにしてます。その日も時間どおりに出て、中身も正しい。ページも普通に開きました。

違ったのはアドレスだけです。自分が指定したのは英語の短い名前。実際に割り当てられとったのは、その後ろに「-2」が付いたものでした。

これ、読んどる側からは気づけません。記事は開くし、中身も崩れてへん。エラーも出ません。書いた本人がアドレス欄か編集画面のスラッグ欄を見に行かん限り、何も起きてへんのと同じ顔をしとります。

WordPressが「-2」を付ける条件

公開中の記事・ゴミ箱の記事・メディアの画像がblog-postというスラッグを取り合う図
公開記事もゴミ箱も同じスラッグを取り合う

WordPressは記事を保存する時に「この名前、もう誰か使うてへんか」を調べます。使われとったら末尾に2を足して、空いてる名前が見つかるまで数字を増やしていきます。だから最初に付くのは必ず「-2」で、それも埋まっとったら「-3」になる。公式の関数リファレンスにも、2から始めて1つずつ増やすと書いてあります。

問題は、調べる相手が思ったより広いことです。

  • 画像やPDFも相手になる。メディアにアップしたファイルは、記事と同じ土俵で名前の取り合いをします
  • 下書きと「レビュー待ち」は数えられん。公開前のこの2つは重複の判定そのものが走らんので、編集画面に出とる名前は当てになりません
  • 固定ページだけは同じ親の下でだけ。階層があるぶん、判定の範囲が狭くなります

下書きのうちは判定が走らん、というのがなかなか厄介です。編集画面では自分が指定したとおりの名前が表示されとる。公開ボタンを押した瞬間に、後ろへ数字が足される。だから「下書きで確認したから大丈夫」は成り立ちません。

犯人はゴミ箱の中におった

自分の場合は、同じ名前の古い記事がゴミ箱に入っとりました。前に消したつもりでおったやつです。

ゴミ箱は「消した場所」やなくて「まだ置いてある場所」。記事の本体が残っとるということは、名前も持ったままということです。完全に削除して初めて、その名前が空きます。同じ症状の相談は公式のサポートフォーラムにもいくつも並んどって、ゴミ箱を空にしたら直った、という報告が目につきます。

ここでもうひとつ厄介なのが、あとから古い方を完全に削除しても、先に付いてしもた「-2」は自動では戻らんことです。番号は新しい記事のスラッグとして保存済みなので、名前が空いたところで勝手に元へ戻ったりはしません。編集画面で手で書き直すしかない。

つまり気づくのが遅れるほど、直す時に外への影響を考えなあかん形になります。

ページが開くことと、URLが正しいことは別

気づけたのは、正直に言うと偶然でした。公開できたか確かめた時に、いつもと違う返事が返ってきたんです。中身は「ここやないで、こっちに移ったで」という意味の合図でした。自分が指定した名前で開こうとして、実際の名前へ回されとったわけです。

ページは開く。中身も正しい。だから「繋がっとるしええか」で閉じてたら、そのまま気づかんかったと思います。実際その日は、告知に載せた分も含めて、外に出しとったリンクが全部その回り道を通っとりました。読者から見たら普通に読めるので、誰も教えてくれません。

開けたかどうかやなくて、どこに着いたかまで見る。今回いちばん身に染みたのはそこでした。

同じことを起こさんために見るところ

記事を公開する前に全部の状態を探し、公開後に名前を照合する流れを示した図
公開前に既存のURLを確認しておくと安心

手で記事を書いとる人なら、やることは1つだけです。公開ボタンを押したあとに、アドレス欄をもう1回見る。それだけで今回の事故は防げました。下書きの時に見た名前は当てにならんので、押したあとに見るのが肝心です。

自分みたいに自動で公開しとる場合は、確認を二段にしました。

一段目は、出す前に全部の状態を探すこと。公開中だけやなく、予約・下書き・レビュー待ち・非公開・ゴミ箱まで含めて同じ名前を探して、誰かが持っとったら止める。下書きは今の時点では名前を持ってへんけど、先に公開された瞬間に持ち主になります。だから探しておく側に入れとかなあきません。

二段目は、出したあとに答え合わせすること。実際に割り当てられた名前と、自分が指定した名前を突き合わせて、違っとったら止める。

本命は二段目です。事前のチェックには死角があるからです。固定ページとの衝突、画像との衝突、同じタイミングで別の記事を作った時の取り合い。理由はいくつもあって、事前に全部を読み切るのは難しい。出たあとの名前を1回見るだけなら、理由が何であれまとめて捕まえられます。

よくある質問

「-2」が付いたまま公開してしまいました。あとから直してもいいですか?

そのアドレスをまだ誰にも渡してへんなら、編集画面のスラッグ欄を書き直すだけで大丈夫です。SNSやメールで配ってしもた後なら、先に転送の設定を入れてください。「Redirection」というプラグインを入れると、管理画面の「ツール」の中にメニューが増えます。そこで古いアドレスを転送元、新しいアドレスを転送先にした行を1つ足す。HTTPコードは「301(恒久的な転送)」を選びます。これを入れてからスラッグを直せば、古いリンクを踏んだ人も新しいページに着きます。

ゴミ箱の記事を完全に削除したら「-2」は消えますか?

名前は空きますが、既に付いてしもた「-2」は自動では戻りません。新しい記事のスラッグとして保存されとるからです。編集画面のスラッグ欄を手で書き直す必要があります。

下書きの段階で気づく方法はありますか?

下書きとレビュー待ちは重複の判定が走らんので、編集画面に出とるスラッグでは判断できません。公開または予約したあとに、実際に割り当てられた名前を見るのが確実です。

あわせて読みたい