如何让Blogger模板的NewsArticle JSON-LD在文章页已有JSON-LD时不生效
解决Blogger模板JSON-LD冲突的可行方案
针对你遇到的模板中NewsArticle JSON-LD和招聘文章内JobPosting JSON-LD共存的问题,这里提供三个可落地的方案,无需批量修改100多篇新闻文章:
方案一:自定义字段+Blogger条件标签(推荐,服务器端判断)
利用Blogger的自定义数据字段区分文章类型,让模板只给非招聘文章输出NewsArticle结构化数据:
- 打开每篇招聘文章的编辑器,进入「设置」>「自定义数据」,添加键值对:
- 键:
is_job_post - 值:
true
- 键:
- 进入Blogger模板编辑模式,找到你添加的NewsArticle JSON-LD代码,用以下条件标签包裹:
<b:if cond='!data:view.post.metadata.is_job_post'> <!-- 这里保留你原来的NewsArticle类型JSON-LD代码 --> </b:if>
原理:只有没有is_job_post自定义字段的文章(即新闻类)才会加载模板里的JSON-LD,招聘文章会跳过这段代码,只显示你单独添加的JobPosting数据。
方案二:JavaScript动态检测移除(无需修改文章)
如果不想手动给每篇招聘文章加字段,用JS在页面加载后自动检测并删除模板里的NewsArticle JSON-LD:
- 先给模板里的NewsArticle JSON-LD加一个唯一ID,方便定位:
<script type="application/ld+json" id="news-article-ld"> <!-- 你原来的NewsArticle JSON-LD内容 --> </script>
- 在模板的
</body>标签前插入这段JS代码:
<script> document.addEventListener('DOMContentLoaded', function() { const allLdScripts = document.querySelectorAll('script[type="application/ld+json"]'); let hasJobPost = false; allLdScripts.forEach(script => { try { const ldData = JSON.parse(script.textContent); const ldTypes = Array.isArray(ldData['@type']) ? ldData['@type'] : [ldData['@type']]; if (ldTypes.includes('JobPosting')) { hasJobPost = true; } } catch(err) { // 解析失败跳过当前脚本 } }); if (hasJobPost) { const newsLdElement = document.getElementById('news-article-ld'); if (newsLdElement) newsLdElement.remove(); } }); </script>
原理:页面加载完成后遍历所有JSON-LD脚本,检测到存在JobPosting类型时,删除模板里的NewsArticle脚本。Rich Results Test会模拟页面加载流程,能识别到最终的结构化数据。
方案三:标签分类+条件标签(适合已用标签管理的场景)
如果你的招聘文章都统一添加了特定标签(比如「招聘启事」),直接用标签做判断:
- 确认所有招聘文章都带有同一个标签(比如「招聘启事」),没有的话补加。
- 修改模板里的NewsArticle代码,用标签条件包裹:
<b:if cond='!data:post.labels any (label => label.name == "招聘启事")'> <!-- 这里保留你原来的NewsArticle类型JSON-LD代码 --> </b:if>
原理:只要文章包含指定标签,就不加载模板里的JSON-LD,适合已经用标签做内容分类的情况。
方案对比
- 方案一:最稳定,服务器端直接控制输出,无前端依赖,但需要手动给招聘文章加字段,适合招聘文章数量少的情况。
- 方案二:零文章修改成本,自动适配,但依赖前端JS,极端情况下可能有加载延迟(Rich Results Test一般能正常识别),适合招聘文章多的情况。
- 方案三:操作最简单,但要求所有招聘文章标签统一,适合已有标签体系的场景。
内容的提问来源于stack exchange,提问作者Lucky Singh
相关产品推荐
相关产品推荐

