T-CREATOR

WordPress URL 設計とリライトルール:正規化と SEO を両立する作法

WordPress URL 設計とリライトルール:正規化と SEO を両立する作法

WordPress サイトを運営していると、「なぜか同じページに複数の URL でアクセスできてしまう」「SEO で不利になっているかもしれない」と感じたことはありませんか。実は、これは WordPress の柔軟な URL 設計が招く、よくある課題なのです。

この記事では、WordPress の URL 正規化と SEO 最適化を両立させるために必要な、リライトルールの基礎から実践的な設定方法まで、段階的に解説していきます。初心者の方でも実装できるよう、コード例と図解を豊富に用意しましたので、ぜひ最後までお読みください。

背景

WordPress の URL 構造とパーマリンク

WordPress は CMS として非常に柔軟な URL 設計を可能にしています。管理画面の「設定」→「パーマリンク設定」から、投稿やページの URL 構造を簡単に変更できますね。

しかし、この柔軟性が時として問題を引き起こします。たとえば、以下のような複数の URL が同じコンテンツを指してしまうことがあるのです。

rubyhttps://example.com/sample-post/
https://example.com/sample-post
https://example.com/?p=123
https://example.com/index.php/sample-post/

リライトルールの役割

WordPress は Apache や Nginx などの Web サーバー上で動作しますが、URL を WordPress 内部のクエリパラメータに変換する仕組みが リライトルール です。

WordPress のコアには、次のような URL 変換処理が組み込まれています。

  • ​/​category​/​tech​/​?category_name=tech
  • ​/​2024​/​01​/​sample​/​?year=2024&monthnum=01&name=sample
  • ​/​author​/​john​/​?author_name=john

以下の図は、WordPress における URL リライトの基本的な流れを示しています。

mermaidflowchart LR
  browser["ブラウザ"] -->|URL アクセス| server["Web サーバー"]
  server -->|".htaccess で<br/>リダイレクト"| wp["WordPress<br/>index.php"]
  wp -->|"リライトルール<br/>解析"| query["クエリ変数<br/>(?p=123 など)"]
  query -->|"WP_Query<br/>実行"| db[("MySQL")]
  db -->|"コンテンツ取得"| wp
  wp -->|"テーマ表示"| browser

このように、WordPress は人間が読みやすい URL を内部的なクエリに変換し、データベースから適切なコンテンツを取得しています。しかし、リライトルールが適切に管理されていないと、重複 URL や SEO 上の問題が発生してしまうのです。

SEO への影響

検索エンジンは、同じコンテンツに複数の URL でアクセスできる状態を「重複コンテンツ」と判断することがあります。これにより、以下のような SEO 上の問題が生じます。

#問題点影響
1ページ評価の分散リンクパワーが複数 URL に分散し、検索順位が下がる
2クロール効率の低下検索エンジンのクローラーが無駄なページを巡回する
3インデックス混乱意図しない URL が検索結果に表示される

これらの問題を解決するために、URL の正規化が重要になってくるのです。

課題

重複 URL が発生する具体的なケース

WordPress では、以下のような状況で重複 URL が発生しやすくなっています。

トレイリングスラッシュの有無

WordPress は末尾のスラッシュ(​/​)の有無で異なる URL を生成することがあります。

rubyhttps://example.com/about/
https://example.com/about

この 2 つの URL は、設定によっては同じページを表示してしまいます。

クエリパラメータ形式の URL

パーマリンク設定を変更する前の古い URL 形式が残っている場合です。

rubyhttps://example.com/?p=123
https://example.com/sample-post/

index.php を含む URL

.htaccess の設定が不完全な場合、以下のような URL でもアクセスできてしまいます。

arduinohttps://example.com/index.php/sample-post/
https://example.com/sample-post/

ページネーションの URL

アーカイブページのページング URL も、複数の形式が存在することがあります。

rubyhttps://example.com/category/tech/page/2/
https://example.com/category/tech/?paged=2

