7MTH 各页面结构化数据实施方案

审计日期:2026-08-04
范围:www.7mth2.comlive.7mth2.comdata.7mth2.comteam.7mth2.com 的 6 类代表页面。

一、先给结论

本次检查的 6 个页面,服务器返回的 HTML 中都没有检测到 JSON-LD 或带 itemtype 的 Microdata。

建议采用以下架构:

页面 主 Schema 辅助 Schema 优先级
https://www.7mth2.com/ WebSiteOrganization WebPage P0
https://live.7mth2.com/ WebSiteCollectionPage 可选 ItemList P1
https://data.7mth2.com/ WebSiteCollectionPage 可选 ItemList P1
日期赛程页 CollectionPageItemList BreadcrumbList P1
球队资料页 SportsTeam WebPageBreadcrumbList P0
单场比赛页 SportsEvent WebPageBreadcrumbList 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>

注意:面包屑必须在页面上真实可见。如果暂时没有可见面包屑,就先删除 BreadcrumbListbreadcrumb 字段。

八、球队资料页代码

样例页面:https://team.7mth2.com/3117/index.shtml

球队子域名根首页应另行部署一个 WebSite 节点,@id 固定为 https://team.7mth2.com/#website;具体球队内页只引用该 @id,不要在每个球队页重复创建 WebSite

当前数据源可取得:

只有当这些数据也在页面上对用户可见时才输出对应属性。

<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。

数据源中检测到:

下面按泰国时区 +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 是数据发布网站,不是赛事主办方。

十、后台生成规则

  1. JSON-LD 建议由服务器模板直接输出,放在 <head> 内;不要依赖 document.write 拼接。
  2. 先在后台构造对象,再使用语言自带的 JSON 序列化函数输出;不要手工拼字符串。
  3. 未知属性直接省略。不要用空字符串、TBD、联赛名冒充场馆,或编造地址。
  4. Schema 中的名称、比分、状态、日期和球队必须在页面上对用户可见。
  5. 所有日期使用 ISO 8601,并带正确时区,例如 2026-08-04T09:00:00+07:00
  6. @id 一旦发布应保持稳定;同一球队在所有页面引用同一个球队 @id
  7. 页面 canonical、Schema urlWebPage.@id 和 sitemap URL 必须统一为同一主域名。
  8. JSON-LD 中不要批量塞入赔率变化、每分钟事件或数百行统计。Schema 负责描述实体,不是复制整张数据库。
  9. 页面中可以有一个 @graph,不要由多个组件重复输出互相冲突的 WebSiteSportsEvent 或球队对象。
  10. 如果面包屑不可见,就不要输出 BreadcrumbList

十一、推荐上线顺序

第一批(风险低、收益明确)

  1. 修正 canonical、编码和 H1。
  2. 主站首页部署 Organization + WebSite
  3. 球队模板部署 SportsTeam
  4. 单场比赛模板部署 SportsEvent

第二批

  1. livedata 子域名首页部署 WebSite + CollectionPage
  2. 将赛程 URL 改为稳定日期,并部署 CollectionPage + ItemList
  3. 添加真实可见面包屑后部署 BreadcrumbList

第三批

  1. 联赛页使用 SportsOrganization
  2. 球员页使用 Person,不要使用第三方 ProfilePage 富结果模型。
  3. 新闻、分析、情报和推介文章页使用 NewsArticleArticle

十二、验证流程

每个模板上线前后都执行:

  1. 使用 Schema.org Validator 检查语法和 Schema 类型。
  2. 使用 Google Rich Results Test 检查 Google 支持的富结果类型。Site name 不在该工具的支持范围内。
  3. 使用 Search Console URL Inspection 检查 Google 实际渲染到的 HTML 和 JSON-LD。
  4. 比较页面可见内容与 JSON-LD,确认名称、时间、比分和状态完全一致。
  5. 抽查未开始、进行中、完场、延期、取消五种比赛状态。

十三、官方依据

十四、审计证据

审计结论针对抓取时服务器返回的 HTML。页面后续改版、接口数据和 Google 渲染结果可能变化,正式上线应再次复核。