URL スラッグは、URL のパスのうち 1 つのページを単語で表す部分です。https://example.com/blog/slug-setting-guide/ なら slug-setting-guide がスラッグです。Django のドキュメントは「Slug は新聞用語で、文字・数字・アンダースコア・ハイフンだけでできた短いラベル」と説明しています(SlugField)。WordPress では投稿の「スラッグ」、Shopify では「ハンドル」という欄で編集します。

日本語のサイトでは、スラッグをどう決めるかがそのまま「日本語の URL にするか、英語やローマ字にするか」という問題になります。この記事では、Google のドキュメントが実際に書いていること、WordPress が日本語タイトルから作るスラッグ、全角文字や【】が入ったときの結果、ライブラリごとの違いを、実際に動かした結果で確認します。ライブラリの結果は 2026-10-02 に実行したもので、ZeroTool の結果はスラッグ変換の出力です。

スラッグは URL のどこにあるか

スラッグはパスの 1 区切り(または最後の区切り)です。RFC 3986 は URL をスキーム、オーソリティ、パス、クエリ、フラグメントに分けており(3 節)、スラッグはパスに入ります。

https://example.com/slug-setting-guide/              WordPress のパーマリンク「投稿名」(/%postname%/)
https://shop.example.com/products/health-potion       Shopify の商品ハンドル

英小文字・数字・ハイフンだけのスラッグがよく使われるのは、これらが RFC 3986 の非予約文字(A–Z a–z 0–9 - . _ ~、2.3 節)で、エンコードが一切いらないからです。アドレスバーでも、メールでも、ログでも同じ形で読めます。日本語を使うと、この性質がなくなります。

Google 検索セントラルが書いていること

Google の「Google 検索における URL 構造のベスト プラクティス」のうち、スラッグに関係する項目は次の 5 つです。

項目ドキュメントの内容
わかりやすい URL を使用する長い ID 番号ではなく意味のある単語を使う
オーディエンスの言語を使用する「オーディエンスが日本語で検索している場合は、URL に日本語の単語を使用してください」。例は https://example.com/ペパーミント
必要に応じてパーセント エンコードを行うリンクの href では「ASCII 以外の文字はパーセント エンコードを行う必要があります」
単語を区切るのにハイフンを使用するアンダースコアではなくハイフン。アンダースコアは format_date のような関数名でまとめて扱う語に使われてきたため
URL は大文字と小文字が区別される/APPLE と /apple は別の URL

つまり Google は日本語のスラッグを認めています。そのうえで、リンクに書くときはパーセントエンコードした形を推奨しています。

書いていないことも大事です。文字数の上限、「a」「the」のような語を除くこと、キーワードを入れることは、このページには出てきません。「スラッグは 60 文字以内」といった目安は運用上の好みで、Google の要件ではありません。

WordPress は日本語タイトルをどうスラッグにするか

WordPress は投稿が下書き(draft)のあいだはスラッグを確定させません。wp_insert_post() は draft・pending・auto-draft の投稿では空のスラッグを空のままにし、公開などほかの状態で保存されたときにタイトルから sanitize_title() で作ります(post.php)。中身は remove_accents() と sanitize_title_with_dashes() です(formatting.php)。後者は WordPress 7.1.2 で次の処理をします。

  1. HTML タグを除き、小文字にする。
  2. ASCII 以外の文字を UTF-8 のパーセントエンコード(16 進は小文字)にし、エンコード後 200 文字で打ち切る。
  3. 曲がった引用符や ©・®・° などを消し、/ と . をハイフンにする。
  4. a–z・0–9・%・空白・_・- 以外を消し、空白をハイフンにまとめる。

7.1.2 の関数をそのまま動かした結果です(ロケールは ja)。

タイトルWordPress が作るスラッグ
WordPress入門wordpress%e5%85%a5%e9%96%80
ペパーミント%e3%83%9a%e3%83%91%e3%83%bc%e3%83%9f%e3%83%b3%e3%83%88
日本語 タイトル(全角スペース)%e6%97%a5%e6%9c%ac%e8%aa%9e%e3%80%80%e3%82%bf%e3%82%a4%e3%83%88%e3%83%ab
WordPress入門(全角英字)%ef%bd%97%ef%bd%8f%ef%bd%92%ef%bd%84%ef%bd%90%ef%bd%92%ef%bd%85%ef%bd%93%ef%bd%93%e5%85%a5%e9%96%80
【2026年版】スラッグ設定ガイド%e3%80%902026%e5%b9%b4%e7%89%88%e3%80%91%e3%82%b9%e3%83%a9%e3%83%83%e3%82%b0%e8%a8%ad%e5%ae%9a%e3%82%ac%e3%82%a4%e3%83%89

日本語のサイトで気をつける点が 4 つあります。

  • 全角スペースはハイフンにならない。 変換されるのは半角スペースと、ノーブレークスペースなど一部の空白だけです。全角スペース(%e3%80%80)はそのまま残ります。
  • 全角英字は小文字にはなるが、半角にはならない。 WordPress は 1 文字 9 桁のエンコードになり、wordpress とは別のスラッグです。
  • 【】や「」は消えない。 削除の対象は欧文の引用符や記号が中心で、和文の括弧はエンコードされて残ります。上の例は 17 文字のタイトルが 189 文字のスラッグになっています。
  • 約 22 文字で切れる。 かな・漢字は 1 文字 9 桁なので、200 文字の上限に 22 文字で届きます。長い日本語タイトルはスラッグの途中で切れます。

同じスラッグの投稿が既にあれば wp_unique_post_slug() が -2、-3 を付けます。公開済みの投稿のスラッグを変えると、WordPress は古いスラッグを _wp_old_slug として保存し、古い URL が 404 になる場面では wp_old_slug_redirect() が 301 で新しい URL へ転送します(query.php)。