以下の図は、WordPress で発生しやすい重複 URL のパターンを示しています。

mermaidflowchart TD
  original["正規 URL<br/>/sample-post/"]
  dup1["重複1<br/>/sample-post"]
  dup2["重複2<br/>?p=123"]
  dup3["重複3<br/>/index.php/sample-post/"]

  original -.->|"同一コンテンツ"| dup1
  original -.->|"同一コンテンツ"| dup2
  original -.->|"同一コンテンツ"| dup3

  search["検索エンジン"] -->|"クロール"| original
  search -->|"クロール"| dup1
  search -->|"クロール"| dup2
  search -->|"クロール"| dup3

  style original fill:#90EE90
  style dup1 fill:#FFB6C1
  style dup2 fill:#FFB6C1
  style dup3 fill:#FFB6C1

リライトルール設定の複雑さ

WordPress のリライトルールは、正規表現を用いた複雑な仕組みで管理されています。

php// WordPress コアのリライトルール例
add_rewrite_rule(
    '^category/(.+?)/?$',
    'index.php?category_name=$matches[1]',
    'top'
);

この仕組みを理解せずにカスタマイズを行うと、以下のような問題が発生します。

#問題原因
1404 エラーの多発リライトルールの優先順位ミス
2意図しないページ表示正規表現のマッチングミス
3リダイレクトループリダイレクト先の URL が再度リライトされる

canonical タグの設定漏れ

WordPress は自動的に <link rel="canonical"> タグを出力しますが、カスタム投稿タイプやプラグインの影響で正しく設定されないケースがあります。

html<!-- 期待される canonical タグ -->
<link
  rel="canonical"
  href="https://example.com/sample-post/"
/>

<!-- 実際に出力されているタグ(間違った例) -->
<link rel="canonical" href="https://example.com/?p=123" />

これにより、検索エンジンが正規 URL を誤認識してしまう可能性があるのです。

解決策

リライトルールの基本理解

WordPress のリライトルールは、以下の 3 つの要素で構成されています。

パターン(正規表現)

URL のパターンを正規表現で定義します。

php// カテゴリーページのパターン例
'^category/(.+?)/?$'

クエリ

WordPress 内部で処理するクエリ変数を指定します。

php// category_name クエリ変数に変換
'index.php?category_name=$matches[1]'

優先度

リライトルールの適用順序を制御します。

  • top: 最優先で処理
  • bottom: 後回しで処理

以下の図は、リライトルールがどのように優先度順に処理されるかを示しています。

mermaidflowchart TD
  request["URL リクエスト<br/>/category/tech/"]

  check1{"優先度 top<br/>ルールマッチ?"}
  check2{"優先度 bottom<br/>ルールマッチ?"}
  check3{"WordPress<br/>デフォルトルール"}

  result1["クエリ生成<br/>?category_name=tech"]
  result2["404 エラー"]

  request --> check1
  check1 -->|"Yes"| result1
  check1 -->|"No"| check2
  check2 -->|"Yes"| result1
  check2 -->|"No"| check3
  check3 -->|"マッチ"| result1
  check3 -->|"マッチせず"| result2

  style result1 fill:#90EE90
  style result2 fill:#FFB6C1

トレイリングスラッシュの統一

WordPress では、user_trailingslashit() 関数を使ってトレイリングスラッシュを統一できます。

パーマリンク設定の確認

まず、WordPress 管理画面で現在のパーマリンク設定を確認しましょう。

「設定」→「パーマリンク設定」で、「投稿名」や「カスタム構造」を選択している場合、トレイリングスラッシュ付きが標準となります。

functions.php での統一処理

以下のコードを functions.php に追加することで、トレイリングスラッシュのない URL へのアクセスを自動的にリダイレクトできます。

php/**
 * トレイリングスラッシュを強制的に追加
 */
