2026年5月20日

2026年5月20日

WordPressのPageSpeed Insightsスコアを改善する方法

はじめに

PageSpeed Insights(PSI)はGoogleが提供するページ速度計測ツールです。スコアはCore Web Vitals(LCP・CLS・INP)に基づいており、Googleの検索ランキングにも影響します。WordPressサイトで90点以上を目指すための具体的な改善手順を解説します。

症状・原因

  • PageSpeed InsightsのスコアがモバイルでRedゾーン(0〜49)になっている
  • 「レンダリングブロックリソースの除去」の警告が出る
  • LCP(最大コンテンツフル描画)が2.5秒を超えている
  • CLS(累積レイアウトシフト)スコアが0.1を超えている

解決手順

ステップ1:現状スコアを計測する

# PageSpeed Insights API でスコア取得
curl "https://www.googleapis.com/pagespeedonline/v5/runPagespeed?url=https://example.com/&strategy=mobile" \
  | python3 -m json.tool | grep -E '"score"|"title"'

# lighthouse CLI でローカル計測
npm install -g lighthouse
lighthouse https://example.com/ --output=html --output-path=report.html --view

ステップ2:LCPを改善する(目標:2.5秒以内)

// functions.php: LCP画像(ファーストビューのアイキャッチ)をpreload

add_action('wp_head', function (): void {
    if (!is_singular()) {
        return;
    }
    if (!has_post_thumbnail()) {
        return;
    }
    $src = wp_get_attachment_image_src(
        get_post_thumbnail_id(),
        'large'
    );
    if (!$src) {
        return;
    }
    // preload でブラウザに優先取得を指示
    echo '<link rel="preload" as="image" href="' . esc_url($src[0]) . '">' . "\n";
}, 1);

// アイキャッチ画像に fetchpriority="high" を追加
add_filter('post_thumbnail_html', function (string $html): string {
    if (is_singular() && in_the_loop()) {
        $html = str_replace(
            'class="attachment-',
            'fetchpriority="high" loading="eager" class="attachment-',
            $html
        );
    }
    return $html;
});

ステップ3:CLSを改善する(目標:0.1未満)

// functions.php: 画像に width/height を自動付与
add_filter('the_content', function (string $content): string {
    // WordPressは5.5以降、wp_filter_content_tags()で自動付与
    // 手動で追加が必要な場合:
    return $content;
});
/* style.css: レイアウトシフトを防ぐCSS */

/* 画像のアスペクト比を確保 */
img {
    max-width: 100%;
    height: auto; /* width/height属性がある場合、CLS防止に有効 */
}

/* アイキャッチ画像コンテナにアスペクト比を設定 */
.post-thumbnail {
    aspect-ratio: 16 / 9;
    overflow: hidden;
}
.post-thumbnail img {
    width: 100%;
    height: 100%;
    object-fit: cover;
}

/* 広告・埋め込みコンテンツの領域を事前確保 */
.ad-container {
    min-height: 250px; /* 広告の高さを事前確保 */
    display: flex;
    align-items: center;
    justify-content: center;
}

/* Webフォント読み込み時のCLSを防ぐ */
body {
    font-display: swap; /* フォント切替時のレイアウトシフトを最小化 */
}

ステップ4:レンダリングブロックを解消する

// functions.php

// CSSを非同期読み込み(クリティカルでないスタイルシート)
add_filter('style_loader_tag', function (string $html, string $handle): string {
    // クリティカルCSSは除外
    $critical = ['main-style', 'theme-style'];
    if (in_array($handle, $critical, true)) {
        return $html;
    }
    // preloadで非同期読み込みに変更
    $html = str_replace("rel='stylesheet'", "rel='preload' as='style' onload=\"this.onload=null;this.rel='stylesheet'\"", $html);
    $html .= "<noscript>" . str_replace("rel='preload' as='style' onload=\"this.onload=null;this.rel='stylesheet'\"", "rel='stylesheet'", $html) . "</noscript>\n";
    return $html;
}, 10, 2);

// JSをdeferで読み込み(WP6.3+)
add_filter('wp_enqueue_scripts', function (): void {
    // strategy: 'defer' で登録
    wp_script_add_data('my-script', 'strategy', 'defer');
});

ステップ5:Googleフォントを最適化する

// functions.php: Googleフォントをローカルホストに変換

// 方法1: display=swap を追加
add_filter('style_loader_src', function (string $src): string {
    if (str_contains($src, 'fonts.googleapis.com')) {
        if (!str_contains($src, 'display=')) {
            $src .= (str_contains($src, '?') ? '&' : '?') . 'display=swap';
        }
    }
    return $src;
});

// 方法2: preconnect を追加してDNS解決を高速化
add_action('wp_head', function (): void {
    echo '<link rel="preconnect" href="https://fonts.googleapis.com">' . "\n";
    echo '<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>' . "\n";
}, 1);

注意事項

  • PSIのスコアはラボデータ(シミュレーション)とフィールドデータ(実際のユーザーデータ)で異なります。SEOに影響するのはフィールドデータです
  • モバイルスコアはデスクトップより低くなりがちです。まずモバイルを優先して改善してください
  • スコアは計測のたびに数点変動します。複数回計測した平均で判断してください

まとめ

LCPはアイキャッチ画像のpreloadとfetchpriority="high"で改善します。CLSは画像のwidth/height属性付与とaspect-ratioCSSで防ぎます。レンダリングブロックはCSSのpreload非同期化とJSのdefer化で解消します。Googleフォントはdisplay=swappreconnectを追加して最適化します。

お気軽にご相談ください

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