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への転送を設定します。これをやらないと、積み上げた評価も、他サイトから張られたリンクも失われます。

  1. 変更前に、いまのURLの一覧を控える
  2. パーマリンク設定を変更する
  3. 旧URLから新URLへ301を設定する
  4. サイト内のリンクを新URLに直す
  5. Search Console でエラーが増えていないか確認する

記事数が多い場合は、転送の一覧を作る作業そのものが大きくなります。公開前に決めておくのが一番安いという理由はここにあります。

パーマリンクが効かなくなったら

記事だけが全部404になる場合、原因は2つです。URLを書き換えるための設定ファイル(.htaccess)が失われているか、WordPress が持っている書き換え規則が古いままになっているかです。どちらも、設定 > パーマリンク の画面で変更を保存し直すと書き出され直し、復旧することが多いです。

カスタム投稿タイプを追加した直後に404になるのも同じ理由です。コードは正しいのに表示されない場合は、まずこの保存をしてみてください。

リニューアル前にご相談ください

URL設計と転送の設計は、リニューアルで最も取り返しがつかない部分です。当社では構築時にここを含めて設計し、旧サイトからの転送一覧まで作成してお渡ししています。

「用語・技術解説」のコラム

この記事と同じカテゴリの記事です。

一覧に戻る

SERVICES

WordPressとECサイトの制作、
まとめてご相談いただけます

WordPress

WordPress制作・構築代行

デザインデータやコーディング済みHTMLを、オリジナルテーマとして構築します。プラグイン開発も対応。

構築基本費用 50,000円

詳しく見る
コーディング

コーディング代行

デザインデータをHTML/CSSに起こします。WordPress化まで通しでも、コーディングだけでも承ります。

1ページ 15,000円〜

詳しく見る
React

Reactコーディング代行

デザインデータをReactのコンポーネントとして実装します。既存アプリへの画面追加・UI改修だけでも承ります。

1ページ 18,000円〜

詳しく見る
Next.js

Next.js制作・コーディング代行

検索エンジンに読まれるHTMLを返せるNext.jsで構築します。静的書き出しでレンタルサーバーでも公開できます。

1ページ 18,000円〜

詳しく見る
EC / WordPress

WelcartでのECサイト構築

WordPress専用のネットショップ構築プラグイン。機能面まで踏み込んだカスタマイズができます。

デザイン制作+構築 一式 120万円〜

詳しく見る
EC / EC-CUBE

EC-CUBEでのECサイト構築

国産オープンソースのECパッケージ。決済・受注・在庫まわりを業務に合わせて作り込めます。

デザイン制作+構築 一式 120万円〜

詳しく見る
EC / ASPカート

ECサイト制作代行

Shopify・MakeShop・カラーミーなどのカートに、オリジナルデザインを組み込みます。

構築基本費用 100,000円

詳しく見る

制作のご相談も承っています

デザインデータと画面数をお知らせいただければ、お見積りと納期をご提示します。