function enforce_trailing_slash() {
    // 管理画面やログインページは除外
    if (is_admin() || is_feed() || is_robots() || is_trackback()) {
        return;
    }

    $url = $_SERVER['REQUEST_URI'];

このコードは、現在のリクエスト URL を取得します。$_SERVER['REQUEST_URI'] には、ドメイン以降のパス部分が格納されています。

php    // クエリパラメータを分離
    $parsed_url = parse_url($url);
    $path = $parsed_url['path'];
    $query = isset($parsed_url['query']) ? '?' . $parsed_url['query'] : '';

parse_url() 関数を使って、パス部分とクエリパラメータ部分を分離します。これにより、クエリパラメータを保持したままリダイレクトできます。

php    // 末尾がスラッシュでない、かつファイル拡張子がない場合
    if (substr($path, -1) !== '/' && strpos($path, '.') === false) {
        wp_redirect(home_url($path . '/' . $query), 301);
        exit;
    }
}
add_action('template_redirect', 'enforce_trailing_slash');

この部分で、トレイリングスラッシュがない URL を検出し、301 リダイレクト(恒久的な移転)を実行します。wp_redirect() は WordPress 標準のリダイレクト関数です。

カスタムリライトルールの追加

カスタム投稿タイプや特殊な URL 構造を実装する場合、リライトルールを追加する必要があります。

カスタム投稿タイプの登録

まず、カスタム投稿タイプを登録する際に、リライトルールも同時に設定します。

php/**
 * カスタム投稿タイプ「製品」を登録
 */
function register_product_post_type() {
    $args = array(
        'label' => '製品',
        'public' => true,
        'has_archive' => true,

has_archivetrue にすることで、アーカイブページ(一覧ページ)を自動生成できます。

php        'rewrite' => array(
            'slug' => 'products',           // URL のスラッグ
            'with_front' => false,          // パーマリンク設定のプレフィックスを使わない
            'feeds' => true,                 // フィード URL を生成
            'pages' => true,                 // ページネーション対応
        ),

rewrite パラメータで、URL 構造を細かく制御できます。with_frontfalse にすると、パーマリンク設定の ​/​blog​/​ などのプレフィックスが付かなくなります。

php        'capability_type' => 'post',
        'supports' => array('title', 'editor', 'thumbnail'),
    );

    register_post_type('product', $args);
}
add_action('init', 'register_product_post_type');

init アクションフックで実行することで、WordPress の初期化時にカスタム投稿タイプが登録されます。

カスタムリライトルールの追加

より複雑な URL 構造が必要な場合は、add_rewrite_rule() を使います。

php/**
 * カスタムリライトルールを追加
 * 例: /products/category/electronics/ のような URL を実現
 */
function add_custom_rewrite_rules() {
    // 製品カテゴリーページのルール
    add_rewrite_rule(
        '^products/category/([^/]+)/?$',
        'index.php?post_type=product&product_category=$matches[1]',
        'top'
    );

正規表現 ^products​/​category​/​([^​/​]+)​/​?$ は、​/​products​/​category​/​ の後に続く文字列をキャプチャします。([^​/​]+) は「スラッシュ以外の 1 文字以上」を意味します。

php    // 製品カテゴリーのページネーション対応
    add_rewrite_rule(
        '^products/category/([^/]+)/page/([0-9]+)/?$',
        'index.php?post_type=product&product_category=$matches[1]&paged=$matches[2]',
        'top'
    );
}
add_action('init', 'add_custom_rewrite_rules');

ページネーション用のルールも追加することで、​/​products​/​category​/​electronics​/​page​/​2​/​ のような URL に対応できます。

クエリ変数の登録

カスタムクエリ変数を使う場合は、WordPress に認識させる必要があります。

php/**
 * カスタムクエリ変数を登録
 */
function add_custom_query_vars($vars) {
    $vars[] = 'product_category';
    return $vars;
}
add_filter('query_vars', 'add_custom_query_vars');

query_vars フィルターフックを使って、product_category という変数を WordPress に登録します。これにより、get_query_var('product_category') で値を取得できるようになります。

リライトルールのフラッシュ

