WordPressのスラッグに-2が付く原因|ゴミ箱は犯人やなかった
WordPressが記事のURLの末尾に-2を付けるのは、保存した時に同じ名前の投稿がもう在る時。前は「犯人はゴミ箱」と書いてましたが、まちがいでした。WordPress 7.1.3 の本体のコードと、自分のブログでの実測で確かめ直した結果です。
朝いちで公開したブログ記事を AI に確かめさせたら、アドレスの末尾に見覚えのない文字が2つ付いとりました。「-2」です。自分で付けた覚えはありません。
先に結論を書いときます。-2 は、記事を保存した時に、同じ名前を持つ投稿がもう在ると WordPress が足す連番です。REST(状態を下書きと指定した時)やブロックエディターで名前を指定して保存すると、下書きの段階でもう付きます。私の時の相手は、作り直す前の同じ記事でした。前は「犯人はゴミ箱」と書いてましたが、まちがいでした。今の WordPress は、ゴミ箱に入れた記事の名前を空けます。
下の話は、2026-10-22 に AI に WordPress 7.1.3 の本体のコードを読み直させ、移す前の WordPress のブログで実際の動きを確かめ直させたものです。
公開したはずのURLに、余計な文字が2つ付いとった
記事は指定した時刻に自動で公開されるようにしてます。その日も時間どおりに出て、中身も正しい。ページも普通に開きました。
違ったのはアドレスだけです。自分が指定したのは英語の短い名前(スラッグ)。実際に割り当てられとったのは、その後ろに「-2」が付いたものでした。
これ、読んどる側からは気づけません。記事は開くし、中身も崩れてへん。エラーも出ません。書いた本人がアドレス欄か編集画面のスラッグ欄を見に行かん限り、何も起きてへんのと同じ顔をしとります。
WordPressが「-2」を付ける条件
WordPress は記事を保存する時に「この名前、もう誰か使うてへんか」を調べます。使われとったら末尾に数字を足して、空いてる名前が見つかるまで数字を増やしていきます。コードを読むと、数え始めは2です。だから最初に付くのは「-2」で、それも埋まっとったら「-3」になる。関数の説明文には「-1、-2 など」と書いてあるんやけど、中身は2から数えとります。
調べる相手と時期は、コードを読むとこうなっとります。
場面 | 調べる相手 |
|---|---|
投稿を公開・予約・非公開にした時 | 同じ種類の投稿だけ。相手の状態は問わん(下書きや非公開でも、名前を持っとれば当たる) |
投稿を下書き・レビュー待ちで保存した時 | REST やブロックエディターで名前を指定して保存すると、下書きでもその時に調べる(相手は上と同じ)。wp_insert_post を直接呼ぶ時と、REST で状態を付けずに作った時は、下書きは素通り |
固定ページ | 同じ親の下の固定ページと画像。一番上の階層の固定ページなら、どの記事にも付けてへん画像も相手になる |
画像などをアップした時 | 投稿・固定ページ・画像の全部。かぶったら画像のほうに -2 が付く |
前は「メディアにアップしたファイルは、記事と同じ土俵で名前の取り合いをします」と書いてましたが、これもまちがいでした。投稿を保存する時に調べるのは、同じ種類の投稿だけです。画像をアップする時は、画像のほうが投稿・固定ページ・画像の全部と名前を比べるので、かぶった時に -2 が付くのは画像のほうです。画像とぶつかるのは固定ページのほうで、同じ親の下にある画像が相手になります。一番上の階層の固定ページなら、どの記事にも付けてへん画像と同じ名前の時にぶつかります。
前は「下書きのうちは判定が走らん」とも書いてましたが、これもまちがいでした。REST で状態を下書きと指定した時やブロックエディターで名前を指定して保存すると、下書きでもその時に調べます(REST でも状態を付けずに作ると、調べずに下書きとして保存されます)。REST で記事を作る処理と直す処理が、下書きとレビュー待ちの時はわざわざ「公開」の扱いで重複を調べる作りになっとる。-2 に気づいた日に、AI にわざと名前がかぶる形を作らせて試した時も、名前を指定して下書きを作った時点で -2 が付きました。-2 の付いてへん方を予約に移しても名前は付け直されず、あとから同じ名前で作った方に -2 が付いた。私の時の -2 も、記録の順番から見て、自動で下書きを作った瞬間に付いたはずです(作った瞬間の名前そのものは見てへん)。下書きを素通りするのは、REST を通らずに wp_insert_post という保存の関数を直接呼ぶ時です。旧エディター(クラシックエディター)で保存した時にどうなるかは、確かめてへん。
編集画面に出る仮の URL も、コードを読むと、下書きのうちから公開の扱いで重複を調べた名前を出す作りです。これは画面では確かめてへん。名前を指定して保存した下書きは、その名前を持ったままになります(下の段)。気をつけるのは、名前をまだ保存してへん下書きで仮の URL を見た時と、保存がほぼ同時に重なった時です。仮の URL は保存するまでは仮なので、その間に他の記事が同じ名前で保存されたら、保存した時に -2 が付く。保存が重なった時は、名前の取り合いがどう転ぶか読み切れません。だから「下書きで確認したから大丈夫」とは言い切れません。
逆向きの話もあります。名前を指定して保存した下書きは、その時点でその名前を持っとる。あとから別の記事を保存する時には、その下書きが相手として当たります。前は「下書きは今の時点では名前を持ってへん」と書いてましたが、まちがいでした。名前を決めずに置いとる下書きだけは名前が空のままで、公開する時にタイトルから名前を作ります。
ほかにも、数字だけのスラッグが日付のアーカイブのURLとぶつかる形の時や、embed のような WordPress が使う名前の時にも -2 が付く作りになっとります。
ゴミ箱は犯人やなかった
前の記事では、ゴミ箱に残っとった同じ名前の古い記事が犯人や、と書いてました。ゴミ箱は「消した場所」やなく「まだ置いてある場所」で、名前も持ったままや、と。
まちがいでした。WordPress 4.5 からは、記事をゴミ箱に入れた時点で名前の後ろに __trashed が付きます。同じ名前の新しい記事を保存した時にも、ゴミ箱の側に __trashed を付けて名前を譲らせる作りです。ゴミ箱の記事が名前を握ったまま、ということは、ふつうの使い方では起きません。
当時の記録を見直すと、本当の順番はこうでした。
- 同じ記事を、設定ミスで一度作っとった(古い方)
- 作り直した新しい方を、仕組みが自動で下書きとして作った。この時、古い方はまだゴミ箱に入る前で、名前を持っとった。新しい方の -2 は、この下書きを作った瞬間に付いたはずです
- 新しい方は -2 のまま、予約に入った
- そのあと、古い方をゴミ箱に入れた。WordPress が古い方の名前を
…__trashedに変えて、元の名前は空いた - 新しい方は -2 のまま、朝に公開された
AI と残しとる当時の作業の記録には、古い方がまだゴミ箱に入る前に名前がかぶった、と正しく書いてありました。API で並べた表でも、ゴミ箱の古い方はちゃんと __trashed 付きになっとった。記録は正しかったのに、記事はゴミ箱を犯人にする話になってしもた。
もうひとつは前に書いたとおりです。名前が空いたあとも、先に付いてしもた -2 は自動では戻りません。-2 は新しい記事のスラッグとして保存済みで、あとから数え直す処理は無いからです。編集画面で手で書き直すしかない。
ページが開くことと、URLが正しいことは別
気づけたのは、正直に言うと偶然でした。朝の点検で AI に公開できたか確かめさせた時に、いつもの「200(正常)」やなく「301(ここやないで、こっちに移ったで)」が返ってきたんです。指定した -2 無しの名前で開こうとして、-2 付きの方へ回されとった。
WordPress は、見つからんURLに来た人を、頭が同じ名前の記事へ回す作りになっとります。2026-10-22、移す前の WordPress 7.1.3 のブログで、この記事のアドレスを途中で切って開くと、301 でこの記事へ回されました。親切な機能やけど、まちがいを隠す側にも働く。
ページは開く。中身も正しい。だから「繋がっとるしええか」で閉じてたら、そのまま気づかんかったと思います。実際その日は、告知と Pinterest のピンに載せたリンク4本が全部その回り道を通っとりました。読者から見たら普通に読めるので、誰も教えてくれません。
同じことを起こさんために見るところ
手で記事を書いとる人なら、やることは1つだけです。公開か予約のボタンを押したあとに、アドレス欄かスラッグ欄をもう1回見る。名前をまだ保存してへん下書きで見た仮の URL は、保存するまでに他の記事が同じ名前を取ることがあるので、押したあとに見るのが確実です。
自分みたいに自動で公開しとる場合に備えて、AI が確認を二段にしました。
一段目は、出す前に同じ名前を探すこと。公開中だけやなく、予約・下書き・レビュー待ち・非公開まで含めて同じ名前を探して、誰かが持っとったら止める。ゴミ箱も一応探しとりますが、__trashed が付くので普段は何も出てこんのが正常です。
二段目は、出したあとに答え合わせすること。実際に割り当てられた名前と、自分が指定した名前を突き合わせて、違っとったら止める。
本命は二段目です。一段目には死角があるからです。探したあとに別の記事が同じ名前で保存される取り合い。大文字が混ざっとって、WordPress が小文字に書き換えた時。理由は何であれ、出たあとの名前を1回見るだけなら、まとめて捕まえられます。この二段目は、AI にわざと同じ名前の記事を作らせて -2 が付く形を再現し、ちゃんと止まるのを確かめてから使い始めました。
よくある質問
「-2」が付いたまま公開してしまいました。あとから直してもいいですか?
公開済みの投稿なら、編集画面でスラッグを書き直して大丈夫です。WordPress は公開中の投稿のスラッグが変わると古い名前を覚えとって、古いURLに来た人を新しい方へ 301 で回します。-2 を直した記事も、2026-10-22 に移す前の WordPress のブログで -2 付きのURLを開くと、301 で正しい方へ着きました。
前は、SNS で配ってしもた後なら先に転送のプラグイン(Redirection)を入れてから直す、と書いてましたが、公開済みの投稿なら要りませんでした。下の2つは対象外です。
- 固定ページ:古い名前を覚える処理は、投稿のような階層の無いものだけが対象です。固定ページで変える時は、転送の設定を別に入れる
- 公開する前に直した時:まだ公開されてへん記事の名前は覚えません。-2 付きの名前で予約しとった記事を公開前に直した時は、その -2 付きのURLを 2026-10-22 に移す前のブログで開くと 404 でした(この -2 は WordPress が付けた物やなく、自動の仕組みが最初からその名前で指定しとった物です)。予約の段階で -2 のURLを告知に入れてしもた時は、告知の方も直す
ゴミ箱の記事を完全に削除したら「-2」は消えますか?
消えません。今の WordPress では、ゴミ箱に入れた時点でその記事の名前は空いとります。完全に削除しても -2 が付いた方は何も変わらんので、編集画面のスラッグ欄を手で書き直すしかないです。
下書きの段階で気づく方法はありますか?
REST やブロックエディターで名前を指定して保存しとれば、下書きの段階でもう -2 が付きます。wp_insert_post を直接呼ぶ形だと、公開か予約にするまで調べへん。編集画面の仮の URL も重複を調べた名前のはずですが、画面では確かめてへん。名前を指定して保存した下書きはその名前を持ったままで、あとから同じ名前で調べて保存した方に -2 が付きます。見たあとに他の記事にその名前を取られることがあるのは、名前をまだ保存してへん下書きで仮の URL を見た時と、保存がほぼ同時に重なった時と、重複を調べん保存(wp_insert_post を直接呼ぶ・REST で状態を付けずに作る)で同じ名前の下書きがもう1本できた時です。最後の形やと、先に名前を持っとった方でも、あとで公開する方に -2 が付きます。自動で作る時は、保存のたびに WordPress が返してきた名前を突き合わせるのが確実です。
おわりに
公開の仕組みを自動で回しとると、こういう「黙って違う物になる」形のずれに当たります。エラーの出方と本当の原因がずれとった話は、WordPressで画像だけ403エラーにも書きました。置いただけでは動かんかった話はWordPressでLPを作る|静的HTMLと違った4つのこと、「開けたからOK」で終わらせんかった話はCloudflare WorkersでLP公開です。
WordPress の困りごとがあれば
予約や自動で出した記事の URL や中身が、想定と違う。そういう困りごとは、今の設定や仕組みを見せてもらえたら、原因と直し方をこちらで書き起こします。