2026年5月20日

2026年5月20日

WordPressのローカルSEO設定方法

はじめに

ローカルSEOは「地域名 + 業種」での検索(例:「渋谷 美容院」「新宿 歯医者」)で上位表示を狙うSEO手法です。WordPressサイトにLocalBusiness構造化データを実装し、Googleビジネスプロフィールと連携することで、地域検索での可視性を高められます。

症状・原因

  • 地域名を含む検索キーワードで自社サイトが表示されない
  • Googleマップのローカルパック(地図付き検索結果)に表示されない
  • 店舗名・住所・電話番号(NAP情報)がサイト内で統一されていない
  • Googleビジネスプロフィールとサイトの情報が一致していない

解決手順

ステップ1:NAP情報を統一する

【NAP = Name, Address, Phone Number】

NAP情報の統一チェックリスト:
✅ 店舗名: 登記名・屋号・略称を統一
✅ 住所: 〒マーク・番地表記の形式を統一
   例: 「東京都渋谷区渋谷1-1-1 渋谷ビル3F」で統一
✅ 電話番号: ハイフンの有無・市外局番を統一
   例: 「03-1234-5678」で統一(0312345678 は NG)

確認すべき場所:
・WordPressサイトのフッター・コンタクトページ
・Googleビジネスプロフィール
・SNS(Facebook・Instagram・Twitter)
・各種ポータルサイト(ぐるなび・食べログ等)
・Yahoo!プレイス

NAP情報の不一致はローカルSEO評価を下げる原因になります。

ステップ2:LocalBusiness構造化データを実装する

// functions.php: LocalBusiness 構造化データを出力

add_action('wp_head', function(): void {
    // コンタクトページまたはトップページで出力
    if (!is_front_page() && !is_page('contact')) {
        return;
    }

    $schema = [
        '@context'        => 'https://schema.org',
        '@type'           => 'LocalBusiness',  // または Restaurant, MedicalClinic 等
        'name'            => get_bloginfo('name'),
        'url'             => home_url('/'),
        'telephone'       => '03-1234-5678',
        'email'           => 'info@example.com',
        'address'         => [
            '@type'           => 'PostalAddress',
            'streetAddress'   => '渋谷1-1-1 渋谷ビル3F',
            'addressLocality' => '渋谷区',
            'addressRegion'   => '東京都',
            'postalCode'      => '150-0002',
            'addressCountry'  => 'JP',
        ],
        'geo'             => [
            '@type'     => 'GeoCoordinates',
            'latitude'  => 35.658580,
            'longitude' => 139.701330,
        ],
        'openingHoursSpecification' => [
            [
                '@type'     => 'OpeningHoursSpecification',
                'dayOfWeek' => ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday'],
                'opens'     => '09:00',
                'closes'    => '18:00',
            ],
            [
                '@type'     => 'OpeningHoursSpecification',
                'dayOfWeek' => ['Saturday'],
                'opens'     => '10:00',
                'closes'    => '17:00',
            ],
        ],
        'image'           => get_site_icon_url(512) ?: get_template_directory_uri() . '/images/store.jpg',
        'priceRange'      => '¥¥',
        'sameAs'          => [
            'https://www.google.com/maps/place/YOUR_PLACE_ID',
            'https://www.facebook.com/YOUR_PAGE',
            'https://twitter.com/YOUR_ACCOUNT',
        ],
    ];

    echo '<script type="application/ld+json">'
         . wp_json_encode($schema, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT)
         . '</script>' . PHP_EOL;
}, 5);

ステップ3:Googleマップを埋め込む

// functions.php: Googleマップ埋め込みショートコード

add_shortcode('google_map', function(array $atts): string {
    $atts = shortcode_atts([
        'place_id' => '',
        'address'  => '東京都渋谷区渋谷1-1-1',
        'zoom'     => '15',
        'width'    => '100%',
        'height'   => '400',
        'api_key'  => get_option('google_maps_api_key', ''),
    ], $atts);

    if (empty($atts['api_key'])) {
        // APIキーなしの埋め込み(機能制限あり)
        $encoded = urlencode($atts['address']);
        return '<div class="google-map" style="width:' . esc_attr($atts['width'])
               . ';height:' . esc_attr($atts['height']) . 'px">'
               . '<iframe src="https://maps.google.com/maps?q='
               . $encoded . '&output=embed" width="100%" height="100%"'
               . ' style="border:0" allowfullscreen loading="lazy"'
               . ' referrerpolicy="no-referrer-when-downgrade"></iframe>'
               . '</div>';
    }

    // APIキーあり(より高機能)
    return '<div id="gmap-' . uniqid() . '" class="google-map"'
           . ' style="width:' . esc_attr($atts['width'])
           . ';height:' . esc_attr($atts['height']) . 'px"'
           . ' data-place-id="' . esc_attr($atts['place_id']) . '"'
           . ' data-zoom="' . esc_attr($atts['zoom']) . '"></div>';
});