リライトルールを追加・変更した後は、必ずフラッシュ(再生成)が必要です。

php/**
 * テーマ有効化時にリライトルールをフラッシュ
 */
function flush_rewrite_rules_on_activation() {
    // カスタム投稿タイプとリライトルールを登録
    register_product_post_type();
    add_custom_rewrite_rules();

    // リライトルールをフラッシュ
    flush_rewrite_rules();
}
register_activation_hook(__FILE__, 'flush_rewrite_rules_on_activation');

注意: flush_rewrite_rules() は処理負荷が高いため、テーマやプラグインの有効化時のみ実行し、毎回のページロードで実行してはいけません。

canonical タグの適切な設定

WordPress は Yoast SEO や Rank Math などの SEO プラグインを使わなくても、標準で canonical タグを出力します。しかし、カスタマイズが必要な場合もあります。

WordPress 標準の canonical 出力

WordPress は wp_head() 関数内で自動的に canonical タグを出力します。

php// WordPress コア内部の処理(参考)
function rel_canonical() {
    if (!is_singular()) {
        return;
    }

    $id = get_queried_object_id();
    $url = get_permalink($id);

    echo '<link rel="canonical" href="' . esc_url($url) . '" />' . "\n";
}
add_action('wp_head', 'rel_canonical');

しかし、この標準機能は単一ページにのみ対応しており、アーカイブページやカスタム投稿タイプには十分に対応していません。

カスタム canonical タグの実装

より細かく制御するには、以下のようなコードを追加します。

php/**
 * カスタム canonical タグを出力
 */
function output_custom_canonical() {
    // WordPress 標準の canonical を削除
    remove_action('wp_head', 'rel_canonical');

    $canonical_url = '';

まず、WordPress 標準の canonical 出力を無効化します。

php    if (is_singular()) {
        // 単一ページの場合
        $canonical_url = get_permalink();
    } elseif (is_archive()) {
        // アーカイブページの場合
        $canonical_url = get_pagenum_link();

get_pagenum_link() は、ページネーションを考慮した URL を返します。これにより、​/​page​/​2​/​ などのページでも正しい canonical が設定されます。

php    } elseif (is_search()) {
        // 検索結果ページの場合
        $canonical_url = get_search_link();
    } elseif (is_front_page()) {
        // トップページの場合
        $canonical_url = home_url('/');
    }

各ページタイプに応じて、適切な canonical URL を設定します。

php    if ($canonical_url) {
        echo '<link rel="canonical" href="' . esc_url($canonical_url) . '" />' . "\n";
    }
}
add_action('wp_head', 'output_custom_canonical', 1);

esc_url() でサニタイズし、安全な URL として出力します。優先度 1 を指定することで、他のプラグインより先に実行されます。

.htaccess での URL 正規化

WordPress の .htaccess ファイルでも、URL 正規化を強化できます。

www の有無を統一

サブドメイン www の有無を統一することも、SEO 上重要です。

apache# www なしに統一する場合
RewriteEngine On
RewriteCond %{HTTP_HOST} ^www\.example\.com [NC]
RewriteRule ^(.*)$ https://example.com/$1 [L,R=301]

RewriteCond で条件を設定し、www.example.com でアクセスされた場合、example.com にリダイレクトします。[NC] は大文字小文字を区別しないフラグです。

HTTPS へのリダイレクト

HTTP から HTTPS へのリダイレクトも、.htaccess で設定できます。

apache# HTTP から HTTPS へリダイレクト
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

%{HTTPS} off で HTTP アクセスを検出し、HTTPS にリダイレクトします。

index.php を除去

URL から index.php を除去することで、よりクリーンな URL を実現できます。

apache# index.php を含む URL をリダイレクト
RewriteEngine On
RewriteCond %{THE_REQUEST} ^.*/index\.php
RewriteRule ^(.*)index\.php$ /$1 [R=301,L]

%{THE_REQUEST} は、ブラウザからの実際のリクエストを確認するための変数です。これにより、内部リライトと外部アクセスを区別できます。

