投稿タイトルやユーザーが入力した文字列を、そのままURLの一部やファイル名に使うことはできません。スペースや記号、大文字小文字が混ざった文字列は、URLスラッグやファイル名として不都合を起こすからです。WordPress には、こうした文字列を安全な形に整えてくれる sanitize_title() と sanitize_file_name() という関数が用意されています。この記事では、2つの関数がそれぞれ何をどう整形するのか、違いと使い分け、実践的な使い方までを丁寧に解説します。
目次
なぜ文字列の整形が必要なのか
URLスラッグやファイル名には、使える文字に制約があります。たとえば URL にスペースや ?、& などが含まれるとリンクが壊れたり意図しない挙動になったりしますし、ファイル名に / や * が含まれると保存できません。こうした「使えない文字」を手作業で置換しようとすると、対象が多く必ず漏れが出ます。
そこで WordPress では、文字列を用途に合わせて自動で整形するヘルパー関数を用意しています。スラッグ用が sanitize_title()、ファイル名用が sanitize_file_name() です。自分で正規表現を書くのではなく、これらを通すことで、WordPress が想定する安全な文字列を一貫して得られます。
sanitize_title() で文字列をスラッグに整える
sanitize_title() は、渡した文字列をURLスラッグとして使える形に整形して返します。主な処理は、アルファベットの小文字化、スペースやアンダースコアをハイフンに変換、スラッグに使えない記号の除去、そして連続したハイフンを1つにまとめる、前後の余分なハイフンの除去です。
次のように、入力に対して整形後の文字列が返ります。
| 入力 | 出力 |
|---|---|
sanitize_title('Hello World!') | hello-world |
sanitize_title(' My_First Post ') | my-first-post |
sanitize_title('CSS & HTML Tips') | css-html-tips |
基本的な使い方は、整形したい文字列を渡して戻り値を受け取るだけです。
<?php
$slug = sanitize_title('Hello World!');
// $slug は 'hello-world'
echo $slug; // hello-world
ハイフン化や記号除去といった具体的な変換は、内部的に sanitize_title_with_dashes() が担当しています。sanitize_title() は、状況に応じてこの関数を通した結果を返す入口の役割を持っています。通常はこの違いを意識する必要はなく、sanitize_title() を呼べば問題ありません。
日本語はデフォルトで%エンコードされる
注意したいのが、日本語などの非ASCII文字の扱いです。sanitize_title() は、アルファベットや数字以外の多くの記号を除去しますが、日本語はデフォルトではローマ字化されず、パーセントエンコード(URLエンコード)された文字列になります。たとえば sanitize_title('こんにちは') は英単語には変換されず、%e3%81%93%e3%82%93... のようなエンコード済みの文字列を返します。
そのため、日本語タイトルからきれいな英字スラッグを自動生成したい場合は、この関数だけでは目的を達成できません。スラッグを別途手動で与えるか、あらかじめ英字の文字列を用意して渡す必要があります。
sanitize_file_name() でファイル名を安全にする
sanitize_file_name() は、渡した文字列をファイル名として安全に使える形に整形して返します。ファイルシステムやアップロード処理で問題を起こしやすい特殊文字を除去・置換します。対象になるのは、/、\、:、*、?、"、<、>、| といったファイル名に使えない文字や、制御文字などです。
また、ファイル名中のスペースはハイフンに置き換えられます。sanitize_title() と違って、こちらは拡張子(ドット以降)を保持するのが大きな特徴です。ファイル名として意味のある拡張子を壊さずに、名前部分だけを整えてくれます。
| 入力 | 出力 |
|---|---|
sanitize_file_name('My Photo.JPG') | My-Photo.JPG |
sanitize_file_name('report:2026*.pdf') | report2026.pdf |
使い方は sanitize_title() と同様に、整形したい文字列を渡して戻り値を受け取ります。
<?php
$name = sanitize_file_name('My Photo.JPG');
// $name は 'My-Photo.JPG'(拡張子は保持される)
echo $name; // My-Photo.JPG
なお、sanitize_file_name() はスラッグ生成のように全体を小文字化するわけではありません。あくまで「ファイル名として使える文字だけを残す」ことが目的で、アルファベットの大文字はそのまま残ります。上の例で拡張子 .JPG が大文字のまま残っているのはこのためです。
2つの関数の違いと使い分け
どちらも「文字列を安全に整える」関数ですが、想定している用途と、結果に残る文字種が異なります。次の表で整理します。
| 観点 | sanitize_title() | sanitize_file_name() |
|---|---|---|
| 主な用途 | URLスラッグ(post_name など) | アップロードするファイル名 |
| 大文字小文字 | すべて小文字化する | 大文字はそのまま残す |
| スペースの扱い | ハイフンに変換 | ハイフンに変換 |
| 拡張子(ドット) | ドットは除去される傾向 | 拡張子を保持する |
| 日本語 | %エンコードされる | ファイル名として残せる |
ざっくり言えば、URLのスラッグを作りたいなら sanitize_title()、アップロードするファイルの保存名を整えたいなら sanitize_file_name() と覚えておくと迷いません。ファイル名の整形にスラッグ用の関数を使うと拡張子が失われるなど、用途に合わない結果になります。目的に応じて正しい方を選ぶことが大切です。
実践的な使い方
投稿のスラッグを整形して登録する
プログラムから投稿を作成する wp_insert_post() では、スラッグにあたる post_name を指定できます。ここに sanitize_title() で整えた文字列を渡すことで、安全なスラッグを持つ投稿を作れます。
<?php
$title = 'My First Blog Post!';
$post_id = wp_insert_post(array(
'post_title' => $title,
'post_name' => sanitize_title($title), // 'my-first-blog-post'
'post_status' => 'publish',
));
なお post_name を明示的に渡さなくても、WordPress はタイトルから自動でスラッグを生成します。その内部でも sanitize_title() が使われています。自分で整形した値を渡したいときや、独自ルールでスラッグを組み立てたいときに、この関数を直接使うと便利です。
保存するファイル名を整える
独自にファイルを保存する処理を書く場合、ユーザー由来の文字列をそのままファイル名にするのは危険です。sanitize_file_name() を通してから使うことで、不正な文字を含まない名前にできます。
<?php
$raw_name = 'user report: 2026/07.csv';
$safe_name = sanitize_file_name($raw_name);
// 'user-report-202607.csv' のような安全な名前になる
$path = wp_upload_dir()['path'] . '/' . $safe_name;
このように、外部から受け取った文字列は保存前に必ず整形しておくと、ファイルシステム上のトラブルを避けられます。
つまずきやすいポイント
日本語タイトルでスラッグが空や%表記になる
最もよく遭遇するのが、日本語タイトルを sanitize_title() に渡したときの挙動です。前述のとおり日本語はローマ字化されず、%エンコードされた文字列になります。英字スラッグにならないと感じたら、これが原因です。対策としては、投稿画面でスラッグを手動で英字に設定するか、プログラムで post_name に英字の値を明示的に渡すのが確実です。
アクセント記号と remove_accents
フランス語やドイツ語などのアクセント付き文字(é や ü など)は、内部で remove_accents() を通してアクセントを取り除いた素のアルファベットに変換される仕組みがあります。そのため café のような文字列は cafe に整えられます。日本語のようにアクセント除去の対象にならない文字は、この処理では英字化されない点に注意してください。
フィルターで挙動が変わることがある
sanitize_title() は、処理の途中で sanitize_title という名前のフィルターを通します。つまり、プラグインやテーマがこのフィルターにフックしていると、標準とは異なる整形結果になる可能性があります。日本語をローマ字スラッグに変換するプラグインなどは、この仕組みを利用しています。想定と違う結果が返るときは、フィルターに介入するコードがないかも確認するとよいでしょう。
まとめ
sanitize_title() は文字列をURLスラッグ用に整形する関数で、小文字化・スペースやアンダースコアのハイフン化・記号除去・連続ハイフンの整理を行います。日本語はデフォルトで%エンコードされる点に注意が必要です。一方 sanitize_file_name() は、ファイル名に使えない特殊文字を取り除いて安全なファイル名を作り、拡張子を保持します。用途が「URLか、ファイル名か」で2つを使い分ければ、ユーザー入力やタイトルから安全な文字列を確実に得られます。手作業での置換に頼らず、これらの関数を活用しましょう。