日本語・ローマ字・英語の 3 つの選択肢

日本語のまま使う。 Google の推奨に沿っていて、検索結果やアドレスバーでは日本語で表示されます。ただし、実際の URL はエンコードされた長い文字列です。

for (const raw of ['スラッグ設定ガイド', '【2026年版】スラッグ設定ガイド', 'WordPress入門']) {
  const title = raw.normalize('NFKC'); // 全角英数字を半角に
  console.log(title, title.length, encodeURIComponent(title).length);
}
// スラッグ設定ガイド 9 81
// 【2026年版】スラッグ設定ガイド 17 121
// WordPress入門 11 27

ブラウザによっては URL をコピーすると %E3%82%B9… の形で貼り付けられ、SNS やチャットでは読めない文字列になります。16 進の大文字・小文字は RFC 3986 では同じ意味で、作る側は大文字にすべきとされています(2.1 節)。WordPress は小文字、Google の例は大文字ですが、指すページは同じです。

ローマ字にする。 自動変換は当てになりません。python-slugify 9.1.2(内部で text-unidecode を使用)は 東京 を dong-jing、ペパーミント を hehaminto に変換します。漢字は中国語の読みになり、半濁音も落ちます。ヘボン式などで正しく書くなら、編集者が手で入力するしかありません。

英語にする。 ASCII だけを残す変換ツール(ZeroTool もその 1 つ)は日本語を削除します。英単語が混ざっていればそれだけが残り、日本語だけのタイトルは空になります。

タイトルZeroTool の結果
東京 Travel Guide 2026travel-guide-2026
ペパーミント空(ツールは「結果が空です」と表示)
【2026年版】スラッグ設定ガイド2026

3 行目のように、数字だけが残ると意味のないスラッグになります。日本語タイトルの記事では、スラッグを slug-setting-guide のように英語で書き、ツールは確認用に使うのが現実的です。

全角英数字は先に半角へ

IME が全角モードのまま WordPress入門 や Node.js 20 と入力すると、見た目は英数字でも Unicode では別の文字です。WordPress はそのままエンコードします。ZeroTool は全角英数字・記号を先に NFKC で半角にしてから変換します。WordPress でも NFKC 正規化で半角にしてから入力すれば期待どおりになります。

ZeroTool では WordPress入門 が wordpress、Node.js 20 が node-js-20 になり、半角で入力した WordPress入門、Node.js 20 と同じ結果です。

上のコードの normalize('NFKC') がその処理です。Python なら unicodedata.normalize('NFKC', s) です。

スラッグ変換ライブラリで結果が変わる

同じタイトルでも、ライブラリによってスラッグは変わります。WordPress は 7.1.2(ロケール ja)、Django は 6.1.1 の django.utils.text.slugify、python-slugify は 9.1.2、npm の slugify は 1.6.9({ lower: true, strict: true })、@sindresorhus/slugify は 3.0.1 です。

タイトルZeroToolWordPressDjangopython-slugifyslugify(npm)@sindresorhus/slugify
東京 Travel Guide 2026travel-guide-2026%e6%9d%b1%e4%ba%ac-travel-guide-2026travel-guide-2026dong-jing-travel-guide-2026travel-guide-2026travel-guide-2026
WordPress入門wordpress(上の表のとおりエンコード)wordpresswordpressru-men空空
Node.js 20.0node-js-20-0node-js-20-0nodejs-200node-js-20-0nodejs-200node-js-20-0
C++ vs C#c-plus-plus-vs-c-hashc-vs-cc-vs-cc-vs-cc-vs-cc-vs-c

Django は ASCII に変換するとき NFKD 正規化を使うので、全角英字が半角になって wordpress が残ります。allow_unicode=True を付けると日本語も残り、wordpress入門 になります。python-slugify の ru-men は「入門」の中国語読みです。

どれが正しいということはありませんが、移行のときに問題になります。WordPress で作ったスラッグを Django の slugify で作り直すと、node-js-20-0 が nodejs-200 に変わり、外部からのリンクが切れます。スラッグは一度作ったら保存し、タイトルから作り直さないのが原則です。

公開後にスラッグを変えるとき

Google は「リダイレクトと Google 検索」で、「検索エンジンの結果に表示されるページの URL を変更する必要がある場合は、可能な限りサーバー側の永続的なリダイレクトを使用することをおすすめします」としています。ステータスコードは 301 か 308 です。

  • WordPress の投稿は、前述の _wp_old_slug の仕組みで自動的に 301 になります。
  • Shopify は「URL リダイレクト」で、古いパスが 404 を返すときだけ転送できます。
  • 静的サイトはルールを自分で書きます。Cloudflare Pages なら _redirects に /blog/old-slug/ /blog/new-slug/ 301 のような行を足します。日本語の古いスラッグは、エンコードした形で書くと確実です。

古い URL への転送は残し続けてください。過去のメールや SNS の投稿、他サイトのリンクは更新されません。

スラッグを決めるときのチェックリスト

  • 日本語にするか英語にするかをサイト全体で決める。日本語なら、共有したときにエンコードされた URL になることを受け入れる。
  • 単語の区切りはハイフン。アンダースコアは使わない。
  • 全角英数字は半角にしてから入力する。全角スペースや【】をスラッグに残さない。
  • 長い日本語タイトルをそのままスラッグにしない(WordPress では約 22 文字で切れる)。
  • 記号(&・+・#)をどう書くかを決め、サイト全体で 1 つの変換方法を使う。
  • スラッグは保存し、タイトルから作り直さない。変えたら 301 か 308 で転送する。

タイトルが英語のスラッグでどうなるかを確かめるにはスラッグ変換、user_login_count のような識別子を作るならテキストケース変換が使えます。