完全な .htaccess 例

以下は、WordPress で推奨される .htaccess の完全な例です。

apache# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /

# www なしに統一
RewriteCond %{HTTP_HOST} ^www\.example\.com [NC]
RewriteRule ^(.*)$ https://example.com/$1 [L,R=301]

# HTTPS にリダイレクト
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

# index.php を除去
RewriteCond %{THE_REQUEST} ^.*/index\.php
RewriteRule ^(.*)index\.php$ /$1 [R=301,L]

# WordPress 標準のリライト
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress

この設定により、すべての URL が正規化され、SEO に最適な状態になります。

具体例

ケーススタディ:EC サイトの URL 設計

実際の EC サイトを例に、WordPress での URL 設計とリライトルールを実装してみましょう。

要件定義

以下のような URL 構造を実現したいとします。

#ページタイプURL 例
1商品一覧​/​shop​/​
2カテゴリー別一覧​/​shop​/​electronics​/​
3商品詳細​/​shop​/​smartphone-x​/​
4ブランド別一覧​/​brand​/​sony​/​
5セール商品​/​sale​/​

以下の図は、この EC サイトの URL 構造を示しています。

mermaidflowchart TD
  home["トップページ<br/>/"]

  shop["商品一覧<br/>/shop/"]
  category["カテゴリー<br/>/shop/electronics/"]
  product["商品詳細<br/>/shop/smartphone-x/"]

  brand_list["ブランド一覧<br/>/brand/"]
  brand_items["ブランド商品<br/>/brand/sony/"]

  sale["セール<br/>/sale/"]

  home --> shop
  shop --> category
  category --> product

  home --> brand_list
  brand_list --> brand_items

  home --> sale

  style home fill:#87CEEB
  style product fill:#90EE90

カスタム投稿タイプの登録

まず、商品用のカスタム投稿タイプを作成します。

php/**
 * 商品カスタム投稿タイプを登録
 */
function register_product_cpt() {
    register_post_type('product', array(
        'labels' => array(
            'name' => '商品',
            'singular_name' => '商品',
        ),
        'public' => true,
        'has_archive' => 'shop',  // アーカイブ URL を /shop/ に設定
        'rewrite' => array(
            'slug' => 'shop',
            'with_front' => false,
        ),
        'supports' => array('title', 'editor', 'thumbnail', 'excerpt'),
        'show_in_rest' => true,  // ブロックエディタ対応
    ));

has_archive に文字列を指定することで、アーカイブページの URL をカスタマイズできます。

カスタムタクソノミーの登録

カテゴリーとブランドをタクソノミーとして登録します。

php    // 商品カテゴリー
    register_taxonomy('product_category', 'product', array(
        'labels' => array(
            'name' => '商品カテゴリー',
            'singular_name' => 'カテゴリー',
        ),
        'hierarchical' => true,  // 階層構造を持つ
        'rewrite' => array(
            'slug' => 'shop',
            'with_front' => false,
            'hierarchical' => true,  // URL に階層を反映
        ),
    ));

hierarchicaltrue にすることで、親子関係を持つカテゴリー構造を実現できます。

php    // ブランド
    register_taxonomy('brand', 'product', array(
        'labels' => array(
            'name' => 'ブランド',
            'singular_name' => 'ブランド',
        ),
        'hierarchical' => false,
        'rewrite' => array(
            'slug' => 'brand',
            'with_front' => false,
        ),
    ));
}
add_action('init', 'register_product_cpt');

ブランドは階層構造を持たないため、hierarchicalfalse にします。

セールページのリライトルール

特殊なページとして、セール商品一覧を実装します。

php/**
 * セールページ用のリライトルールを追加
 */
function add_sale_rewrite_rule() {
    add_rewrite_rule(
        '^sale/?$',
        'index.php?post_type=product&sale=1',
        'top'
    );

    // ページネーション対応
    add_rewrite_rule(
        '^sale/page/([0-9]+)/?$',
        'index.php?post_type=product&sale=1&paged=$matches[1]',
        'top'
    );
}
add_action('init', 'add_sale_rewrite_rule');

