Web制作コラム
WordPressのパーマリンクとは|URL設計と functions.php でのカスタマイズ
WordPress の記事や固定ページのURLを決める設定です。あとから変えると評価を引き継ぐ作業が必要になるため、最初に決める形と、functions.php での変更方法までまとめます。

この記事は WordPress の話です。パーマリンクとは、WordPress が記事・固定ページ・カスタム投稿に割り当てる固定のURLのことで、その形は管理画面の 設定 > パーマリンク で決めます。
一度公開したあとにここを変えると、それまでのURLがすべて404になります。検索からの流入も、他のサイトから張られたリンクも、転送を設定しない限り失われます。公開前に決めておく項目です。
WordPress 以外のサイト(静的サイトや他のCMS)ではこの設定画面はありません。URLの決め方そのものの考え方は共通ですが、この記事で出てくる %postname% や functions.php は WordPress の仕組みです。
おすすめは投稿名だけの形
WordPress の設定 > パーマリンク
/%postname%/この形だと /column/about-wordpress/ のような短いURLになります。短く、中身が推測でき、あとから日付の都合で変えたくならない形です。
避けたほうがよい形
- 日付入り … 2026年の記事が古く見えます。内容を書き直しても日付のURLは変わりません
- 数字のみ … /?p=123 のような形。人にもブラウザの履歴にも意味が伝わりません
- カテゴリを含める … カテゴリを整理し直したくなったときにURLが変わります
ニュースのように日付が意味を持つサイトでは、日付入りが適していることもあります。ただし「月ごとに整理されていると管理しやすい」という理由だけなら、管理画面側で絞り込めるので不要です。
スラッグは英数字で
日本語のままにすると、URLとしては長い記号列に変換されます。コピーして貼ったときに読めなくなり、共有もしにくくなります。記事を作るたびに英数字で入れてください。
- 小文字の英数字とハイフンだけを使う
- 内容が分かる2〜4語程度にする
- 日付や連番は入れない
functions.php でのカスタマイズ
管理画面の設定だけでは足りない場合、テーマの functions.php から変えられます。よく必要になるのは次の4つです。いずれもテーマを更新すると消えるため、既製テーマを使っているなら子テーマか、専用のプラグインに書いてください。
1. カスタム投稿タイプのURLを変える
カスタム投稿タイプを登録するときに rewrite で指定します。slug がURLに入る文字列です。with_front を false にすると、設定 > パーマリンク で決めた前置き(/blog/ など)を付けずに、サイト直下から始まるURLになります。
functions.php
add_action("init", function () {
register_post_type("works", [
"label" => "制作実績",
"public" => true,
"has_archive" => true,
// => /works/スラッグ/ になる
"rewrite" => [
"slug" => "works",
"with_front" => false,
],
"supports" => ["title", "editor", "thumbnail"],
"show_in_rest" => true,
]);
});URLの規則を変えたあとは、管理画面の 設定 > パーマリンク を開いて保存し直してください。WordPress は規則を保存して使い回しているので、これをやらないと新しいURLが404になります。コードで flush_rewrite_rules() を毎回呼ぶのは重いので、テーマやプラグインの有効化時だけにします。
2. 日本語スラッグを自動で英数字にする
記事のタイトルが日本語だと、スラッグも日本語のまま入ります。URLとしては長い記号列に変換されるので、入れ忘れたときだけ投稿IDを使う形に差し替えておくと事故が防げます。
functions.php
add_filter("wp_insert_post_data", function ($data, $postarr) {
// 英数字・ハイフン・アンダースコアだけなら、そのまま使う
if (!empty($data["post_name"])
&& preg_match("/^[a-z0-9_-]+$/", urldecode($data["post_name"]))) {
return $data;
}
// それ以外 (日本語のまま / 未入力) は投稿IDを使う
$data["post_name"] = !empty($postarr["ID"])
? "post-" . $postarr["ID"]
: uniqid("post-");
return $data;
}, 10, 2);公開済みの記事にも効いてしまうと既存のURLが変わります。運用中のサイトに入れる場合は、まず確認用の環境で試し、既存記事のスラッグが書き換わらないことを確かめてください。
3. 独自のURLを足す
投稿やページに対応しないURLを作りたい場合は、書き換え規則を自分で足します。下は /price/wordpress/ のようなURLを、1つのテンプレートで受ける例です。
functions.php
add_action("init", function () {
add_rewrite_tag("%plan%", "([a-z0-9-]+)");
add_rewrite_rule(
"^price/([a-z0-9-]+)/?$",
"index.php?pagename=price&plan=\$matches[1]",
"top"
);
});テンプレート側では get_query_var("plan") で値を受け取ります。この方法は自由度が高いぶん、既存のURLと衝突すると既存ページが表示されなくなるので、追加したら主要なページを一通り開いて確認してください。
4. 旧URLから新URLへ転送する
URL構造を変えたあとの転送は、サーバー側(.htaccess)で設定するのが基本ですが、件数が少ないなら functions.php でも書けます。
functions.php
add_action("template_redirect", function () {
$map = [
"/2026/04/about-wordpress/" => "/column/about-wordpress/",
"/blog/price/" => "/price/",
];
$path = untrailingslashit(parse_url($_SERVER["REQUEST_URI"], PHP_URL_PATH)) . "/";
if (isset($map[$path])) {
wp_redirect(home_url($map[$path]), 301);
exit;
}
});件数が多い場合はこの書き方に向きません。1リクエストごとに配列を読むことになるため、.htaccess か転送用のプラグインを使ってください。
プラグインで済む場合もある
カテゴリのURLから /category/ を消す、投稿タイプごとに構造を変えるといった定番の調整は、専用のプラグインでも行えます。管理画面で設定できるぶん運用は楽ですが、プラグインを外した瞬間にURLが変わるという弱点があります。どちらを選ぶかは、サイトを誰が運用するかで決めてください。
変更するときは301が必須
既に公開していて、検索やSNSからのアクセスがあるURLを変えるなら、旧URLから新URLへの転送を設定します。これをやらないと、積み上げた評価も、他サイトから張られたリンクも失われます。
- 変更前に、いまのURLの一覧を控える
- パーマリンク設定を変更する
- 旧URLから新URLへ301を設定する
- サイト内のリンクを新URLに直す
- Search Console でエラーが増えていないか確認する
記事数が多い場合は、転送の一覧を作る作業そのものが大きくなります。公開前に決めておくのが一番安いという理由はここにあります。
パーマリンクが効かなくなったら
記事だけが全部404になる場合、原因は2つです。URLを書き換えるための設定ファイル(.htaccess)が失われているか、WordPress が持っている書き換え規則が古いままになっているかです。どちらも、設定 > パーマリンク の画面で変更を保存し直すと書き出され直し、復旧することが多いです。
カスタム投稿タイプを追加した直後に404になるのも同じ理由です。コードは正しいのに表示されない場合は、まずこの保存をしてみてください。
リニューアル前にご相談ください
URL設計と転送の設計は、リニューアルで最も取り返しがつかない部分です。当社では構築時にここを含めて設計し、旧サイトからの転送一覧まで作成してお渡ししています。
「用語・技術解説」のコラム
この記事と同じカテゴリの記事です。
WordPressとECサイトの制作、
まとめてご相談いただけます
WordPress制作・構築代行
デザインデータやコーディング済みHTMLを、オリジナルテーマとして構築します。プラグイン開発も対応。
構築基本費用 50,000円
詳しく見るコーディングコーディング代行
デザインデータをHTML/CSSに起こします。WordPress化まで通しでも、コーディングだけでも承ります。
1ページ 15,000円〜
詳しく見るReactReactコーディング代行
デザインデータをReactのコンポーネントとして実装します。既存アプリへの画面追加・UI改修だけでも承ります。
1ページ 18,000円〜
詳しく見るNext.jsNext.js制作・コーディング代行
検索エンジンに読まれるHTMLを返せるNext.jsで構築します。静的書き出しでレンタルサーバーでも公開できます。
1ページ 18,000円〜
詳しく見るEC / WordPressWelcartでのECサイト構築
WordPress専用のネットショップ構築プラグイン。機能面まで踏み込んだカスタマイズができます。
デザイン制作+構築 一式 120万円〜
詳しく見るEC / EC-CUBEEC-CUBEでのECサイト構築
国産オープンソースのECパッケージ。決済・受注・在庫まわりを業務に合わせて作り込めます。
デザイン制作+構築 一式 120万円〜
詳しく見るEC / ASPカートECサイト制作代行
Shopify・MakeShop・カラーミーなどのカートに、オリジナルデザインを組み込みます。
構築基本費用 100,000円
詳しく見る