给自己的博客加上了 JSON-LD 站内搜索结构化数据
最近整理自己的博客时,顺手把首页的 JSON-LD 结构化数据重新改了一下。
之前主页使用的是 WebSite 类型,不过里面写的还是个人主页的信息。现在博客早就已经单独使用 blog.mxdyeah.com,所以觉得继续沿用原来的配置有点不合适,也正好趁这个机会把站内搜索一起补进去。
我希望搜索引擎看到的站点名称是 mxd's Blog,而不是之前个人主页上的 mxd (@mxdyeah)。作者仍然是我自己,个人主页、GitHub、X 和 Telegram 这些链接也保留。
改完之后大概是这样:
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "WebSite",
"@id": "https://blog.mxdyeah.com",
"url": "https://blog.mxdyeah.com",
"name": "mxd's Blog",
"description": "Empowered by technology, inspired by life.",
"author": {
"@type": "Person",
"name": "mxd",
"url": "https://www.mxdyeah.com",
"sameAs": [
"https://x.com/mxdabc",
"https://github.com/mxdabc",
"https://t.me/mxdshare"
]
},
"potentialAction": {
"@type": "SearchAction",
"target": {
"@type": "EntryPoint",
"urlTemplate": "https://blog.mxdyeah.com/search/{search_term_string}"
},
"query-input": {
"@type": "PropertyValueSpecification",
"valueRequired": true,
"valueName": "search_term_string"
}
}
}
</script>这里比较值得注意的是 potentialAction。
它不是在网页上真的创建一个搜索框,而是在结构化数据里告诉搜索引擎:这个网站有搜索功能,如果需要构造站内搜索 URL,可以按照这个模板来。
我的博客搜索地址本身比较简单:
https://blog.mxdyeah.com/search/xxx所以对应的 urlTemplate 就写成:
https://blog.mxdyeah.com/search/{search_term_string}比如搜索 Linux,实际地址就是:
https://blog.mxdyeah.com/search/Linux这种写法对我来说比较舒服,因为博客本身的 URL 结构就已经这么设计了,不需要为了结构化数据再额外做一个 /search?q=xxx 的接口。
还有一个小坑,是我一开始贴出来的 JSON-LD 里面 URL 看起来像这样:
"[https://blog.mxdyeah.com](https://blog.mxdyeah.com)"这是 Markdown 的链接写法,但 JSON-LD 不是 Markdown。放进 JSON-LD 后,URL 应该就是普通字符串:
"url": "https://blog.mxdyeah.com"这个问题看起来挺小,但如果直接把 Markdown 里的内容复制进 <script type="application/ld+json">,最终得到的就不是一个正常的 URL。
@id 也顺便从原来的个人主页改成了博客自己的地址:
"@id": "https://blog.mxdyeah.com"我觉得这个比较合理。个人主页和博客虽然都是我的网站,但它们在内容定位上还是两个东西。个人主页负责介绍自己和放各种链接,博客则主要放技术记录、折腾过程以及一些杂谈。结构化数据里把这两个站点分开,也更符合实际的网站结构。
作者信息则没有必要重新造一份,继续使用:
"author": {
"@type": "Person",
"name": "mxd",
"url": "https://www.mxdyeah.com"
}然后用 sameAs 把几个常用账号关联起来。
这类东西我一般不会特别在意“写得越多越好”。JSON-LD 的目的还是尽可能准确地描述页面,而不是把所有能想到的字段都塞进去。博客首页是什么,就描述成什么;作者是谁,就指向作者;有搜索,就把真实存在的搜索 URL 模板写进去。
毕竟这些结构化数据最后不是给人看的,维护的时候却还是人来维护。过几年回头看,如果发现 JSON-LD 里面写了一堆已经不存在的 URL,反而挺麻烦。
目前这份配置对我的博客来说已经够用了。以后如果再增加分类页、文章页之类的结构化数据,再根据实际页面补 BlogPosting、BreadcrumbList 等类型,而不是现在一次性全部堆上去。
对于个人博客,我还是更喜欢这种一点一点补的方式。网站本身能正常访问、URL 设计清楚,再让结构化数据准确反映这些东西,就已经很好了。🤤