カスタムクエリ変数 sale を使って、セール商品のみを抽出します。

php/**
 * カスタムクエリ変数を登録
 */
function add_sale_query_var($vars) {
    $vars[] = 'sale';
    return $vars;
}
add_filter('query_vars', 'add_sale_query_var');

この変数を WordPress に認識させることで、クエリに使用できるようになります。

セール商品のクエリ修正

実際にセール商品のみを表示するため、クエリを修正します。

php/**
 * セール商品のみを表示するようクエリを修正
 */
function modify_sale_query($query) {
    // メインクエリかつ、sale パラメータがある場合
    if (!is_admin() && $query->is_main_query() && get_query_var('sale')) {
        // カスタムフィールド 'on_sale' が '1' の商品のみ取得
        $query->set('meta_key', 'on_sale');
        $query->set('meta_value', '1');
    }
}
add_action('pre_get_posts', 'modify_sale_query');

pre_get_posts アクションフックを使うことで、データベースクエリが実行される前にパラメータを変更できます。

テンプレートファイルの作成

各 URL に対応するテンプレートファイルを作成します。

#URLテンプレートファイル
1​/​shop​/​archive-product.php
2​/​shop​/​electronics​/​taxonomy-product_category.php
3​/​shop​/​smartphone-x​/​single-product.php
4​/​brand​/​sony​/​taxonomy-brand.php
5​/​sale​/​archive-product.php(条件分岐で表示を変更)

パンくずリスト対応 canonical の実装

EC サイトでは、パンくずリストと canonical の整合性も重要です。

php/**
 * 商品ページの canonical を設定
 */
function set_product_canonical() {
    if (is_singular('product')) {
        remove_action('wp_head', 'rel_canonical');

        $product_id = get_the_ID();
        $canonical_url = get_permalink($product_id);

商品ページでは、常に正規の URL を canonical として設定します。

php        // クエリパラメータを除去
        $canonical_url = strtok($canonical_url, '?');

        echo '<link rel="canonical" href="' . esc_url($canonical_url) . '" />' . "\n";
    }
}
add_action('wp_head', 'set_product_canonical', 1);

strtok() 関数を使って、クエリパラメータを除去した URL を canonical として設定します。これにより、UTM パラメータなどが付いた URL でアクセスされても、正規 URL が指定されます。

デバッグ方法

リライトルールが正しく動作しているか確認する方法をご紹介します。

Rewrite Rules Inspector プラグイン

WordPress プラグイン「Rewrite Rules Inspector」を使うと、現在有効なリライトルールを一覧表示できます。

インストール手順:

  1. WordPress 管理画面で「プラグイン」→「新規追加」
  2. 「Rewrite Rules Inspector」を検索
  3. インストール後、有効化
  4. 「ツール」→「Rewrite Rules」で確認

手動でのデバッグ

プラグインを使わずに、コードでリライトルールを確認する方法もあります。

php/**
 * 現在のリライトルールをダンプ(デバッグ用)
 */
function debug_rewrite_rules() {
    // 管理者のみ実行
    if (!current_user_can('manage_options')) {
        return;
    }

    global $wp_rewrite;

$wp_rewrite グローバル変数には、すべてのリライトルール情報が格納されています。

php    echo '<pre>';
    print_r($wp_rewrite->rules);
    echo '</pre>';

    // 強制終了(デバッグ時のみ)
    exit;
}
// 一時的に有効化(デバッグ後は必ずコメントアウト)
// add_action('init', 'debug_rewrite_rules', 999);

このコードを一時的に有効化することで、ブラウザ上でリライトルールを確認できます。デバッグ後は必ずコメントアウトしてください。

クエリ変数の確認

どのクエリ変数が使われているかを確認するには、以下のコードが便利です。

php/**
 * 現在のクエリ変数を表示(デバッグ用)
 */
