2026年5月20日

2026年5月20日

WordPressのパーマリンクをSEOに最適化する方法

はじめに

URLはSEOに直接影響する重要な要素です。短くて意味のあるURLはクリック率を高め、クローラーがコンテンツを正しく理解する助けになります。パーマリンク構造の最適化・スラッグの設定・canonical タグの適切な利用がSEOの基盤となります。

症状・原因

  • URLに日本語が含まれてエンコードされた長いURLになっている
  • カテゴリのURLが /category/news/ と冗長になっている
  • パーマリンクを変更したら旧URLがリンク切れになった
  • 同じコンテンツが複数URLでアクセスできて重複コンテンツになっている

解決手順

ステップ1:パーマリンク構造を最適化する

推奨パーマリンク設定:
管理画面 → 設定 → パーマリンク → 「投稿名」を選択

URL例:
✅ https://example.com/wordpress-seo-tips/    (英数字スラッグ)
✅ https://example.com/news/wordpress-seo/    (カテゴリ/スラッグ)
❌ https://example.com/?p=123                  (クエリパラメータ)
❌ https://example.com/2024/01/01/title/       (日付入り・長い)
❌ https://example.com/%E3%83%AF%E3%83%BC%E3%83%89/ (日本語エンコード)
// functions.php: 投稿のスラッグを自動的に英語化するフィルター
// 日本語タイトルで投稿すると日本語スラッグになるのを防ぐ
function mytheme_default_slug(string $slug, WP_Post $post, string $post_status): string {
    // 日本語文字が含まれている場合はIDベースのスラッグに変更
    if (preg_match('/[^\x00-\x7F]/', $slug)) {
        return (string) $post->ID; // IDをスラッグとして使用
    }
    return $slug;
}
add_filter('wp_unique_post_slug', 'mytheme_default_slug', 10, 3);

ステップ2:カテゴリURLの「category」プレフィックスを削除する

// functions.php

// カテゴリURL: /category/news/ → /news/ に変更
function mytheme_remove_category_prefix(): void {
    global $wp_rewrite;
    $wp_rewrite->extra_permastructs['category']['struct'] = '%category%';
}
add_action('init', 'mytheme_remove_category_prefix');

// ベース変更後はリライトルールをフラッシュ
// (テーマ有効化時に一度だけ実行)
add_action('after_switch_theme', 'flush_rewrite_rules');
// または設定画面から変更する場合:
// 管理画面 → 設定 → パーマリンク → 「オプション」セクション
// カテゴリのベース: (空白にする)
// タグのベース: (空白にする)

ステップ3:パーマリンク変更時に301リダイレクトを設定する

// functions.php: 旧URLから新URLへのリダイレクト

// 個別記事のURLが変わった場合は _old_slug メタを使ってリダイレクト
// WordPressは旧スラッグを _old_slug として自動的に保存している

// 旧スラッグへのアクセスを新URLにリダイレクト(WordPress標準機能)
// wp-includes/query.php の redirect_guess_404_permalink() が処理する

// 大量の旧URLをリダイレクトする場合は .htaccess に記述:
# .htaccess: 旧URLから新URLへの301リダイレクト

# 特定のURLをリダイレクト
Redirect 301 /old-category/old-post/ https://example.com/new-post/

# カテゴリのプレフィックス削除後のリダイレクト
RedirectMatch 301 ^/category/(.*)$ https://example.com/$1

# 日付ベースのURLを投稿名ベースにリダイレクト(Nginxの場合はmap使用)
RewriteRule ^([0-9]{4})/([0-9]{2})/([0-9]{2})/(.+)/?$ /$4/ [R=301,L]

ステップ4:canonicalタグを正しく設定する

// functions.php

function mytheme_canonical_tag(): void {
    // WordPressは rel="canonical" を自動出力する(WP4.6以降)
    // get_canonical_url() で現在のcanonicalURLを取得可能

    // ページネーションでの重複コンテンツ対策
    if (is_paged()) {
        // ページネーションの各ページにはそれぞれのcanonicalを設定
        // (WordPressが自動で設定するため通常は不要)
        return;
    }

    // クエリパラメータ付きURLへのアクセス時に正規URLを示す
    if (!empty($_GET) && is_singular()) {
        $canonical = get_permalink();
        // WordPressが自動出力するcanonicalを上書き
        remove_action('wp_head', 'rel_canonical');
        echo '<link rel="canonical" href="' . esc_url($canonical) . '">' . "\n";
    }
}
add_action('wp_head', 'mytheme_canonical_tag', 1);

// hreflang: 多言語サイトでの言語指定(任意)
function mytheme_hreflang_tags(): void {
    if (!is_singular()) {
        return;
    }

    $ja_url = get_permalink();
    // 英語版URLがある場合(例: /en/ プレフィックス)
    // $en_url = str_replace(home_url('/'), home_url('/en/'), $ja_url);

    echo '<link rel="alternate" hreflang="ja" href="' . esc_url($ja_url) . '">' . "\n";
    echo '<link rel="alternate" hreflang="x-default" href="' . esc_url($ja_url) . '">' . "\n";
}

ステップ5:URLの末尾スラッシュを統一する

// functions.php: 末尾スラッシュなしURLをスラッシュありにリダイレクト
// (WordPressはデフォルトで末尾スラッシュを追加する)

// .htaccess でスラッシュを強制(Apacheの場合)
# .htaccess
<IfModule mod_rewrite.c>
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_URI} !/$
    RewriteRule ^(.*[^/])$ /$1/ [R=301,L]
</IfModule>
// functions.php: WordPressのtrailingslashitフィルター
// デフォルトでスラッシュが付く投稿タイプを変更する場合
add_filter('user_trailingslashit', function(string $url, string $type_of_url): string {
    // 静的ファイルにはスラッシュを付けない
    if (preg_match('/\.(css|js|png|jpg|webp|pdf)$/', $url)) {
        return rtrim($url, '/');
    }
    return $url;
}, 10, 2);

注意事項

  • パーマリンクを変更すると既存のURLがすべて変わります。被リンクやSNSでのシェアが無効になるため、301リダイレクトを必ず設定してから変更してください
  • カテゴリのベースURLを削除すると固定ページとカテゴリのURLが衝突する場合があります。同じスラッグの固定ページとカテゴリが存在しないか確認してください
  • Googleはcanonicalタグをヒントとして扱い、必ずしも従うわけではありません。重複コンテンツの根本的な解決(URLの統一)が最優先です

まとめ

パーマリンクは「投稿名」に設定し、日本語スラッグを wp_unique_post_slug フィルターで英語化します。カテゴリURLの category/ プレフィックスは $wp_rewrite で削除できます。変更時は .htaccess で301リダイレクトを設定し、WordPressのcanonical自動出力でクエリパラメータ付きURLの重複コンテンツを防ぎます。

お気軽にご相談ください

お見積りへ お問い合わせへ