WordPressで記事を作成する際、日本語のタイトルを付けると、スラッグが異常に長くなってしまうことがあります。URLがわかりにくくなるだけでなく、手動で修正するのも手間がかかります。さらに、公開後にスラッグを変更すると、既存のリンクが切れてしまうリスクもあるため、慎重に対応しなければなりません。
そこでこの記事では、記事を保存する際に自動的に「post-ID形式の短いスラッグ」に変換する方法を解説します。functions.phpに数行のコードを追加するだけなので、初心者の方でも導入しやすい方法です。
2025.12.23追記
GAでページを解析する際など、post-IDだと直感的にページ内容を推測できず、結構不便でした。後々のことを考えると、記事内容と関連性のある短い単語のスラッグを使うほうが良さそうです!
要点
- 日本語タイトルは自動生成されるスラッグが冗長になりやすい
- post-IDに統一することで、URLが短くなり、重複や文字化けを防げる
save_postフックを使えば、保存処理の最後にスラッグを書き換えられる- 導入後は数件の投稿をテストするだけで、安全性を確認できる
なぜスラッグの正規化が必要なのか
日本語タイトルを含む記事を保存すると、WordPressは自動的にタイトルをもとにスラッグを生成します。ただし、日本語はURLエンコードされるため、非常に長く扱いにくいURLになってしまいます。
公開後にスラッグを手動で変更すると、外部からのリンクが無効になることもあります。そのため、保存時に自動的にpost-IDへ統一しておくと、運用が安定します。post-IDは投稿ごとに割り当てられる一意の数値なので、重複の心配もありません。
実装方法(functions.phpに追加)
次のコードを子テーマのfunctions.phpに追加すると、保存時にスラッグが自動的にpost-ID形式へ置き換わります。
// 保存時にスラッグを post-ID に統一する
add_action('save_post', 'normalize_post_slug_to_id', 20, 3);
function normalize_post_slug_to_id($post_id, $post, $update) {
// 自動保存・リビジョンは除外
if (wp_is_post_autosave($post_id) || wp_is_post_revision($post_id)) return;
// ゴミ箱や不正データ、post以外は対象外
if (!isset($post) || $post->post_status === 'trash' || $post->post_type !== 'post') return;
// 現在のスラッグと置き換え先
$slug = (string) $post->post_name;
$target_slug = 'post-' . $post_id;
// 空スラッグ or 日本語スラッグのみ更新
$needs_update = $slug === '' || preg_match('/[^a-z0-9\\-_]/u', $slug);
if (!$needs_update || $slug === $target_slug) return;
// 一時的にフック停止 → 無限ループ防止
remove_action('save_post', 'normalize_post_slug_to_id', 20);
wp_update_post(['ID' => $post_id, 'post_name' => $target_slug]);
add_action('save_post', 'normalize_post_slug_to_id', 20, 3);
}
この処理は、自動保存やリビジョンには影響せず、通常の投稿だけを対象にスラッグを正規化します。
正規化が行われる条件と除外条件
正規化されるケース
- 投稿タイプが
postである - スラッグが空、またはASCII以外の文字を含んでいる
- 通常の保存操作である
正規化されないケース
- 自動保存の場合
- リビジョン保存の場合
- ゴミ箱へ移動した場合
- すでに英数字のスラッグが指定されている場合
必要な場面だけ実行されるため、通常の編集作業を妨げることはありません。
導入後の動作確認
導入後は、以下の点を確認しておくと安心です。
- 日本語タイトルで投稿:スラッグがpost-ID形式になっているか
- 英数字タイトル:意図したスラッグが保持されるか
- スラッグ空欄:正しく置き換わるか
- 旧URLにアクセス:404にならないか(ブラウザで確認)
これだけチェックすれば、基本的な動作確認は十分です。
よくあるつまずきポイント
無条件でwp_update_postを呼ぶと、自動保存と衝突する可能性があります。そのため、wp_is_post_autosaveとwp_is_post_revisionのチェックは必須です。
また、固定ページやカスタム投稿タイプへの影響を避けるため、postのみを対象にする条件も効果的です。フックの優先度を20に設定しておくと、WordPress本体のスラッグ生成後に安全に書き換えが行われます。
まとめ
日本語スラッグの冗長さは、運用時の負担やリンク管理の手間につながります。保存時に自動的にpost-IDへ統一することで、短くて扱いやすいURLになり、公開後のスラッグ変更によるリスクも減らせます。
functions.phpにコードを追加するだけで導入でき、数件の投稿をテストするだけで十分に検証可能です。WordPressの運用や投稿フローについて相談したい場合は、お気軽にお問い合わせください。

