LocalBusiness 與 Event 標記:在地商家與活動資訊
這兩個型別都在描述 現實世界的東西:LocalBusiness 是一個有地址的商家,Event 是一場有時間地點的活動。
本頁的範例只寫在程式碼區塊裡
這一頁不是門市頁也不是活動頁,所以 檔頭沒有真的注入這兩種標記。標記不存在的商家或活動是 結構化資料的政策紅線 。
LocalBusiness
{
"@context": "https://schema.org",
"@type": "CafeOrCoffeeShop",
"name": "某某咖啡 信義店",
"image": ["https://example.com/store-1200.jpg"],
"url": "https://example.com/stores/xinyi",
"telephone": "+886-2-1234-5678",
"priceRange": "$$",
"address": {
"@type": "PostalAddress",
"streetAddress": "信義路五段 7 號",
"addressLocality": "信義區",
"addressRegion": "台北市",
"postalCode": "110",
"addressCountry": "TW"
},
"geo": {
"@type": "GeoCoordinates",
"latitude": 25.033976,
"longitude": 121.564472
},
"openingHoursSpecification": [
{
"@type": "OpeningHoursSpecification",
"dayOfWeek": ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"],
"opens": "08:00",
"closes": "20:00"
},
{
"@type": "OpeningHoursSpecification",
"dayOfWeek": ["Saturday", "Sunday"],
"opens": "09:00",
"closes": "18:00"
}
]
}用更精確的子型別
LocalBusiness 有大量子型別,用具體的那一個比用通用的好:
| 子型別 | 適用 |
|---|---|
Restaurant | 餐廳 |
CafeOrCoffeeShop | 咖啡店 |
Store | 零售店 |
ClothingStore | 服飾店 |
Dentist、MedicalClinic | 診所 |
HairSalon | 美髮 |
AutoRepair | 汽車維修 |
RealEstateAgent | 房仲 |
ProfessionalService | 專業服務(找不到更精確的時) |
找不到完全對應的就用 LocalBusiness
Schema.org 的子型別清單很長但不可能涵蓋所有行業。找不到貼切的就用 LocalBusiness 本身,那完全合法。
address 的欄位
"address": {
"@type": "PostalAddress",
"streetAddress": "信義路五段 7 號",
"addressLocality": "信義區",
"addressRegion": "台北市",
"postalCode": "110",
"addressCountry": "TW"
}| 欄位 | 台灣的對應 |
|---|---|
streetAddress | 路名與門牌號 |
addressLocality | 鄉鎮市區 |
addressRegion | 縣市 |
postalCode | 郵遞區號 |
addressCountry | 國家代碼,台灣是 TW |
不要把整串地址塞進 streetAddress
// 錯誤:無法解析成結構化的地址
"streetAddress": "台北市信義區信義路五段 7 號"
// 正確:分欄填寫
"streetAddress": "信義路五段 7 號",
"addressLocality": "信義區",
"addressRegion": "台北市"分欄的意義在於搜尋引擎能把它對應到地圖上的行政區。
addressCountry 用 兩個字母的 ISO 國碼,不是國名:
// 錯誤
"addressCountry": "Taiwan"
"addressCountry": "台灣"
// 正確
"addressCountry": "TW"營業時間
openingHoursSpecification 用陣列,每一筆是一組時段:
"openingHoursSpecification": [
{
"@type": "OpeningHoursSpecification",
"dayOfWeek": ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"],
"opens": "08:00",
"closes": "20:00"
}
]星期用 英文全名(也接受 Schema.org 的網址形式):
Monday、Tuesday、Wednesday、Thursday、Friday、Saturday、Sunday
跨夜營業必須拆成兩段
// 錯誤:結束時間早於開始時間
{
"dayOfWeek": ["Friday"],
"opens": "22:00",
"closes": "02:00"
}
// 正確:拆成兩筆
[
{ "dayOfWeek": ["Friday"], "opens": "22:00", "closes": "23:59" },
{ "dayOfWeek": ["Saturday"], "opens": "00:00", "closes": "02:00" }
]午休時間也是同樣的處理,拆成上午與下午兩筆:
[
{ "dayOfWeek": ["Monday"], "opens": "09:00", "closes": "12:00" },
{ "dayOfWeek": ["Monday"], "opens": "13:30", "closes": "18:00" }
]特殊營業時間
國定假日或臨時調整用 validFrom 與 validThrough:
{
"@type": "OpeningHoursSpecification",
"opens": "00:00",
"closes": "00:00",
"validFrom": "2027-02-06",
"validThrough": "2027-02-12"
}opens 與 closes 都填 00:00 表示 當天休息。
geo 座標
"geo": {
"@type": "GeoCoordinates",
"latitude": 25.033976,
"longitude": 121.564472
}不是必填,但能避免地址解析錯誤
地址本身就足以定位。填上經緯度的價值在於 巷弄內、新開發區、同名路段 這些地址容易解析錯的地方。
要注意數值必須準確,填錯會把使用者導到錯誤的位置,那比不填更糟。
priceRange
用貨幣符號的數量表示價位帶:
| 值 | 意義 |
|---|---|
$ | 平價 |
$$ | 中價 |
$$$ | 高價 |
$$$$ | 高檔 |
也可以寫具體區間如 "NT$200-500",但符號形式比較通用。
多家分店
一家分店一個頁面,各自標記
每家分店有自己的網址、自己的 LocalBusiness 標記。這是最清楚的做法。
總公司的頁面用 Organization 並列出分支:
{
"@context": "https://schema.org",
"@type": "Organization",
"@id": "https://example.com/#organization",
"name": "某某咖啡",
"url": "https://example.com",
"department": [
{
"@type": "CafeOrCoffeeShop",
"name": "某某咖啡 信義店",
"url": "https://example.com/stores/xinyi"
},
{
"@type": "CafeOrCoffeeShop",
"name": "某某咖啡 中山店",
"url": "https://example.com/stores/zhongshan"
}
]
}與 Google 商家檔案的分工
| Google 商家檔案 | LocalBusiness 標記 | |
|---|---|---|
| 維護位置 | Google 的平台 | 自己的網站 |
| 對地圖與在地搜尋 | 影響大 | 影響較小 |
| 對官網的識別 | 較弱 | 確認官網與商家是同一實體 |
| 需要驗證 | 是(明信片或電話) | 否 |
兩邊的資訊必須一致
商家檔案寫營業到 20:00、網站標記寫 18:00,這種不一致是負面訊號,也會讓使用者白跑一趟。
兩邊都做,並保持同步。 有分店的話,商家檔案的每個地點都要對應到網站上的分店頁。
Event
{
"@context": "https://schema.org",
"@type": "Event",
"name": "前端工程研討會 2027",
"description": "一日的前端技術分享活動。",
"image": ["https://example.com/event-1200.jpg"],
"startDate": "2027-03-15T09:00:00+08:00",
"endDate": "2027-03-15T17:00:00+08:00",
"eventStatus": "https://schema.org/EventScheduled",
"eventAttendanceMode": "https://schema.org/OfflineEventAttendanceMode",
"location": {
"@type": "Place",
"name": "某某會議中心",
"address": {
"@type": "PostalAddress",
"streetAddress": "信義路五段 7 號",
"addressLocality": "信義區",
"addressRegion": "台北市",
"postalCode": "110",
"addressCountry": "TW"
}
},
"organizer": {
"@type": "Organization",
"name": "某某科技",
"url": "https://example.com"
},
"offers": {
"@type": "Offer",
"url": "https://example.com/events/2027/tickets",
"price": "1500",
"priceCurrency": "TWD",
"availability": "https://schema.org/InStock",
"validFrom": "2027-01-01T00:00:00+08:00"
}
}必填與建議欄位
| 欄位 | 必要性 | 說明 |
|---|---|---|
name | 必填 | 活動名稱 |
startDate | 必填 | 開始時間,建議帶時區 |
location | 必填 | 地點 |
endDate | 建議 | 結束時間 |
eventStatus | 建議 | 活動狀態 |
eventAttendanceMode | 建議 | 實體、線上或混合 |
image | 建議 | 活動圖片 |
offers | 建議 | 票務資訊 |
organizer | 建議 | 主辦單位 |
performer | 選填 | 表演者或講者 |
startDate 要帶時區
// 不夠明確:搜尋引擎可能用錯時區
"startDate": "2027-03-15T09:00:00"
// 明確
"startDate": "2027-03-15T09:00:00+08:00"eventStatus
活動改期或取消時務必更新這個欄位:
| 值 | 意義 |
|---|---|
https://schema.org/EventScheduled | 照原定計畫舉行 |
https://schema.org/EventPostponed | 延期(新日期未定) |
https://schema.org/EventRescheduled | 改期(有新日期) |
https://schema.org/EventCancelled | 取消 |
https://schema.org/EventMovedOnline | 改為線上舉行 |
改期時同時填 previousStartDate:
{
"eventStatus": "https://schema.org/EventRescheduled",
"previousStartDate": "2027-03-15T09:00:00+08:00",
"startDate": "2027-04-20T09:00:00+08:00"
}線上活動
地點改成 VirtualLocation,並把出席模式標為線上:
{
"@context": "https://schema.org",
"@type": "Event",
"name": "線上技術分享會",
"startDate": "2027-03-15T19:00:00+08:00",
"eventAttendanceMode": "https://schema.org/OnlineEventAttendanceMode",
"location": {
"@type": "VirtualLocation",
"url": "https://example.com/live/2027-03-15"
}
}實體與線上並行的活動同時提供兩種地點:
{
"eventAttendanceMode": "https://schema.org/MixedEventAttendanceMode",
"location": [
{
"@type": "Place",
"name": "某某會議中心",
"address": { "@type": "PostalAddress", "addressCountry": "TW" }
},
{
"@type": "VirtualLocation",
"url": "https://example.com/live/2027-03-15"
}
]
}活動結束後怎麼處理
檢查清單
LocalBusiness
| 項目 | 標準 |
|---|---|
| 用最精確的子型別 | 建議 |
address 分欄填寫 | 必備 |
addressCountry 用兩字母國碼 | 必備 |
| 營業時間跨夜已拆成兩段 | 必備 |
geo 座標準確(若填寫) | 必備 |
| 一家分店一個頁面 | 建議 |
| 與 Google 商家檔案的資訊一致 | 必備 |
Event
| 項目 | 標準 |
|---|---|
name、startDate、location 齊全 | 必備 |
startDate 帶時區 | 建議 |
改期或取消時更新 eventStatus | 必備 |
線上活動用 VirtualLocation | 必備 |
票價的 price 為純數字字串 | 必備 |
| 過期活動不直接刪頁 | 建議 |
| 通過 複合式搜尋結果測試 | 建議 |
常見問題
有了 Google 商家檔案還需要 LocalBusiness 標記嗎?
兩者互補。商家檔案是在 Google 的平台上直接維護資料,對地圖與在地搜尋的影響更大;網站上的標記則讓搜尋引擎確認您的官網與那個商家是同一個實體。兩邊的資訊必須一致,不一致反而是負面訊號。
營業時間要怎麼寫?
用英文星期名稱加上開始與結束時間,時間用 24 小時制。跨夜營業要拆成兩段,例如:晚上十點到凌晨兩點必須寫成兩筆規格,不能用結束時間小於開始時間的寫法。
多家分店要怎麼標?
每家分店各有自己的頁面與各自的標記,這是最清楚的做法。總公司的頁面用 組織型別 ,並可用 department 欄位列出各分店。把所有分店塞在同一頁會讓搜尋引擎無法對應到正確的地點。
地理座標一定要填嗎?
不是必填,地址就足以定位。但填上經緯度可以避免地址解析錯誤,對巷弄內或新開發區的地點特別有幫助。要注意經緯度必須準確,填錯會把使用者導到錯誤的位置。
線上活動要用什麼標記?
同樣用 Event 型別,但地點改成 VirtualLocation 並填上參加的網址,同時把 eventAttendanceMode 標為線上。實體與線上並行的活動可以同時提供兩種地點,並把模式標為混合。