function debug_query_vars() {
    if (!current_user_can('manage_options')) {
        return;
    }

    global $wp_query;

    echo '<div style="background:#f0f0f0; padding:20px; margin:20px;">';
    echo '<h3>クエリ変数:</h3>';
    echo '<pre>';
    print_r($wp_query->query_vars);
    echo '</pre>';
    echo '</div>';
}
// 一時的に有効化
// add_action('wp_footer', 'debug_query_vars');

このコードをフッターに出力することで、各ページでどのクエリ変数が有効になっているか確認できます。

リダイレクトチェーンの確認

複数のリダイレクトが発生していないか、curl コマンドで確認できます。

bash# ターミナルで実行
curl -I -L https://example.com/sample-post

# -I: ヘッダーのみ表示
# -L: リダイレクトを追跡

このコマンドを実行すると、HTTP ステータスコードとリダイレクト先が表示されます。理想的には、1 回の 301 リダイレクトのみで最終的な URL に到達すべきです。

正常な出力例:

arduinoHTTP/2 301
location: https://example.com/sample-post/

HTTP/2 200

問題のある出力例(リダイレクトループ):

arduinoHTTP/2 301
location: https://example.com/sample-post/

HTTP/2 301
location: https://example.com/sample-post

HTTP/2 301
location: https://example.com/sample-post/
...

まとめ

この記事では、WordPress の URL 設計とリライトルールについて、正規化と SEO を両立する実装方法を解説してきました。重要なポイントを振り返ってみましょう。

押さえるべき要点

WordPress の URL 正規化で重要なのは、以下の 5 つです。

  1. トレイリングスラッシュの統一: 末尾のスラッシュ有無を一貫させることで、重複 URL を防ぐ
  2. 適切なリライトルール設計: カスタム投稿タイプやタクソノミーに合わせた URL 構造を実装
  3. canonical タグの正確な設定: 検索エンジンに正規 URL を明示的に伝える
  4. .htaccess での統一: www の有無、HTTPS、index.php の除去をサーバーレベルで制御
  5. 継続的なデバッグ: リライトルールが意図通り動作しているか定期的に確認

SEO 効果の測定

URL 正規化を実装した後は、Google Search Console で以下の指標を確認しましょう。

#確認項目期待される変化
1インデックス数重複ページが減少
2クロール統計情報クロールエラーが減少
3検索パフォーマンスクリック率、表示回数が改善
4ページエクスペリエンスCore Web Vitals の改善

通常、実装から 2〜4 週間程度で効果が現れ始めます。

運用時の注意点

WordPress サイトを運用する際は、以下の点に注意してください。

プラグインとの競合: SEO プラグインや URL 変更プラグインを使用する場合、カスタムコードとの競合に注意が必要です。特に、Yoast SEO や Rank Math を使用している場合は、canonical タグの出力が重複しないよう確認しましょう。

パーマリンク変更のリスク: 既存サイトでパーマリンク構造を変更する際は、必ず 301 リダイレクトを設定してください。リダイレクトなしで変更すると、既存の被リンクや検索エンジンの評価が失われてしまいます。

パフォーマンスへの影響: flush_rewrite_rules() は処理負荷が高いため、本番環境では頻繁に実行しないようにしましょう。テーマやプラグインの有効化時のみ実行するのが適切です。

次のステップ

この記事で学んだ内容を実践したら、さらに以下のトピックにも挑戦してみてください。

  • 多言語サイトの URL 設計: WPML や Polylang を使った多言語対応の URL 構造
  • AMP ページの URL 正規化: AMP 版ページと通常版ページの canonical 設定
  • REST API のエンドポイント追加: カスタムリライトルールを使った API エンドポイント設計
  • サイトマップ最適化: XML サイトマップに正規 URL のみを含める設定

WordPress の URL 設計は、一度しっかり設定すれば長期的に SEO 効果を発揮してくれます。ぜひこの記事を参考に、あなたのサイトに最適な URL 構造を実装してみてください。

関連リンク