// 使い方: [google_map address="東京都渋谷区渋谷1-1-1" height="450"]

ステップ4:ローカルキーワードでコンテンツを最適化する

// functions.php: 地域名を含むtitleタグの最適化

add_filter('pre_get_document_title', function(string $title): string {
    // トップページに地域名を追加
    if (is_front_page()) {
        $city = get_option('local_seo_city', '渋谷');
        $service = get_option('local_seo_service', 'Webデザイン');
        return $city . 'の' . $service . ' | ' . get_bloginfo('name');
    }
    return $title;
});

// 管理画面にローカルSEO設定を追加
add_action('admin_init', function(): void {
    register_setting('general', 'local_seo_city');
    register_setting('general', 'local_seo_service');
    register_setting('general', 'google_maps_api_key');

    add_settings_field(
        'local_seo_city',
        '対象エリア(地域名)',
        function(): void {
            $val = get_option('local_seo_city', '');
            echo '<input type="text" name="local_seo_city" value="' . esc_attr($val) . '" class="regular-text">';
        },
        'general'
    );
});

ステップ5:Googleビジネスプロフィールと連携する

// functions.php: Googleビジネスプロフィールのレビューを表示

// ※ Google Places API が必要
add_shortcode('google_reviews', function(array $atts): string {
    $atts = shortcode_atts([
        'place_id' => '',
        'count'    => 5,
        'api_key'  => get_option('google_maps_api_key', ''),
    ], $atts);

    if (empty($atts['place_id']) || empty($atts['api_key'])) {
        return '';
    }

    // キャッシュを使ってAPIコールを減らす
    $cache_key = 'google_reviews_' . md5($atts['place_id']);
    $reviews   = get_transient($cache_key);

    if (false === $reviews) {
        $url = 'https://maps.googleapis.com/maps/api/place/details/json?'
               . http_build_query([
                   'place_id' => $atts['place_id'],
                   'fields'   => 'reviews,rating,user_ratings_total',
                   'language' => 'ja',
                   'key'      => $atts['api_key'],
               ]);

        $response = wp_remote_get($url, ['timeout' => 10]);
        $body     = wp_remote_retrieve_body($response);
        $data     = json_decode($body, true);
        $reviews  = $data['result'] ?? [];

        // 6時間キャッシュ
        set_transient($cache_key, $reviews, 6 * HOUR_IN_SECONDS);
    }

    if (empty($reviews['reviews'])) {
        return '<p>レビューを取得できませんでした。</p>';
    }

    $rating = $reviews['rating'] ?? 0;
    $total  = $reviews['user_ratings_total'] ?? 0;
    $output = "<div class='google-reviews'>";
    $output .= "<p class='overall-rating'>総合評価: {$rating} ★ ({$total}件)</p>";
    $output .= "<ul class='review-list'>";

    foreach (array_slice($reviews['reviews'], 0, (int)$atts['count']) as $review) {
        $stars = str_repeat('★', $review['rating'] ?? 0);
        $output .= '<li class="review-item">';
        $output .= '<strong>' . esc_html($review['author_name'] ?? '') . '</strong>';
        $output .= ' <span class="stars">' . $stars . '</span>';
        $output .= '<p>' . esc_html($review['text'] ?? '') . '</p>';
        $output .= '</li>';
    }

    $output .= '</ul></div>';
    return $output;
});

注意事項

  • Googleビジネスプロフィールのオーナー確認(はがき・電話・動画)を完了しないと、プロフィールの編集ができません。まずオーナー確認を完了させてください
  • NAP情報はWordPressサイトとGoogleビジネスプロフィールで完全に一致させることが重要です。表記揺れ(「丁目」vs「-1」など)もSEO評価に影響します
  • 構造化データのtypeは業種に合わせて変更してください。レストランはRestaurant、医療機関はMedicalClinic、小売店はStoreなど、schema.orgの適切なタイプを選択します

まとめ

ローカルSEOはNAP情報の統一から始め、LocalBusiness構造化データをフロントページに実装します。Googleビジネスプロフィールのオーナー確認を完了させ、サイトの情報と完全に一致させます。地域名を含むtitleタグの最適化、Googleマップの埋め込み、Googleレビューの表示でローカル検索での露出を高めます。schema.orgのtypeは業種に合わせてRestaurantMedicalClinicStore等に変更してください。

お気軽にご相談ください

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