WP Manifestindependent plugin directory
manifest / utilities / wp-numeric-slug-fixer

WP Numeric Slug Fixer

数字のみのスラッグをつけると日付アーカイブ扱いになって、意図しないURLにリダイレクトされる問題を防止するプラグイン

by mypacecreator · github.com/mypacecreator/wp-numeric-slug-fixer · website

0stars
0forks

Install

No release zip yet. The repository archive installs, but the folder name will carry the branch suffix and updates will not flow:

wp plugin install https://github.com/mypacecreator/wp-numeric-slug-fixer/archive/refs/heads/main.zip

WordPress の %postname% パーマリンク構造で、数字のみのスラッグが日付アーカイブにリダイレクトされる問題を修正するプラグイン。

問題の背景

/%postname%/ パーマリンク設定時、202342 のような数字だけのスラッグをもつ投稿は直接表示されない。WordPress のリライトルールが数字のURLセグメントを年・月・日アーカイブとして優先マッチするため、/2023/ へのリクエストは年別アーカイブにリダイレクトされてしまう。

解決アプローチ

wp_insert_post_data フィルターで DB 書き込み前にスラッグを検査し、数字のみであればプレフィックスを付与して書き直す。デフォルトは post-(例: 2023post-2023)。

「保存後に再更新」ではなく「保存前にフィルター」なので、wp_update_post() の再呼び出しによる無限ループのリスクがない。

ファイル構成

wp-numeric-slug-fixer/
├── wp-numeric-slug-fixer.php        メインプラグインファイル
├── includes/
│   └── admin-tools-page.php         管理画面ツールページ(一括修正)
├── readme.txt                        WordPress.org 公開用
└── README.md                         開発用メモ(このファイル)

動作条件

項目 バージョン
WordPress 6.0 以上(動作確認: 6.9.x)
PHP 7.4 以上(8.x も対応)

フック仕様

フィルター: wpnsf_prefix

数字スラッグに付与するプレフィックスを変更できる。

// デフォルト: 'post-'
add_filter( 'wpnsf_prefix', function() {
    return 'article-';
} );

プレフィックス変更後は既存の数字スラッグを持つ投稿を再保存する必要がある(フィルターは保存時のみ実行されるため)。

フィルター: wpnsf_excluded_post_types

数字スラッグの修正処理から除外する投稿タイプを指定できる。保存時フィルターと管理画面ツールページの一括修正クエリの両方に適用される。

デフォルトで revisionnav_menu_itemattachment が除外されている。カスタム投稿タイプなどを追加で除外したい場合に使用する。

add_filter( 'wpnsf_excluded_post_types', function( array $types ): array {
    $types[] = 'my_internal_type';
    return $types;
} );

管理画面ツールページ(1.1.0 追加)

Tools > Fix Numeric Slugs に一括修正ページを追加。プラグイン有効化前に数字のみのスラッグで保存された既存投稿を対象とする。

  • 対象投稿(数字スラッグ・revision / auto-draft / trash 除外)を一覧表示
  • 「Fix All」ボタンで全件を一括修正(wp_update_post() 経由で既存フィルターを再利用)
  • manage_options 権限チェック + nonce 検証(CSRF 対策)
  • %postname% パーマリンク設定が有効でない場合は警告を表示してボタンを非表示
  • 修正済み件数・エラーが発生した場合はポスト ID を通知

使い方

  1. WordPress 管理画面で ツール > Fix Numeric Slugs を開く
  2. 数字のみのスラッグを持つ投稿の一覧が表示される(対象なしの場合は「No posts with numeric-only slugs found. Nothing to fix.」と表示)
  3. 内容を確認し、Fix All ボタンをクリック
  4. 完了後、修正件数の通知が表示される(例: 2023post-2023
  5. ページを再度開き「No posts with numeric-only slugs found. Nothing to fix.」と表示されれば修正完了(べき等 — 何度実行しても安全)

前提条件: 設定 > パーマリンク で「投稿名 (%postname%)」が選択されていること。
他のパーマリンク構造では数字スラッグの競合が発生しないため、そのパーマリンク構造が設定されていない場合は Fix All ボタンが表示されない。

開発メモ

ローカル環境セットアップ

wp-env または Local などの WordPress 開発環境を用意し、このディレクトリを /wp-content/plugins/wp-numeric-slug-fixer/ に配置してプラグインを有効化する。

手動テスト手順

新規保存時のフィルター確認

  1. 設定 > パーマリンク で「投稿名」を選択して保存
  2. 新規投稿を作成し、スラッグを 2023 などの数字のみに設定
  3. 保存後、スラッグが post-2023 に変わっていることを確認
  4. 実際の URL にアクセスして投稿が表示されることを確認(日付アーカイブにリダイレクトされないこと)

Tools ページの一括修正確認

  1. プラグインを一時的に無効化し、数字スラッグの投稿をいくつか保存
  2. プラグインを再有効化(スラッグはそのまま数字のまま残る)
  3. Tools > Fix Numeric Slugs を開き、対象投稿がテーブルに表示されることを確認
  4. 「Fix All」をクリックし、成功通知とスラッグの変化(例: 2023post-2023)を確認
  5. 再度ページを開き「No posts with numeric-only slugs found. Nothing to fix.」と表示されることを確認(べき等性)

考慮済みのエッジケース

ケース 挙動
スラッグが空 WordPress が後でタイトルから生成するためスキップ
リビジョン投稿 リビジョンは独自のスラッグ処理があるためスキップ
%postname% を含まないパーマリンク 問題が発生しないため処理をスキップ
数字を含むが数字のみでないスラッグ(例: 2023-recap ctype_digit() が false を返すためスキップ

WordPress.org 申請時の注意

  • Contributors フィールドは WordPress.org のユーザー名(GitHub と異なる場合は要変更)
  • SVN タグに 1.0.0 ディレクトリを作成し Stable tag: 1.0.0 と一致させる
  • プラグインアイコン画像は assets/ ディレクトリに配置(icon-128x128.png / icon-256x256.png
  • スクリーンショットは assets/screenshot-1.png のように番号付きで配置し readme.txt== Screenshots == セクションに記載