7MTH 各页面结构化数据实施方案
审计日期:2026-08-04
范围:www.7mth2.com、live.7mth2.com、data.7mth2.com、team.7mth2.com 的 6 类代表页面。
一、先给结论
本次检查的 6 个页面,服务器返回的 HTML 中都没有检测到 JSON-LD 或带 itemtype 的 Microdata。
建议采用以下架构:
| 页面 | 主 Schema | 辅助 Schema | 优先级 |
|---|---|---|---|
https://www.7mth2.com/ |
WebSite、Organization |
WebPage |
P0 |
https://live.7mth2.com/ |
WebSite、CollectionPage |
可选 ItemList |
P1 |
https://data.7mth2.com/ |
WebSite、CollectionPage |
可选 ItemList |
P1 |
| 日期赛程页 | CollectionPage、ItemList |
BreadcrumbList |
P1 |
| 球队资料页 | SportsTeam |
WebPage、BreadcrumbList |
P0 |
| 单场比赛页 | SportsEvent |
WebPage、BreadcrumbList |
P0 |
结构化数据的目标是让搜索引擎更清楚地理解“这页是什么、页面主实体是谁、实体之间如何关联”。它不是直接提高排名的开关,也不保证 Google 显示富结果。
二、Schema 上线前必须先修的问题
1. 球队页 canonical 输出错误
当前页面:
https://team.7mth2.com/3117/index.shtml
实际观察到的 canonical:
<link rel="canonical" href="https://team.7mth2.com/'+rq_id+'/index.shtml">
这是没有执行的 JavaScript 拼接字符串。必须在服务器端输出真实地址:
<link rel="canonical" href="https://team.7mth2.com/3117/index.shtml">
Schema 中所有球队 URL 和 @id 也必须使用这个最终 canonical。
2. 单场比赛 canonical 指向旧域名
访问的是 data.7mth2.com,但服务器返回的 canonical 指向 data.7mth.com。
如果希望 7mth2.com 参与索引,应统一成当前域名;如果旧域名才是主站,则 Schema 也必须跟随旧域名,而且不要期待 7mth2.com 的该页面被独立收录。两个方向只能选一个。
本文后续代码以 data.7mth2.com 为目标主域名。
3. 赛程 URL 不是稳定日期
当前地址是:
https://data.7mth2.com/fixture/?date=1
如果 date=1 永远代表“明天”,同一 URL 每天会换一批比赛,不利于 canonical、缓存、索引和 ItemList 稳定性。建议改为:
https://data.7mth2.com/fixture/2026-08-05/
或至少:
https://data.7mth2.com/fixture/?date=2026-08-05
4. 资料库首页 canonical 与根地址不一致
访问 https://data.7mth2.com/ 时,当前 canonical 是:
https://data.7mth2.com/database/index_th_13.htm
如果根地址就是泰文资料库首页,建议将根地址 canonical 指回自身。Google 的站点名称 WebSite 标记应放在子域名根首页,并使用根 URL。
5. 页面标题与正文编码
单场比赛页的服务器 HTML 中,标题、description 和 canonical 出现了明显的泰文二次编码迹象。应保证:
<meta charset="utf-8">
并保证模板变量本身只进行一次 UTF-8 编码。Schema 即使正确,如果页面标题和正文仍乱码,整体搜索表现依然会受影响。
6. 缺少可见主标题
主站首页、资料库首页、赛程页、球队页和单场比赛页的服务器 HTML 中没有检测到明确的 H1。建议每页增加一个与页面主实体一致、用户可见的 H1。Schema 中的 name 不应代替页面正文。
三、全站实体 ID 规则
不要让每个页面各自创建互不相识的球队和网站对象。建议固定:
7MTH 机构: https://www.7mth2.com/#organization
主站 WebSite:https://www.7mth2.com/#website
比分 WebSite:https://live.7mth2.com/#website
资料 WebSite:https://data.7mth2.com/#website
球队 WebSite:https://team.7mth2.com/#website
球队实体: https://team.7mth2.com/{team_id}/index.shtml#team
比赛实体: {match_canonical_url}#event
联赛实体: https://data.7mth2.com/matches_data/{league_id}/th/index.shtml#competition
同一个球队出现在球队页、比赛页、赛程页时,必须引用同一个 @id。
以下代码中的 __PLACEHOLDER__ 是必须由模板或后台替换的字段,不能原样上线。
四、主站首页代码
目标页面:https://www.7mth2.com/
建议只在主站首页输出这一组。__SITE_LOGO_512_URL__ 应替换为真实、可抓取的方形品牌 Logo,建议至少 512×512。当前资料库使用的 303×80 横向 Logo 不适合作为这里的最终品牌图。
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@graph": [
{
"@type": "Organization",
"@id": "https://www.7mth2.com/#organization",
"name": "7MTH",
"alternateName": ["7M TH", "7MTH.com"],
"url": "https://www.7mth2.com/",
"logo": {
"@type": "ImageObject",
"@id": "https://www.7mth2.com/#logo",
"url": "__SITE_LOGO_512_URL__",
"contentUrl": "__SITE_LOGO_512_URL__",
"width": 512,
"height": 512
}
},
{
"@type": "WebSite",
"@id": "https://www.7mth2.com/#website",
"url": "https://www.7mth2.com/",
"name": "7MTH",
"alternateName": ["7M TH", "7MTH.com"],
"inLanguage": "th",
"publisher": {
"@id": "https://www.7mth2.com/#organization"
}
},
{
"@type": "WebPage",
"@id": "https://www.7mth2.com/#webpage",
"url": "https://www.7mth2.com/",
"name": "ผลบอล ราคาสด ข่าวกีฬา ข่าวฟุตบอล - 7MTH",
"description": "7MTH ให้บริการผลบอลสด ตารางการแข่งขัน ผลการแข่งขัน ข้อมูลทีม และข่าวฟุตบอลสำหรับแฟนบอลชาวไทย",
"inLanguage": "th",
"isPartOf": {
"@id": "https://www.7mth2.com/#website"
},
"about": {
"@id": "https://www.7mth2.com/#organization"
}
}
]
}
</script>
不要添加 SearchAction,除非网站确实有一个可访问、能根据查询词返回结果的站内搜索 URL。
五、实时比分首页代码
目标页面:https://live.7mth2.com/
这个页面是动态比赛集合,不应把整页错误标成一场 SportsEvent。首页先使用 WebSite + CollectionPage。如果要输出比赛列表,必须由服务器生成与用户当前可见比赛一致的 ItemList。
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@graph": [
{
"@type": "WebSite",
"@id": "https://live.7mth2.com/#website",
"url": "https://live.7mth2.com/",
"name": "7MTH Live",
"alternateName": ["7M ผลบอลสด", "7MTH ผลบอลสด"],
"inLanguage": "th",
"publisher": {
"@id": "https://www.7mth2.com/#organization"
}
},
{
"@type": "CollectionPage",
"@id": "https://live.7mth2.com/#webpage",
"url": "https://live.7mth2.com/",
"name": "7MTH ผลบอลสดภาษาไทย ผลบอลเมื่อคืน และตารางบอล",
"description": "ผลบอลสดภาษาไทย ตารางบอลวันนี้ ผลบอลย้อนหลัง และข้อมูลการแข่งขันฟุตบอลแบบเรียลไทม์",
"inLanguage": "th",
"isPartOf": {
"@id": "https://live.7mth2.com/#website"
},
"publisher": {
"@id": "https://www.7mth2.com/#organization"
}
}
]
}
</script>
不要在这个首页一次塞入数百个完整 SportsEvent。重点赛事应链接到独立单场 URL,并在独立页面输出完整 SportsEvent。
六、资料库首页代码
目标页面:https://data.7mth2.com/
先修正根首页 canonical,再输出:
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@graph": [
{
"@type": "WebSite",
"@id": "https://data.7mth2.com/#website",
"url": "https://data.7mth2.com/",
"name": "7MTH Data",
"alternateName": ["ฐานข้อมูล 7M", "7M ฐานข้อมูลฟุตบอล"],
"inLanguage": "th",
"publisher": {
"@id": "https://www.7mth2.com/#organization"
}
},
{
"@type": "CollectionPage",
"@id": "https://data.7mth2.com/#webpage",
"url": "https://data.7mth2.com/",
"name": "ฐานข้อมูลฟุตบอล 7M ตารางคะแนน ผลการแข่งขัน และข้อมูลย้อนหลัง",
"description": "ฐานข้อมูลฟุตบอล 7M รวมข้อมูลลีก ทีม ตารางคะแนน โปรแกรมการแข่งขัน ผลการแข่งขัน และสถิติย้อนหลัง",
"inLanguage": "th",
"isPartOf": {
"@id": "https://team.7mth2.com/#website"
},
"publisher": {
"@id": "https://www.7mth2.com/#organization"
}
}
]
}
</script>
如果页面服务器端能够输出当前可见联赛入口,可以为 CollectionPage.mainEntity 添加 ItemList,每项只链接到真实联赛资料页。
七、日期赛程列表页代码
目标 URL 应改成稳定日期,例如:
https://data.7mth2.com/fixture/2026-08-05/
模板如下。实际输出时,后台应循环当天比赛,生成连续的 position、真实比赛 URL 和真实名称。
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@graph": [
{
"@type": "CollectionPage",
"@id": "__FIXTURE_CANONICAL_URL__#webpage",
"url": "__FIXTURE_CANONICAL_URL__",
"name": "ตารางการแข่งขันฟุตบอลวันที่ __DISPLAY_DATE__ - 7MTH",
"description": "ตารางการแข่งขันฟุตบอลประจำวันที่ __DISPLAY_DATE__ พร้อมเวลาแข่งขันและลิงก์ข้อมูลแต่ละคู่",
"inLanguage": "th",
"isPartOf": {
"@id": "https://data.7mth2.com/#website"
},
"breadcrumb": {
"@id": "__FIXTURE_CANONICAL_URL__#breadcrumb"
},
"mainEntity": {
"@id": "__FIXTURE_CANONICAL_URL__#match-list"
}
},
{
"@type": "BreadcrumbList",
"@id": "__FIXTURE_CANONICAL_URL__#breadcrumb",
"itemListElement": [
{
"@type": "ListItem",
"position": 1,
"name": "7MTH Teams",
"item": "https://team.7mth2.com/"
},
{
"@type": "ListItem",
"position": 2,
"name": "ตารางการแข่งขัน",
"item": "__FIXTURE_INDEX_URL__"
},
{
"@type": "ListItem",
"position": 3,
"name": "__DISPLAY_DATE__"
}
]
},
{
"@type": "ItemList",
"@id": "__FIXTURE_CANONICAL_URL__#match-list",
"name": "การแข่งขันวันที่ __DISPLAY_DATE__",
"numberOfItems": __MATCH_COUNT__,
"itemListOrder": "https://schema.org/ItemListOrderAscending",
"itemListElement": [
{
"@type": "ListItem",
"position": 1,
"name": "__HOME_TEAM_1__ VS __AWAY_TEAM_1__",
"url": "__MATCH_URL_1__"
},
{
"@type": "ListItem",
"position": 2,
"name": "__HOME_TEAM_2__ VS __AWAY_TEAM_2__",
"url": "__MATCH_URL_2__"
}
]
}
]
}
</script>
注意:面包屑必须在页面上真实可见。如果暂时没有可见面包屑,就先删除 BreadcrumbList 和 breadcrumb 字段。
八、球队资料页代码
样例页面:https://team.7mth2.com/3117/index.shtml
球队子域名根首页应另行部署一个 WebSite 节点,@id 固定为 https://team.7mth2.com/#website;具体球队内页只引用该 @id,不要在每个球队页重复创建 WebSite。
当前数据源可取得:
- 球队 ID:3117
- 泰文名:อัตเลติโก บูคารามังก้า
- 英文名:Atletico Bucaramanga
- 国家:哥伦比亚
- 城市:Bucaramanga
- 成立日期:1949-05-11
- 教练:Leonel Alvarez
- 主场:Alfonso López
- 官网:
http://www.atleticobucaramanga.com.co/ - 队徽:
https://data.7mdt.com/team_data/3117/logo_Img/club_logo.jpg(125×125)
只有当这些数据也在页面上对用户可见时才输出对应属性。
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@graph": [
{
"@type": "WebPage",
"@id": "https://team.7mth2.com/3117/index.shtml#webpage",
"url": "https://team.7mth2.com/3117/index.shtml",
"name": "อัตเลติโก บูคารามังก้า - การแข่งขัน ข่าว ตารางคะแนน และผู้เล่น | 7MTH",
"description": "ข้อมูลทีมอัตเลติโก บูคารามังก้า นักฟุตบอล ข่าว ตารางการแข่งขัน ผลการแข่งขัน และสถิติ",
"inLanguage": "th",
"isPartOf": {
"@id": "https://data.7mth2.com/#website"
},
"mainEntity": {
"@id": "https://team.7mth2.com/3117/index.shtml#team"
},
"breadcrumb": {
"@id": "https://team.7mth2.com/3117/index.shtml#breadcrumb"
}
},
{
"@type": "SportsTeam",
"@id": "https://team.7mth2.com/3117/index.shtml#team",
"identifier": "3117",
"name": "อัตเลติโก บูคารามังก้า",
"alternateName": "Atletico Bucaramanga",
"url": "https://team.7mth2.com/3117/index.shtml",
"sport": "Football",
"image": "https://data.7mdt.com/team_data/3117/logo_Img/club_logo.jpg",
"logo": "https://data.7mdt.com/team_data/3117/logo_Img/club_logo.jpg",
"foundingDate": "1949-05-11",
"sameAs": [
"http://www.atleticobucaramanga.com.co/"
],
"location": {
"@type": "Place",
"name": "Bucaramanga, Colombia",
"address": {
"@type": "PostalAddress",
"addressLocality": "Bucaramanga",
"addressCountry": "CO"
}
},
"coach": {
"@type": "Person",
"name": "Leonel Alvarez"
},
"memberOf": {
"@type": "SportsOrganization",
"@id": "https://data.7mth2.com/matches_data/326/th/index.shtml#competition",
"name": "คาเตโกเรีย พรีเมร่า เอ",
"alternateName": "COL D1",
"sport": "Football"
}
},
{
"@type": "BreadcrumbList",
"@id": "https://team.7mth2.com/3117/index.shtml#breadcrumb",
"itemListElement": [
{
"@type": "ListItem",
"position": 1,
"name": "7MTH Data",
"item": "https://data.7mth2.com/"
},
{
"@type": "ListItem",
"position": 2,
"name": "ทีมฟุตบอล",
"item": "__TEAM_INDEX_URL__"
},
{
"@type": "ListItem",
"position": 3,
"name": "อัตเลติโก บูคารามังก้า"
}
]
}
]
}
</script>
这里使用 SportsTeam,不要使用 ProfilePage。Google 的 ProfilePage 富结果面向与网站本身有关联的用户、作者、员工或组织档案,不适合第三方足球俱乐部资料页。
九、单场比赛页代码
样例页面:比赛 ID 5072368。
数据源中检测到:
- 联赛 ID:326
- 联赛:คาเตโกเรีย พรีเมร่า เอ / COL D1
- 主队 ID:3117,อัตเลติโก บูคารามังก้า
- 客队 ID:4292,คูคูต้า เดปอร์ติโว่
- 时间:2026-08-04 09:00
- 状态:完场
- 比分:2–1
下面按泰国时区 +07:00 演示。如果数据库时间是 UTC 或其他时区,必须在后台正确转换,不能直接照抄。
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@graph": [
{
"@type": "WebPage",
"@id": "https://data.7mth2.com/goaldata/th/5072368-อัตเลติโก-บูคารามังก้า-VS-คูคูต้า-เดปอร์ติโว่#webpage",
"url": "https://data.7mth2.com/goaldata/th/5072368-อัตเลติโก-บูคารามังก้า-VS-คูคูต้า-เดปอร์ติโว่",
"name": "อัตเลติโก บูคารามังก้า VS คูคูต้า เดปอร์ติโว่ - ผลการแข่งขันและสถิติ | 7MTH",
"description": "ผลการแข่งขัน อัตเลติโก บูคารามังก้า 2-1 คูคูต้า เดปอร์ติโว่ พร้อมเหตุการณ์และสถิติการแข่งขัน",
"inLanguage": "th",
"isPartOf": {
"@id": "https://data.7mth2.com/#website"
},
"mainEntity": {
"@id": "https://data.7mth2.com/goaldata/th/5072368-อัตเลติโก-บูคารามังก้า-VS-คูคูต้า-เดปอร์ติโว่#event"
},
"breadcrumb": {
"@id": "https://data.7mth2.com/goaldata/th/5072368-อัตเลติโก-บูคารามังก้า-VS-คูคูต้า-เดปอร์ติโว่#breadcrumb"
}
},
{
"@type": "SportsEvent",
"@id": "https://data.7mth2.com/goaldata/th/5072368-อัตเลติโก-บูคารามังก้า-VS-คูคูต้า-เดปอร์ติโว่#event",
"identifier": "5072368",
"url": "https://data.7mth2.com/goaldata/th/5072368-อัตเลติโก-บูคารามังก้า-VS-คูคูต้า-เดปอร์ติโว่",
"name": "อัตเลติโก บูคารามังก้า VS คูคูต้า เดปอร์ติโว่",
"description": "ผลการแข่งขัน: อัตเลติโก บูคารามังก้า 2-1 คูคูต้า เดปอร์ติโว่",
"sport": "Football",
"startDate": "2026-08-04T09:00:00+07:00",
"eventStatus": "https://schema.org/EventCompleted",
"mainEntityOfPage": {
"@id": "https://data.7mth2.com/goaldata/th/5072368-อัตเลติโก-บูคารามังก้า-VS-คูคูต้า-เดปอร์ติโว่#webpage"
},
"homeTeam": {
"@type": "SportsTeam",
"@id": "https://team.7mth2.com/3117/index.shtml#team",
"identifier": "3117",
"name": "อัตเลติโก บูคารามังก้า",
"alternateName": "Atletico Bucaramanga",
"url": "https://team.7mth2.com/3117/index.shtml",
"image": "https://data.7mdt.com/team_data/3117/logo_Img/club_logo.jpg"
},
"awayTeam": {
"@type": "SportsTeam",
"@id": "https://team.7mth2.com/4292/index.shtml#team",
"identifier": "4292",
"name": "คูคูต้า เดปอร์ติโว่",
"url": "https://team.7mth2.com/4292/index.shtml",
"image": "https://data.7mdt.com/team_data/4292/logo_Img/club_logo.jpg"
},
"organizer": {
"@type": "SportsOrganization",
"@id": "https://data.7mth2.com/matches_data/326/th/index.shtml#competition",
"name": "คาเตโกเรีย พรีเมร่า เอ",
"alternateName": "COL D1",
"sport": "Football"
}
},
{
"@type": "BreadcrumbList",
"@id": "https://data.7mth2.com/goaldata/th/5072368-อัตเลติโก-บูคารามังก้า-VS-คูคูต้า-เดปอร์ติโว่#breadcrumb",
"itemListElement": [
{
"@type": "ListItem",
"position": 1,
"name": "7MTH Data",
"item": "https://data.7mth2.com/"
},
{
"@type": "ListItem",
"position": 2,
"name": "คาเตโกเรีย พรีเมร่า เอ",
"item": "https://data.7mth2.com/matches_data/326/th/index.shtml"
},
{
"@type": "ListItem",
"position": 3,
"name": "อัตเลติโก บูคารามังก้า VS คูคูต้า เดปอร์ติโว่"
}
]
}
]
}
</script>
当前没有确认到比赛场馆,所以代码没有虚构 location。Google 的 Event 富结果要求真实的场馆名称和详细地址;等后台有可靠、页面可见的场馆数据后再增加:
"location": {
"@type": "Place",
"name": "__VENUE_NAME__",
"address": {
"@type": "PostalAddress",
"streetAddress": "__STREET_ADDRESS__",
"addressLocality": "__CITY__",
"addressRegion": "__REGION__",
"postalCode": "__POSTAL_CODE__",
"addressCountry": "__COUNTRY_CODE__"
}
}
比赛进行中、延期、取消和完场应由后台映射到正确状态:
未开始/正常:EventScheduled
延期: EventPostponed
改期: EventRescheduled(同时提供 previousStartDate)
取消: EventCancelled
完场: EventCompleted
不要把 7MTH 写成比赛的 organizer;7MTH 是数据发布网站,不是赛事主办方。
十、后台生成规则
- JSON-LD 建议由服务器模板直接输出,放在
<head>内;不要依赖document.write拼接。 - 先在后台构造对象,再使用语言自带的 JSON 序列化函数输出;不要手工拼字符串。
- 未知属性直接省略。不要用空字符串、
TBD、联赛名冒充场馆,或编造地址。 - Schema 中的名称、比分、状态、日期和球队必须在页面上对用户可见。
- 所有日期使用 ISO 8601,并带正确时区,例如
2026-08-04T09:00:00+07:00。 @id一旦发布应保持稳定;同一球队在所有页面引用同一个球队@id。- 页面 canonical、Schema
url、WebPage.@id和 sitemap URL 必须统一为同一主域名。 - JSON-LD 中不要批量塞入赔率变化、每分钟事件或数百行统计。Schema 负责描述实体,不是复制整张数据库。
- 页面中可以有一个
@graph,不要由多个组件重复输出互相冲突的WebSite、SportsEvent或球队对象。 - 如果面包屑不可见,就不要输出
BreadcrumbList。
十一、推荐上线顺序
第一批(风险低、收益明确)
- 修正 canonical、编码和 H1。
- 主站首页部署
Organization + WebSite。 - 球队模板部署
SportsTeam。 - 单场比赛模板部署
SportsEvent。
第二批
live与data子域名首页部署WebSite + CollectionPage。- 将赛程 URL 改为稳定日期,并部署
CollectionPage + ItemList。 - 添加真实可见面包屑后部署
BreadcrumbList。
第三批
- 联赛页使用
SportsOrganization。 - 球员页使用
Person,不要使用第三方ProfilePage富结果模型。 - 新闻、分析、情报和推介文章页使用
NewsArticle或Article。
十二、验证流程
每个模板上线前后都执行:
- 使用 Schema.org Validator 检查语法和 Schema 类型。
- 使用 Google Rich Results Test 检查 Google 支持的富结果类型。Site name 不在该工具的支持范围内。
- 使用 Search Console URL Inspection 检查 Google 实际渲染到的 HTML 和 JSON-LD。
- 比较页面可见内容与 JSON-LD,确认名称、时间、比分和状态完全一致。
- 抽查未开始、进行中、完场、延期、取消五种比赛状态。
十三、官方依据
- Google:结构化数据简介
- Google:Site names
- Google:Organization
- Google:Event
- Google:Breadcrumb
- Google:ProfilePage
- Schema.org:SportsEvent
- Schema.org:SportsTeam
- Schema.org:SportsOrganization
- Schema.org:CollectionPage
- Schema.org:ItemList
十四、审计证据
- 页面审计数据:
F:\SEO\structured-data_codex\research\7m_page_audit_2026-08-04.json - 审计脚本:
F:\SEO\structured-data_codex\tools\audit_7m_pages.py
审计结论针对抓取时服务器返回的 HTML。页面后续改版、接口数据和 Google 渲染结果可能变化,正式上线应再次复核。