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'
);
この仕組みを理解せずにカスタマイズを行うと、以下のような問題が発生します。
| # | 問題 | 原因 |
|---|---|---|
| 1 | 404 エラーの多発 | リライトルールの優先順位ミス |
| 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_archive を true にすることで、アーカイブページ(一覧ページ)を自動生成できます。
php 'rewrite' => array(
'slug' => 'products', // URL のスラッグ
'with_front' => false, // パーマリンク設定のプレフィックスを使わない
'feeds' => true, // フィード URL を生成
'pages' => true, // ページネーション対応
),
rewrite パラメータで、URL 構造を細かく制御できます。with_front を false にすると、パーマリンク設定の /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 に階層を反映
),
));
hierarchical を true にすることで、親子関係を持つカテゴリー構造を実現できます。
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');
ブランドは階層構造を持たないため、hierarchical を false にします。
セールページのリライトルール
特殊なページとして、セール商品一覧を実装します。
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」を使うと、現在有効なリライトルールを一覧表示できます。
インストール手順:
- WordPress 管理画面で「プラグイン」→「新規追加」
- 「Rewrite Rules Inspector」を検索
- インストール後、有効化
- 「ツール」→「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 つです。
- トレイリングスラッシュの統一: 末尾のスラッシュ有無を一貫させることで、重複 URL を防ぐ
- 適切なリライトルール設計: カスタム投稿タイプやタクソノミーに合わせた URL 構造を実装
- canonical タグの正確な設定: 検索エンジンに正規 URL を明示的に伝える
- .htaccess での統一: www の有無、HTTPS、index.php の除去をサーバーレベルで制御
- 継続的なデバッグ: リライトルールが意図通り動作しているか定期的に確認
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 構造を実装してみてください。
関連リンク
articleWordPress URL 設計とリライトルール:正規化と SEO を両立する作法
articleWordPress × Bedrock/Composer 入門:プラグイン管理をコード化する
articleWordPress 技術アーキテクチャ図解:フック/ループ/クエリの全体像を一枚で理解
articleCI/CD で更新を自動化:GitHub Actions と WordPress の安全デプロイ
articleホワイトスクリーン/500 エラーの解決:WordPress で最初に見る場所
articleキャッシュ比較:WordPress で WP Rocket/LiteSpeed/W3TC を検証
articleCursor の自動テスト生成を検証:Vitest/Jest/Playwright のカバレッジ実測
articleDevin 運用ポリシー策定ガイド:利用権限・レビュー必須条件・ログ保存期間
articleCline × Claude/GPT/Gemini モデル比較:長文理解とコード品質の相性
articleClaude Code が編集差分を誤検出する時:競合・改行コード・改フォーマット問題の直し方
articleConvex で「Permission denied」多発時の原因特定:認可/コンテキスト/引数を総点検
articleBun コマンド チートシート:bun install/run/x/test/build 一括早見表
blogiPhone 17シリーズの発表!全モデルiPhone 16から進化したポイントを見やすく整理
blogGoogleストアから訂正案内!Pixel 10ポイント有効期限「1年」表示は誤りだった
blog【2025年8月】Googleストア「ストアポイント」は1年表記はミス?2年ルールとの整合性を検証
blogGoogleストアの注文キャンセルはなぜ起きる?Pixel 10購入前に知るべき注意点
blogPixcel 10シリーズの発表!全モデル Pixcel 9 から進化したポイントを見やすく整理
blogフロントエンドエンジニアの成長戦略:コーチングで最速スキルアップする方法
review今の自分に満足していますか?『持たざる者の逆襲 まだ何者でもない君へ』溝口勇児
reviewついに語られた業界の裏側!『フジテレビの正体』堀江貴文が描くテレビ局の本当の姿
review愛する勇気を持てば人生が変わる!『幸せになる勇気』岸見一郎・古賀史健のアドラー実践編で真の幸福を手に入れる
review週末を変えれば年収も変わる!『世界の一流は「休日」に何をしているのか』越川慎司の一流週末メソッド
review新しい自分に会いに行こう!『自分の変え方』村岡大樹の認知科学コーチングで人生リセット
review科学革命から AI 時代へ!『サピエンス全史 下巻』ユヴァル・ノア・ハラリが予見する人類の未来