2026年5月20日
2026年5月20日
WordPressのローカルビジネススキーマを設定する方法
はじめに
LocalBusinessスキーマはGoogleに業種・営業時間・所在地・評価などの詳細情報を伝える構造化データです。正しく実装するとナレッジパネル・ローカルパック・リッチリザルトでの表示が改善され、クリック率の向上につながります。
症状・原因
- Googleの検索結果にナレッジパネルが表示されない
- 飲食店なのにRestaurantスキーマではなく汎用LocalBusinessになっている
- AggregateRating(星評価)がリッチリザルトに表示されない
- 営業時間の構造化データが正しく設定できていない
解決手順
ステップ1:業種に合ったschema.orgタイプを選ぶ
【LocalBusinessの主要サブタイプ】
飲食業:
・Restaurant : レストラン全般
・CafeOrCoffeeShop : カフェ・コーヒーショップ
・Bakery : ベーカリー
・BarOrPub : バー・パブ
医療・健康:
・MedicalClinic : クリニック・診療所
・Dentist : 歯科医院
・Hospital : 病院
・Pharmacy : 薬局
小売・サービス:
・Store : 小売店全般
・ClothingStore : 衣料品店
・ElectronicsStore : 電器店
・BeautySalon : 美容院・サロン
・HairSalon : 美容室
不動産・法律:
・RealEstateAgent : 不動産会社
・LegalService : 法律事務所
・Notary : 公証人役場
その他:
・GymOrSportsFacility : フィットネスジム
・ChildCare : 保育施設
・TravelAgency : 旅行代理店
ステップ2:LocalBusinessスキーマを実装する
// functions.php: 業種別 LocalBusiness 構造化データ
add_action('wp_head', function(): void {
if (!is_front_page() && !is_page('about') && !is_page('contact')) {
return;
}
// 管理画面から設定できる情報を取得
$business_type = get_option('schema_business_type', 'LocalBusiness');
$business_name = get_option('schema_business_name', get_bloginfo('name'));
$phone = get_option('schema_phone', '');
$email = get_option('schema_email', '');
$street = get_option('schema_street', '');
$city = get_option('schema_city', '');
$region = get_option('schema_region', '');
$postal = get_option('schema_postal', '');
$lat = (float) get_option('schema_lat', 0);
$lng = (float) get_option('schema_lng', 0);
$price_range = get_option('schema_price_range', '');
$rating_value = (float) get_option('schema_rating_value', 0);
$rating_count = (int) get_option('schema_rating_count', 0);
$founding_year = get_option('schema_founding_year', '');
$schema = [
'@context' => 'https://schema.org',
'@type' => $business_type,
'name' => $business_name,
'url' => home_url('/'),
'logo' => [
'@type' => 'ImageObject',
'url' => get_site_icon_url(512) ?: '',
],
'image' => get_option('schema_image_url', ''),
'description' => get_bloginfo('description'),
];
if ($phone) $schema['telephone'] = $phone;
if ($email) $schema['email'] = $email;
if ($street) {
$schema['address'] = [
'@type' => 'PostalAddress',
'streetAddress' => $street,
'addressLocality' => $city,
'addressRegion' => $region,
'postalCode' => $postal,
'addressCountry' => 'JP',
];
}
if ($lat && $lng) {
$schema['geo'] = [
'@type' => 'GeoCoordinates',
'latitude' => $lat,
'longitude' => $lng,
];
}
if ($price_range) {
$schema['priceRange'] = $price_range;
}
if ($founding_year) {
$schema['foundingDate'] = $founding_year;
}
// 評価(AggregateRating)
if ($rating_value > 0 && $rating_count > 0) {
$schema['aggregateRating'] = [
'@type' => 'AggregateRating',
'ratingValue' => $rating_value,
'reviewCount' => $rating_count,
'bestRating' => 5,
'worstRating' => 1,
];
}
echo '<script type="application/ld+json">'
. wp_json_encode($schema, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT)
. '</script>' . PHP_EOL;
}, 5);
ステップ3:営業時間スキーマを設定する
// functions.php: 営業時間の構造化データ
function get_opening_hours_schema(): array {
// 管理画面で設定した営業時間
$hours = [
[
'days' => ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday'],
'opens' => get_option('schema_weekday_opens', '09:00'),
'closes' => get_option('schema_weekday_closes', '18:00'),
],
[
'days' => ['Saturday'],
'opens' => get_option('schema_saturday_opens', '10:00'),
'closes' => get_option('schema_saturday_closes', '17:00'),
],
// 日曜は休み(定義しない)
];
$specs = [];
foreach ($hours as $period) {
if (empty($period['opens'])) continue;
$specs[] = [
'@type' => 'OpeningHoursSpecification',
'dayOfWeek' => $period['days'],
'opens' => $period['opens'],
'closes' => $period['closes'],
];
}
return $specs;
}
// 特別営業時間(祝日等)
function get_special_opening_hours(): array {
return [
[
'@type' => 'OpeningHoursSpecification',
'validFrom' => '2025-01-01',
'validThrough' => '2025-01-03',
'opens' => '00:00',
'closes' => '00:00', // 閉店(終日休業)
],
];
}
ステップ4:FAQPageスキーマを追加する
// functions.php: FAQPage 構造化データ
// LocalBusiness ページによくある質問と組み合わせると効果的
add_action('wp_head', function(): void {
if (!is_page('faq') && !is_front_page()) return;
$faqs = [
[
'question' => '営業時間を教えてください。',
'answer' => '平日9:00〜18:00、土曜10:00〜17:00です。日曜・祝日はお休みです。',
],
[
'question' => '予約は必要ですか?',
'answer' => 'はい、事前のご予約をお願いしております。お電話またはWebフォームからご予約ください。',
],
[
'question' => '駐車場はありますか?',
'answer' => '建物横に5台分の無料駐車場をご用意しております。',
],
];
$schema = [
'@context' => 'https://schema.org',
'@type' => 'FAQPage',
'mainEntity' => array_map(function(array $faq): array {
return [
'@type' => 'Question',
'name' => $faq['question'],
'acceptedAnswer' => [
'@type' => 'Answer',
'text' => $faq['answer'],
],
];
}, $faqs),
];
echo '<script type="application/ld+json">'
. wp_json_encode($schema, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)
. '</script>' . PHP_EOL;
}, 5);
ステップ5:スキーマの検証とモニタリング
# Google リッチリザルトテスト
# https://search.google.com/test/rich-results
# URL入力 → LocalBusiness スキーマが正しく認識されているか確認
# 構造化データのJSON-LDを直接確認
curl -s https://example.com/ | \
python3 -c "
import sys, re, json
html = sys.stdin.read()
scripts = re.findall(r'<script type=\"application/ld\+json\">(.*?)</script>', html, re.DOTALL)
for s in scripts:
try:
data = json.loads(s)
if data.get('@type') in ['LocalBusiness', 'Restaurant', 'MedicalClinic']:
print(json.dumps(data, ensure_ascii=False, indent=2))
except:
pass
"
# Search Console で確認
# Search Console → 拡張機能 → ビジネス情報
# → エラーと警告を確認
注意事項
aggregateRatingは実際のユーザーレビューに基づく評価のみ使用できます。自社スタッフが投稿したレビューや架空の評価を使用するとGoogleのポリシー違反になります- LocalBusinessスキーマのURLはカノニカルURLと一致させてください。トップページに設置する場合は
home_url('/')を使用します - 業種のtypeを実態と異なるものに設定することはGoogleのガイドライン違反です。最も実態に近いsubtype(
Restaurant・MedicalClinic等)を選択してください
まとめ
LocalBusinessスキーマは業種に合った@type(Restaurant・MedicalClinic・Store等)を選択し、住所・電話・営業時間・GeoCoordinatesを含めて実装します。AggregateRatingを追加すると星評価がリッチリザルトに表示されます。FAQPageスキーマと組み合わせることでよくある質問もリッチリザルトとして表示できます。Google リッチリザルトテストとSearch Consoleで定期的に検証してください。