【WordPress】固定ページのスラッグに自動的に”-2″が追加される問題の解決方法

【WordPress】固定ページのスラッグに自動的に"-2"が追加される問題の解決方法 WordPress

固定ページを作成してスラッグを入力した瞬間、意図せず「-2」が自動で付与されてしまい、狙ったURLで公開できないことがあります。これはWordPressの不具合というより「同一スラッグを許さない」仕組みが正しく働いた結果であり、原因となる“別の投稿(ページ)”がどこかに存在している状態です。問題は、その“別の投稿”が公開中とは限らず、下書きやゴミ箱、さらには自動下書き(auto-draft)であることも多い点にあります。本記事では、-2 が付くメカニズムを押さえたうえで、実務で確実に解消するための切り分けと対処手順を解説します。

なぜスラッグに「-2」が付くのか

WordPressは投稿タイプごとにスラッグ(post_name)の重複を基本的に許しません。すでに同じスラッグが存在する場合、保存時に一意になるよう末尾へ「-2」「-3」…を自動付与します。固定ページの場合は階層構造を持つため、同じスラッグでも親が異なればURLが分かれるケースがありますが、内部的には競合と見なされる条件があり、結果として「-2」が付くことがあります。つまり、解決の本質は「競合している元データを見つけて解消する」ことです。

最初に確認すべき代表的な原因

最も多い原因は、同じスラッグを持つ固定ページがすでに存在していることです。次に多いのが、ゴミ箱に残っている同名スラッグのページ、そして自動下書き(auto-draft)です。特に自動下書きは管理画面上で見つけにくく、ログイン時や新規作成画面を開いたタイミングで生成され、スラッグを先取りしてしまうことがあります。公開ページが存在しないのに -2 が付く場合は、この自動下書きやゴミ箱を疑うのが現実的です。

管理画面だけで競合を探す方法

まず固定ページ一覧で「ゴミ箱」も含めて検索し、同じスラッグに該当しそうなページがないか確認します。タイトル検索だけでは見つからない場合があるため、パーマリンクの候補となる文字列を含むページを中心に確認します。ゴミ箱に同一スラッグがあれば完全削除すると、同じスラッグが再利用できるようになります。ここまでで解消しない場合、管理画面に出てこない auto-draft の可能性が高くなります。

データベースで競合スラッグを特定する

確実に原因を特定したい場合は、wp_posts の post_name を検索します。固定ページは post_type = ‘page’ ですが、競合が page 以外(添付ファイルやカスタム投稿など)で起きることもあるため、まずはスラッグを横断的に確認してから絞り込むのが安全です。

SELECT ID, post_type, post_status, post_title, post_name
FROM wp_posts
WHERE post_name = 'target-slug'
ORDER BY post_type, post_status, ID;

この結果に、post_status = ‘trash’ が含まれていればゴミ箱起因です。post_status = ‘auto-draft’ が含まれていれば自動下書きが原因です。公開や下書きが存在するなら、そのページ側のスラッグを変更するか、今回作りたいページのスラッグ設計を見直す必要があります。

auto-draftが原因のときの対処

auto-draft は「新規追加」画面を開いたタイミングなどで自動生成される一時データです。これが何らかの理由で残り続けると、スラッグを先取りして「-2」を発生させます。まずは当該スラッグを持つ auto-draft を削除することで、正常化できます。次のSQLは、対象スラッグを持つ auto-draft を削除する例です。実行前に必ずバックアップを取り、対象が本当に不要な auto-draft であることを SELECT で確認してから実行してください。

SELECT ID, post_type, post_status, post_title, post_name
FROM wp_posts
WHERE post_status = 'auto-draft'
  AND post_name = 'target-slug';

DELETE FROM wp_posts
WHERE post_status = 'auto-draft'
  AND post_name = 'target-slug';

auto-draft が大量に残って運用上問題になっている場合は、定期的に古い auto-draft を削除する運用も検討できます。たとえば一定期間より前の auto-draft を削除するなど、要件に合わせたメンテナンスが有効です。

ゴミ箱が原因のときの対処

ゴミ箱内の投稿は、見た目には消えていてもスラッグ競合の原因になり得ます。固定ページ一覧でゴミ箱を表示し、完全削除すると再利用可能になるケースが多いです。運用上ゴミ箱保持期間を短くしたい場合は、WordPressの自動削除(EMPTY_TRASH_DAYS)も検討できますが、誤削除リスクとのバランスが重要です。

プラグインや独自処理でauto-draftが増殖している場合

ログイン時に自動下書きを生成する、あるいは編集フローの都合で下書きを自動作成するような独自実装があると、スラッグ競合が慢性化することがあります。この場合、根本原因は「不要なタイミングで下書きが作られている」ことなので、生成条件の見直しが必要です。たとえば、編集画面を開く前に自動生成しない、生成しても post_name を空にして先取りしない、といった設計にすると衝突を避けられます。

スラッグの重複判定を理解して回避設計をする

固定ページは階層を持てるため、親が異なればURLが異なるように見えますが、運用ルールやパーマリンク設計、既存ページ構成によっては重複扱いになることがあります。大規模サイトほど「同名の一般名詞スラッグ」が衝突しやすいため、ページ種別を示す接頭辞を付ける、親スラッグを含めた命名規則を定めるなど、情報設計レベルでの対策が有効です。

どうしても末尾の連番付与を制御したい場合

通常は競合元を解消するのが正道ですが、要件によってはスラッグ生成のフックで制御したい場面もあります。ただし、重複を無理に許容するとURL衝突や上書きの危険があるため、むやみに「-2を付けない」方向へ改変するのは推奨できません。どうしても制御が必要なら、競合時に別規則へ置き換えるなど、確実に一意性を担保するルールで設計する必要があります。

add_filter('wp_unique_post_slug', function ($slug, $post_ID, $post_status, $post_type, $post_parent, $original_slug) {
  if ($post_type !== 'page') return $slug;

  // 例:競合時に固定の接尾辞へ切り替える(運用ルールがある場合のみ)
  // この処理は一意性を壊さないよう、必ず別途重複チェックを前提に設計すること
  if ($slug !== $original_slug) {
    $slug = $original_slug . '-page';
  }

  return $slug;
}, 10, 6);

このような改変は、既存URLやリダイレクト設計、SEO影響も含めて慎重に評価する必要があります。まずは競合元の削除・整理で解決できないかを優先してください。

まとめ

固定ページのスラッグに「-2」が付くのは、同じスラッグを持つ投稿がどこかに存在するサインです。公開中だけでなく、ゴミ箱や auto-draft が原因になりやすく、管理画面だけでは見つけにくいことがあります。確実に解決するには、wp_posts をスラッグで検索して競合元を特定し、ゴミ箱なら完全削除、auto-draft なら不要データの削除、あるいは生成ロジックの見直しを行うのが実務的です。場当たり的にスラッグを変えるのではなく、競合の仕組みを前提に運用と設計を整えることが、再発防止につながります。