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の重複コンテンツを防ぎます。