本文约 4,877 字,预计阅读 13 分钟。文中命令与配置均经过实测,可直接参考执行。
引言:地图上有你的店,网站却一点流量都没有
做本地服务(装修、牙科、律所、餐饮、汽修)的站点常遇到一个错位:Google 地图上能搜到门店,电话也不断,但网站的自然流量常年为零。于是站长得出”网站没用”的结论,把预算全投到点评平台。
实际上,本地搜索的入口主要在两个地方:一是本地包(Local Pack,即地图上那三个商家卡片),二是普通自然搜索结果。前者由 Google Business Profile(GBP,原 Google My Business)数据驱动,后者由站点内容与结构化数据驱动。两者不是替代关系,而是互相印证:GBP 上填写的官网 URL 是站点的重要外链(虽然通常是 nofollow 或品牌性链接,但它是极强的品牌与实体关联信号),而站点上的结构化数据又能反过来强化 Google 对”这家店在哪里、什么时候营业”的理解。
原理分析:本地搜索的三个信号源
Google 在本地排序时主要看三类信号,与站点的关系如下:
| 信号 | 来源 | 站长可控度 |
|---|---|---|
| 相关性 | GBP 类目、站点内容 | 高 |
| 距离 | 搜索者与商家的地理距离 | 低 |
| 知名度 | 点评、外链、本地引用(citation) | 中 |
站点能直接发力的部分是相关性与知名度。相关性靠站点内容与 GBP 类目保持一致——GBP 主类目选”水管工”,站点就该有对应的服务页与城市词;知名度靠本地目录的引用(citation)与真实点评。
结构化数据在这里的作用是”消除歧义”。当搜索”城市 + 服务”时,Google 需要确认这个站点对应的是哪个实体。LocalBusiness 类型(及其子类型如 Dentist、Plumber、Restaurant)能明确声明名称、地址、电话、营业时间、地理坐标,把站点与 GBP 条目绑定起来。注意:结构化数据不能替代 GBP 本身,它只是辅助理解。
保姆级实操
步骤 1:核对 GBP 基础信息。 登录 Google Business Profile,确认名称与线下招牌完全一致(不要塞关键词)、主类目准确、地址格式规范、电话带区号、营业时间与节假日时间完整。
步骤 2:把官网 URL 与站点对应页面关联。 GBP 的”网站”字段填首页;预约、菜单、服务介绍等可以填写对应的深层页面 URL,让用户直接落地到相关内容页。
步骤 3:为站点加 UTM 参数以便追踪。 GBP 带来的点击在 GA4 里常被归到 Direct 或 Organic,加参数后可识别。
<?php
// 生成带 UTM 的 URL 供 GBP 字段填写(输出到主题选项或自定义字段)
function mmm_gbp_url($path = '/') {
return add_query_arg([
'utm_source' => 'google',
'utm_medium' => 'organic',
'utm_campaign' => 'gbp_profile',
], home_url($path));
}
// 在主题中输出(示例:联系页链接)
echo esc_url(mmm_gbp_url('/contact/'));
注意不要在 canonical 中带上 UTM 参数,避免制造重复 URL。
步骤 4:在站点上输出 LocalBusiness 结构化数据。 用 JSON-LD 输出,字段名必须与 schema.org 定义一致。
{
"@context": "https://schema.org",
"@type": "Plumber",
"@id": "https://example.com/#business",
"name": "明达管道维修",
"url": "https://example.com/",
"telephone": "+86-755-8888-6666",
"priceRange": "$$",
"image": "https://example.com/img/storefront.jpg",
"address": {
"@type": "PostalAddress",
"streetAddress": "科技园南路 12 号 1 层",
"addressLocality": "深圳市",
"addressRegion": "广东省",
"postalCode": "518000",
"addressCountry": "CN"
},
"geo": {
"@type": "GeoCoordinates",
"latitude": 22.5405,
"longitude": 114.0596
},
"openingHoursSpecification": [
{
"@type": "OpeningHoursSpecification",
"dayOfWeek": ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"],
"opens": "09:00",
"closes": "18:00"
},
{
"@type": "OpeningHoursSpecification",
"dayOfWeek": ["Saturday"],
"opens": "10:00",
"closes": "15:00"
}
],
"sameAs": [
"https://www.facebook.com/example",
"https://www.instagram.com/example"
]
}
步骤 5:在 WordPress 中输出该 JSON-LD。 只在首页输出,@id 用固定锚点便于与其他实体关联。
<?php
// 仅在首页输出 LocalBusiness JSON-LD
add_action('wp_head', function () {
if (!is_front_page()) return;
$data = [
'@context' => 'https://schema.org',
'@type' => 'LocalBusiness',
'@id' => home_url('/#business'),
'name' => get_bloginfo('name'),
'url' => home_url('/'),
'telephone'=> get_option('mmm_phone'),
'address' => [
'@type' => 'PostalAddress',
'streetAddress' => get_option('mmm_street'),
'addressLocality' => get_option('mmm_city'),
'addressCountry' => 'CN',
],
];
echo '<script type="application/ld+json">'
. wp_json_encode($data, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)
. '</script>';
}, 5);
步骤 6:在联系页嵌入地图并回填验证。 用 Google Maps 的嵌入 iframe(https://www.google.com/maps/embed?pb=...)展示门店位置,同时确保页面上的地址文字与 GBP 完全一致。完成后用”富媒体搜索结果测试工具”验证 JSON-LD 是否被正确解析。地址与电话的统一维护细节见 本地 SEO 的 NAP 一致性。
常见踩坑
- 案例: 某连锁汽修店在 GBP 上把店名写成”XX 汽修 – 深圳补胎换轮胎钣金喷漆”,被竞争对手举报后名称被强制改回,且一段时间内本地包排名下滑。GBP 名称必须是真实招牌名,关键词应放在服务描述里。
- 站点上的地址与 GBP 不一致(一个写”12 号”一个写”12-1 号”),实体归属信号混乱,本地排名长期上不去。
- GBP 填了官网但站点是 HTTP 或已过期域名,白白浪费一个高价值入口。
- 结构化数据里的
openingHoursSpecification与 GBP 填写的营业时间冲突,Google 可能忽略其中一方。 - 用多个 GBP 条目覆盖同一实际地址(虚拟办公室、重复门店),属于明确违规,会被暂停。
- 在站点上手动填写假的评价数据(
aggregateRating),Google 的检测非常严格,一旦判为虚假评价会被移除富媒体结果资格,评价相关的合规做法详见 评论与评分对本地 SEO 的作用。 - 嵌入地图 iframe 时用了第三方懒加载却把 iframe 的
src置空,Google 抓不到也不影响排名(地图 iframe 本就不是排名因素),但用户端体验会变差。
总结
GBP 与站点的配合标准是”三处一致”:名称、地址、电话在 GBP、站点结构化数据、页面正文里完全相同;营业时间在两处同步;站点有与 GBP 类目对应的服务页。行动清单:先核对 GBP 基础信息;给官网链接加 UTM;输出 LocalBusiness JSON-LD 并用富媒体测试工具验证;联系页嵌入地图;每季度核对一次营业时间变更。本地 SEO 的竞争往往不激烈,把这套基础工作做扎实,收益比做十个外链更稳定。
