# 保哥笔记 — 电商SEO > 本分片含 23 篇文章,按发布日期倒序。全部分片索引见 https://zhangwenbao.com/llms-full.md **站点**:https://zhangwenbao.com/ **分类**:电商SEO **生成**:2026-09-12 16:00:11 CST --- ## ChatGPT购物推荐65%只从商品feed里挑 - URL:https://zhangwenbao.com/chatgpt-shopping-product-feed-retrieval-shift.html - 分类:电商SEO - 发布:2026-09-10 | 更新:2026-09-12 - 摘要:店铺后台一切正常,商品却忽然在ChatGPT购物模式里消失了。问题不在页面上,而在它取数据的地方换了一份。这篇讲清楚换的是什么、怎么查自己有没有中招。 - 关键词:电商SEO,ChatGPT购物,AI购物,商品feed > **TLDR**:摘要:2026年7月10日,ChatGPT购物推荐里来自商品feed的比例,一天之内从8.26%跳到了61.54%。同一天有450家店的购物可见度掉了至少三分之一,另有67家反向上涨。到9月初这个比例稳定在65%上下。换句话说,没把商品数据接进去的店,在六成半的推荐位置上根本没参与竞争。而OpenAI那份feed规范里有64个字段,真正必填的只有9个。 > 摘要:2026年7月10日,ChatGPT购物推荐里来自商品feed的比例,一天之内从8.26%跳到了61.54%。同一天有450家店的购物可见度掉了至少三分之一,另有67家反向上涨。到9月初这个比例稳定在65%上下。换句话说,没把商品数据接进去的店,在六成半的推荐位置上根本没参与竞争。而OpenAI那份feed规范里有64个字段,真正必填的只有9个。 做电商的人最怕一种情况:后台一切正常,页面能打开,收录也没掉,可订单就是少了一截,查不出原因。 今年7月中旬,一批店铺就碰上了这个。他们的商品在ChatGPT购物模式里原本能被推出来,忽然就不见了。技术团队查抓取、查结构化数据、查页面速度,什么都没查出来。因为问题不在他们的网站上。 ChatGPT挑商品的原料,那几天换了一份。 ## 7月10日那天到底发生了什么? AI可见度监测公司Profound在一份9月3日发布的研究 (https://www.tryprofound.com/blog/chatgpt-5.6-shopping-transformation)里把这件事复盘了出来。它的做法是每天替客户在ChatGPT上跑一批固定的提示词,然后从网络请求日志里判断:这一次推出来的商品,是ChatGPT现场去网页搜索找来的,还是从它自己那份已经接进来的商品目录里取的。 两种来源的占比,在7月10日这一天发生了断崖式互换。来自feed的推荐从8.26%涨到61.54%,网页搜索那条路从主力变成了配角。7月整月的日序列一共覆盖1757723次购物提示词运行,按50%抽样、每个提示词每天只计一次。 把观察窗口拉长看,趋势更清楚。7月1日到8月24日之间的97725次运行显示,feed检索是在8月正式超过网页搜索的,而到9月3日,它已经占到全部商品推荐的65%左右。 顺手把这个倍数核一下:报告写的是约6.5倍,而61.54除以8.26是7.45。两个数字都对,只是它算的是增量那一层——涨了几倍和变成了几倍差一倍,引用这类数字的时候最好直接拿两个百分比。 这不是一条缓慢上升的曲线。年初ChatGPT几乎完全依赖网页搜索取商品数据,4月开始有一点feed的份额,5月加速,7月10日一天之内完成了主次易位。 口径 | 7月7日至9日 | 7月10日至12日 | 变化 | feed检索占商品推荐比例 | 8.26% | 61.54% | 报告称约6.5倍 | 前10商家占全部引用的份额 | 22.5% | 41.8% | +19.3个百分点 | 被引用到的唯一商家数 | 13524 | 10607 | -21.6% | 时间点上唯一对得上的事件是OpenAI在7月9日发布了GPT-5.6 (https://openai.com/index/gpt-5-6/),并说明会在接下来24小时内推完。Profound把7月的大部分变化归到了这次发布上。 这里要说清楚一件事:OpenAI从来没有确认过这层因果关系,它的ChatGPT更新说明里也没写购物检索来源的调整。所以严格讲,这是一次时间上的吻合加上排除法,不是官方口径。 ## 为什么同一天有450家店掉了三分之一,67家反而涨了? Profound手上有687个客户满足严格的观察条件:整个7月每天都有提示词触发购物模式,并且7月7日到12日每一天都至少出现过一张指向自家商品的卡片。在这687家里,450家的购物可见度在7月10日前后掉了至少三分之一,67家涨了同样的幅度,合计517家的波动超过33%。 涨跌同时出现,说明这不是一次全局降权,而是一次换料。原料从网页换成了feed,谁的feed在里面,谁就接住了这波流量。 Profound对这517家做了一次最小二乘回归,自变量只有两个:这家店在网页搜索那条路上丢了多少检索、在feed那条路上又拿回了多少。两个变量联合解释了83%的可见度变化。剩下的17%里才是别的因素。 对一个观测性数据集来说,83%已经是很强的解释力。它的含义很直白:7月那一轮涨跌,绝大部分不是因为你的商品变好了或变差了,而是因为你在不在那份新原料里。 保哥去年帮一个做户外装备的客户查过一次类似的掉量。当时的判断路径是先看自然搜索、再看广告、最后才想到AI入口,整整绕了三周。那次的结论是:一个渠道的份额变化,往往先于任何页面层面的原因显形,而排查顺序通常是反的——先查自己能改的,最后才查自己改不动的。现在回头看,如果第一步就问一句“这个渠道取数据的地方还是原来那个吗”,三周能压到三天。 ## 这份报告的三处口径,读的时候得留神 数据很漂亮。不过越漂亮的数字,越得先问一句它是怎么量出来的。这份报告有三个地方,如果不注意,会让你把结论推得太远。 ## 判断来源的那把尺子,是Profound自己刻的 “这条推荐来自feed还是网页搜索”,不是OpenAI给的标签,是Profound从网络请求日志里自己分类出来的。GPT-5.6这次发布如果顺手改了返回结构,那么同一件事就可能被重新归了一次类。 一天之内6.5倍这个数字,既可能是检索机制真的切换了,也可能是分类口径跟着接口变了一次。报告没有做这一层对照,也就是说,它没有回答“把7月9日的数据用7月10日之后的分类规则重跑一遍,还是8.26%吗”。 这个问题不是吹毛求疵。任何一次“A和B不一样”的结论,都得先过一道自基线:A和A自己一样吗。站内之前做过一次实测,测出74%的页面对爬虫和用户呈现不同,补上一组同源对照之后只剩2.2%——差的那七十几个百分点全是测量方式造出来的。方法论细节在页面抖动那篇的自基线设计 (https://zhangwenbao.com/page-content-jitter-baseline-seo-diff-false-positive.html)里写过。 ## 687家这个样本,是筛过的 入选条件写得很清楚:7月7日到12日每一天都得至少有一张自家商品卡。这意味着在7月10日彻底消失的店,根本进不了这个样本。 所以“450家掉了三分之一”是在一批本来就能被看见、并且掉了之后还能被看见的店里数出来的。真正被清出场的那批,人数不在这份报告里。这不是报告的错,它的观察设计需要连续数据;但读的时候要知道,实际受影响的面比450大。 ## Shopify那35%,是用相关系数推出来的 报告说Shopify大约占全部feed检索的35%。依据是把Shopify渠道的日检索曲线和整体feed检索曲线放一起算相关,7月1日到24日的Pearson系数0.997、Spearman系数0.993。 两条曲线几乎完全同形,这一点没有疑问。但同形不等于包含关系。7月10日那天所有在这个机制里的子集都会同时跳变,任何一个这样的子集拿去算相关,都能得到接近1的系数。相关系数能证明“它跟着一起动”,证明不了“它占了其中35%”。 这类把时间序列相关当成占比依据的做法,在工具报的准确率里很常见,以前拆过一次审计工具自己划及格线的分母问题 (https://zhangwenbao.com/ai-audit-tool-accuracy-rate-denominator.html),是同一种毛病:结论的形式比它的证据强度要硬。 说这三条不是要否掉这份研究。它的核心结论——检索来源换了、换在7月10日、没接feed的店在六成半的位置上不参与——三条口径都不影响。要小心的是别把35%当成精确数字去做预算,也别以为受影响的只有450家。 ## 接了feed和没接feed,ChatGPT眼里是两套世界吗? 先说官方口径。OpenAI在购物功能的帮助文档 (https://help.openai.com/en/articles/11128490-shopping-with-chatgpt-search)里写的是:ChatGPT用结构化商品数据来挑选商品,比如价格和描述,数据来自数据提供方,也来自商家自己。同一页还有一句话值得原样记住——商品结果由ChatGPT独立挑选,不是广告,也不受OpenAI任何合作关系影响。 这句话回答了“能不能花钱买位置”,没回答“不接数据还能不能被挑中”。而Profound那组数据给出的答案是:能,但只剩三成半的机会。 接入方式目前分三条,门槛差得很远。 路径 | 谁适用 | 要做什么 | 当前状态 | Shopify Catalog | Shopify店铺 | 不用做额外动作,商品数据已经接好 | 已生效 | Etsy目录 | Etsy卖家 | 平台侧已接入 | 已生效 | 直连feed申请 | 自建站与其他零售商 | 在商家页提交申请 | 现有申请者在等待名单上 | 第三方提供方 | 已用Salesforce、Stripe这类服务的 | 走提供方的通道 | 视提供方而定 | OpenAI的商家页面 (https://chatgpt.com/merchants/)把这件事说得很克制:其他零售商可以申请直连feed,但已提交的申请处在等待名单上。购物功能目前只对美国用户开放,官方说会逐步扩到更多地区,并计划在今年晚些时候上线一个自助接入平台,让商家自己把feed连上去。 这几句话拼起来是个挺尴尬的局面。六成半的推荐位置只对接了feed的人开放,而接进去的通道对大多数人是排队制,自助口子还没开。Shopify因此成了小商家眼下唯一走得通的那条缝——Profound的建议也是这个:大品牌自己接直连feed,小卖家通过Shopify接。 Shopify这边还有一层默认配置值得一并看:它默认上线了agents.md (https://zhangwenbao.com/shopify-agents-md-agentic-discovery.html),集合页也被很多人评估成AI购物时代的主战场 (https://zhangwenbao.com/shopify-collection-page-geo-ai-shopping.html),两件事和目录接入是三条不同的通道,别混在一起算。 Shopify自己还有个说法可以对照:由Shopify Catalog驱动的AI搜索,转化率是用抓取数据的2倍。这句话出自平台方,口径和动机都要打折看,但它至少说明平台把这条通道当卖点在推。 这套feed走的是Agentic Commerce Protocol这条协议,它在3月24日扩展到了商品发现环节。站内之前拆过这几个协议的选型,结论是小商家接入AI购物代理本质上是道配置题 (https://zhangwenbao.com/agentic-commerce-platform-config-guide.html),不是站点重构。7月10日这件事没改变那个结论,只是把配置的紧迫性提前了。 ## 那份feed规范里到底要填什么? Profound在报告末尾给了一个预测:等更多品牌都接上feed之后,竞争就会从“有没有接”变成“接进去的字段填得怎么样”。 这个预测有道理,但它没说清楚字段是哪些。于是把OpenAI那份商品数据上传规范 (https://developers.openai.com/commerce/specs/file-upload/products)整份拆了一遍,逐行统计了字段表。 结果比预想的有意思:整份规范一共64个唯一字段,标着必填的只有9个。剩下55个分散在14个分组里,全部是可选或者条件必填。 分组 | 字段数 | 其中必填 | 基础商品数据 | 9 | 9 | 商品信息(材质、颜色、尺码、尺寸、重量等) | 14 | 0 | 可选与条件列(含Google旧列名) | 11 | 1 | 变体 | 6 | 0 | 其他受支持数据 | 6 | 0 | 退货 | 3 | 0 | 结账 | 3 | 0 | 履约、评价问答、地理标记、广告 | 各2 | 0 | 媒体、价格促销、商家信息、OpenAI标记 | 各1 | 0 | 那9个必填字段挤在同一个分组里,就是基础商品数据:item_id、title、description、url、brand、seller_name、image_url、availability、price。 看这份清单的第一反应可能是“这也不难”。难的不在这9个,在剩下55个上。必填字段决定你的商品能不能进来,可选字段决定它在一堆同类商品里凭什么被挑中。材质、颜色、尺码、性别、年龄段、三围尺寸、重量、退货期限、是否接受换货、店铺评分、评价条数——这些全在可选里。 换个角度看这件事就更清楚:ChatGPT要回答“我想买一双防水的越野跑鞋,41码,能在两周内退的”,它靠的不是你的商品标题,是material、size、size_system、accepts_returns、return_deadline_in_days这几个字段。你不填,这个问题里就没有你。 规范里还有几个字段透露了别的信息。有一个广告分组,is_ads_eligible和ads_metadata——同一份feed也是广告侧的原料。结账分组要seller_privacy_policy和seller_tos,说明它在为站内直接成交留位置。还有一批字段叫identifier_exists、google_product_category、additional_image_link、item_group_id,这几个名字是Google购物feed的旧列名,规范在兼容那套字段表,做过Merchant Center的人可以直接搬。 关于分类字段这件事,Google自己今年也补了一手,给商品结构化数据加了category属性,把页面标记和数据源的分类口径对上了 (https://zhangwenbao.com/merchant-listing-category-property-google-product-taxonomy.html)。两边现在是同一个方向:让页面上的商品和feed里的商品能被认成同一件东西。 ## 哪些字段填错会让整行商品当场消失? 规范里有一条写得非常硬,但很容易被跳过。 availability这个字段只认五个值:in_stock、out_of_stock、pre_order、backorder、unknown。规范的原话是,缺失、空值或者无法识别的值会让这一行被拒。库存状态确实拿不到的时候,要显式写unknown,而不是留空。 留空和写unknown是两个完全不同的结果:一个是整条商品被丢掉,一个是照样进来只是状态未知。 这一条值得所有从Google feed搬过来的人多看两眼。Merchant Center对availability的容错策略和这里不一样,很多店的feed生成逻辑里,库存字段拿不到值就输出空字符串,在旧渠道只是少一个属性,搬到这里就是整行商品不见了。 站内做过一次大规模实测,结论正好能对上:5537件商品的描述字段是空的,其中2542件出自同一个站 (https://zhangwenbao.com/product-description-empty-field-attribution-audit.html)。空字段从来不是均匀分布的,它扎堆出现在同一套模板、同一段生成逻辑上。真要排查,按站按模板查比按商品查快得多。 另外三个容易出事的字段: - item_id要求在整份feed里对每个商品或变体唯一且稳定,并且永远不能复用给另一个商品。用自增序号或者按行号生成的,商品下架再上架就会撞上这条。 - gtin必须是恰好8、12、13或14位数字,校验位要有效,前导零要保留,不许有空格和短横。没分配GTIN的商品,规范要求直接省略这个字段。 - mpn要和brand一起提交,规范特别写了一句:不许编一个值去顶替缺失的GTIN。 GTIN这一栏是所有商品数据里最容易自欺欺人的地方。校验位算得过并不代表填对了——之前拆过一次,条码栏里填的那串数字其实是变体ID的后八位 (https://zhangwenbao.com/product-identifier-cross-copy-mismatch-audit.html),位数对、校验也过,可它指向的不是任何一件真实商品。校验位这道闸能拦住的大约只有一半问题,剩下一半得靠和真实商品库对账。 ## 变体那三个字段为什么最容易配错? 变体在这份规范里不是一个字段,是三个字段的联动,而且有前后依赖。 - group_id:所有变体共享的父级列表ID,必须稳定。缺失或为空时会退回用item_id,而那样就不构成变体组了——不报错,只是静悄悄地把一组变体拆成了一堆互不相干的独立商品。 - listing_has_variations:每一行变体都要设成true。省略、留空或者填false,变体选项就不生效。 - variant_dict:把选项名映射到选中的值。它要求listing_has_variations=true,并且group_id和item_id不同,两个条件缺一个就被忽略。 这三条连起来是一个典型的静默失败链。你把variant_dict写得很完整,但group_id忘了输出或者直接等于item_id,规范的处理方式是忽略,不是报错。于是同一双鞋的8个尺码,在ChatGPT那边是8件毫无关系的商品,每一件都只有一个尺码可选。 为什么这类错误特别难发现?因为feed校验通过了,行数对得上,字段也都在。要发现它,得去数“变体组的数量应该是多少、实际是多少”,而不是数行数。 同一类问题在品牌字段上也出现过。站内实测过66个站的商品数据,品牌字段一个空的都没有,可有17个站把自己写成了好几个牌子 (https://zhangwenbao.com/product-vendor-brand-field-variants-audit.html)——大小写不一、带不带公司后缀、全称和简称混用。字段填满率100%,一致性却不到。填没填是一道闸,填得对不对是另一道,后面那道从来没有工具替你把关。 ## 为什么头部更集中了,被提到的商家反而少了两成? 这是7月10日那组数据里最该被单独拎出来看的一条。 7月7日到9日,前10商家占全部引用的22.5%;7月10日到12日,这个数字变成41.8%。同一段时间里,被引用到的唯一商家总数从13524降到10607,掉了超过两成。 头部份额差不多翻了一倍,而被提到的商家少了两成。这两件事同时发生,说明feed检索的取数范围比网页搜索窄。网页搜索能碰到的是整个开放网络,谁的页面被抓过、被索引过,就有被碰到的可能;feed检索能碰到的只是已经接进来的那份目录,目录里没有的,再好也不在候选集里。 候选集一收窄,结果必然向头部集中。这不是算法偏爱大品牌,是可选项变少的自然后果。站内之前写过一篇,讲的就是AI代理替用户逛店下单时品牌到底是没被看见还是被淘汰 (https://zhangwenbao.com/agentic-commerce-brand-visibility-blindspot.html),那时候这个问题还是个假设,现在它有了日期和数字。 这个机制对独立站主的含义比数字本身更重要。过去几年AI搜索给中小站的那点机会,靠的是开放网络这个大池子——内容写得够专、够细,就有可能在长尾问题里被引到。站内之前统计过,85%的品类在AI可见度上还没有主人 (https://zhangwenbao.com/ai-visibility-topic-ownership-category-level.html),说的就是那个池子还没被占满。 购物这条线现在变了性质。它从“谁写得好谁被引”,变成了“谁在名单上谁被选”。这两种玩法的进入成本差得很远:写得好这事靠长期内容投入,上名单这事靠一次接入动作。 好消息是,接入动作是一次性的,而且门槛不高。坏消息是,等所有人都接完,竞争就回到字段颗粒度上,那时候比的是谁的商品数据更干净、更完整——而这件事需要很长时间的治理,临时补做不出来。 ## 不是Shopify店,现在该按什么顺序动手? 先说不该做什么:不要因为这件事去重做站、重做页面结构、重写商品详情页。这一轮变化跟你的页面无关,重做页面一分钱回报都没有。 按回报排个序,大概是这样四步。 ## 第一步,先确认自己现在到底在不在名单上 最直接的办法是在ChatGPT购物模式里用自己的品类问几个真实购买问题,看会不会出现自家商品卡,以及卡片指向哪里。要问带约束条件的问题,比如尺码、材质、价格区间、退货条款,因为那种问题才会去用feed里的细节字段。 光问一次不算数。这里最容易踩的坑是拿单次查询当结论——站内做过2961次实测,结论是AI可见度的名次本身带很大噪声 (https://zhangwenbao.com/ai-visibility-ranking-statistical-noise.html),同一个问题连问几次结果都不一样。所以至少要跑十几次、分几天跑,看的是出现频率不是有没有出现。想把这事做成可重复的流程,可以直接拿智能体就绪度自查打分表 (https://zhangwenbao.com/agent-readiness-scorecard-dtc-ai-shopping-agent.html)当模板,再配上AI可见度竞品分析的那套跑法 (https://zhangwenbao.com/ai-visibility-competitive-analysis-share-of-voice.html)把对手一起量进来。 ## 第二步,按那9个必填字段先把数据体检一遍 不管申请通道排到哪一天,数据得先干净。这9个字段里最容易出问题的是availability和item_id:前者留空会整行被拒,后者复用会把两件商品混成一件。 体检不用等接入,现在就能做,用自己现有的Google购物feed当输入就行,两边字段大面积重合。价格字段还要多看一眼:站内拆过一次商品价格不一致的六条报警 (https://zhangwenbao.com/product-price-copies-false-positive-audit.html),扣完之后一条不剩,那次的教训是先定好拿哪一份价格当标准,再去比对。站内那份产品feed该谁管的拆解 (https://zhangwenbao.com/product-feed-seo-asset-organic-ai-ownership.html)里有一份可以直接用的字段核对清单。 ## 第三步,把55个可选字段里跟自己品类强相关的那批补上 不要全填,填了也没用。判断标准是一句话:买你这类东西的人,在决定买之前会问什么,就补那几个字段。 - 服装鞋帽:size、size_system、color、material、gender、age_group - 家电与工具:dimensions系列、weight、condition - 高单价品类:accepts_returns、return_deadline_in_days、return_policy、accepts_exchanges - 口碑敏感品类:review_count、star_rating、store_review_count、store_star_rating 这一步的工作量常常被低估。不是往表里加几列的事,是要在商品库里真有这些数据。多数店的尺码写在商品描述的一段文字里,而不是一个结构化字段,要抽出来得先治理一遍。 ## 第四步,提交直连申请,同时把Shopify那条路当备选评估一下 申请要排队,所以早交比晚交好。同时值得算一笔账:如果自己的品类和规模适合,走Shopify接入是当下唯一确定能通的路。这不是说要搬站,是说把它放进选项里认真算一次成本。 顺带说一句,接进feed之后流量的落点还是你的站。之前拆过一次数据,AI来的流量转化率是自然搜索的好几倍,但落地页常常接不住 (https://zhangwenbao.com/ai-referral-traffic-conversion-landing-page.html)。前面四步做完只是能被找到,能不能成交是另一条链路上的事。 ## 这件事和feed该谁管不是同一个问题 站内之前写过一篇,讲的是产品feed在组织里的归属——它通常被当成投手的活,挂在广告部门下面,而它实际影响的是自然搜索和AI购物的露脸机会。那篇的落点是责任划分和协作机制。 这一篇不解决那个问题。这一篇讲的是检索来源在某一天换了,以及换完之后那份数据的字段规范长什么样。两件事的关系是:7月10日之后,feed归谁管这个问题的代价变高了。以前管得松,损失的是一部分免费曝光;现在管得松,损失的是六成半的推荐位置。 如果你正在读的是“该谁管”那个问题,直接去看那篇;这一篇的用处是给那篇的紧迫性加一个具体的数字。 另外一个容易混的边界:这一篇讲的不是怎么在AI回答里被引用。被引用和被推荐是两套机制,站内分开写过,被检索和被引用是两套打法 (https://zhangwenbao.com/ai-citation-retrieval-content-strategy.html)。购物模式里的商品卡走的是第三套——商品目录检索,跟前两套都不一样。 ## 到9月12日为止,还有哪些事没定? 把已知和未知分开列一下,免得把推测当结论用。 已经确定的:检索来源在7月10日发生了主次互换;到9月初feed占比稳定在65%上下;Shopify与Etsy的目录已接入;直连申请处在等待名单状态;购物功能只对美国用户开放;那份规范64个字段、9个必填。 还没有答案的: - OpenAI没有确认过GPT-5.6和这次检索来源变化的因果关系,官方更新说明里也没有这一条。 - 自助接入平台官方说在今年晚些时候上线,到9月12日还没有具体日期。 - 等待名单的处理速度、是否有筛选标准、按什么顺序放行,官方三处文档都没写。 - feed里的商品一旦进来,是按什么排序被挑中的,这一层完全没有公开信息。Profound的数据只能说明谁在名单上,说明不了名单内部怎么排。目前唯一能摸到的线索是有人把ChatGPT挑源时的内部字段扒了出来 (https://zhangwenbao.com/chatgpt-source-selection-network-traffic-fields.html),但那是网页引用那条路的字段,不是商品目录这条。 - 购物功能扩到美国以外市场的时间表没有公布,对做多市场的独立站来说,这一条直接决定要不要现在就投入。 那份feed协议本身是公开的,3月24日扩展到商品发现环节 (https://openai.com/index/powering-product-discovery-in-chatgpt/)的时候OpenAI发过说明,Salesforce和Stripe这类服务商也在支持名单里。也就是说,通道的技术规格是透明的,被卡住的是准入。 ## 常见问题解答 ## 没有接商品feed,是不是在ChatGPT购物模式里就完全看不到了? 不是完全看不到。网页搜索这条检索路径还在,按9月初的数据它还占三成半左右。没接feed意味着你只在这三成半里参与竞争,另外六成半的位置不参与。而且这个比例还在往feed那边偏。 ## 那份规范64个字段,是不是填得越多越好? 不是。9个必填决定能不能进来,必须填对;剩下55个决定在同类商品里凭什么被挑中,判断标准是买你这类东西的人在决定前会问什么。和购买决策无关的字段填了也不会带来额外机会,反而增加数据维护成本。 ## availability留空和写unknown有什么区别? 区别是整行商品在不在。规范明确写了,这个字段缺失、留空或者填了无法识别的值,这一行会被拒;库存状态确实拿不到时,要显式写unknown。从Google购物feed搬过来的生成逻辑最容易踩这一条,因为两边的容错策略不一样。 ## Shopify占35%这个数字可信吗?要不要按它做决策? 方向可信,数字不要当精确值用。它的依据是两条日检索曲线的相关系数0.997,而相关系数能证明两者同步变动,证明不了占比。把它理解成“Shopify渠道在这次变化里是主要组成部分之一”是安全的,拿35%去算预算分配就过度了。 ## 我的店在7月10日之后掉量了,怎么确认是不是这件事导致的? 看三个信号能不能同时对上:掉量发生在7月10日前后而不是渐进下滑;掉的是来自ChatGPT的流量而不是全渠道;自然搜索排名和广告表现在同期没有可解释的变化。三条都对上,指向这次检索来源切换的可能性就很高。需要注意的是后台本身也不一定看得见这部分流量,ChatGPT来的访问在很多站的报表里是隐身的 (https://zhangwenbao.com/chatgpt-recommendation-traffic-attribution-blindspot.html),先把归因链补上再下结论。都对不上就别往这上面归因,去查别的。 ## 现在申请直连feed,大概多久能通? 官方没有公布处理时间,也没说筛选标准和放行顺序。已知的只有一条:现有申请者处在等待名单上。所以申请这件事早做比晚做好,但不要把上线时间点押在它身上做排期。 ## 权威参考资料 ## 没有GTIN能填UPC码吗?GMC里没有UPC这一栏 - URL:https://zhangwenbao.com/gtin-upc-identifier-exists-gmc-geo.html - 分类:电商SEO - 发布:2026-09-09 | 更新:2026-09-09 - 摘要:商品只有一串UPC码,Merchant Center里翻遍属性表也找不到UPC字段,于是顺手勾了无标识符。这一勾可能让整批商品拒登,也让AI认不出你卖的和别人卖的是同一件东西。只有MPN和用Shopify的情况另有一套填法。 - 关键词:GTIN,电商SEO,AI购物,Merchant Center > **TLDR**:摘要:把200万个UPC-E码逐个算一遍,其中58%直接填进gtin那一栏,能顺顺当当骗过Google的校验位。末位是5到9的那100万个,一个不落全部通过;末位是3的那20万个,一个都过不去。位数和校验位这两道闸,只拦得住写错的数字,拦不住写成了另一件商品的数字。 > 摘要:把200万个UPC-E码逐个算一遍,其中58%直接填进gtin那一栏,能顺顺当当骗过Google的校验位。末位是5到9的那100万个,一个不落全部通过;末位是3的那20万个,一个都过不去。位数和校验位这两道闸,只拦得住写错的数字,拦不住写成了另一件商品的数字。 后台翻了三遍,属性表里就是没有UPC这一栏。 这大概是做Google购物的人最容易卡住的一分钟。手上明明有一串12位的UPC码,印在包装背面的条形码下方,清清楚楚。可Merchant Center的字段清单里,只有一个叫gtin的东西。于是很多人做了同一个动作:把商品标记成没有唯一标识符,然后接着往下走。 问题就出在这一步。UPC不是GTIN的替代品,它本身就是GTIN。 ## 手上只有UPC码,Merchant Center里该填哪一栏? GTIN是Global Trade Item Number的统称,中文叫全球贸易项目代码。它不是某一种条码的名字,而是一整个家族的户口本。北美用的UPC、欧洲用的EAN、日本用的JAN、图书用的ISBN、整箱整托盘用的ITF-14,全都是GTIN的不同格式,只是位数和使用地区不一样。 所以答案很简单:有UPC就直接填进gtin,这不是凑合,这就是标准填法。Merchant Center里没有UPC字段,将来也不会有,因为压根不需要。 按Google官方对gtin属性的规定 (https://support.google.com/merchants/answer/6324461?hl=zh-Hans),这一栏接受的位数只有0、8、12、13、14这五种,数据类型是数字,中间的空格和短划线会被系统忽略掉。各种格式对应的位数是这样的: 格式 | 主要地区 | 位数 | 提交前要注意什么 | UPC | 北美 | 12位 | 官方原话是“请将8位数字的UPC-E代码转换为12位数字的代码” | EAN | 欧洲、中国大陆 | 13位 | 最常见的一种,出口商品基本都是它 | JAN | 日本 | 8位或13位 | 两种都收 | ISBN | 图书 | 13位 | 官方要求“请将ISBN-10转换为ISBN-13” | ITF-14 | 多件组合装 | 14位 | 整箱整托盘用,零售单品别填这个 | 这张表里藏着两个动作词:转换。8位的UPC-E要转成12位,10位的ISBN要转成13位。它们不是“也可以转”,是提交之前必须转。 很多人不知道UPC-E是什么。它是UPC-A的压缩版,专门给口香糖、单支笔这种没地方印条码的小包装用。压缩的办法是把UPC-A里连成一串的零抽掉,剩下8位。抽掉的零在扫码枪里会被自动补回去,但在Merchant Center的输入框里不会。 表格最后一行的ITF-14也值得单独说一句。它是包装层级码,一箱、一托盘各有各的号,跟零售单品那个码不是同一个东西。工厂发来的资料里经常两个码并排列着,采购顺手把整箱那个填进了feed,商品照样上架,因为14位是合法位数、校验位也算得过。真正的后果要到很久以后才显形:比价的时候,你那件单品被拿去和别人家的整箱装比价格,怎么看都贵得离谱。 分辨方法是看GTIN-14的第一位。零售单品的13位码补零成14位时首位是0,而包装层级码的首位是1到8,代表不同的箱装规格。首位不是零的,基本可以断定不该出现在零售feed里。 ## 8位的UPC-E直接提交,那道闸拦得住吗? 这是保哥这次真正想弄明白的事。 直觉上,Google有一道校验位验证,填错的数字应该会被打回来。校验位就是GTIN最后那一位,它由前面所有数字按固定权重算出来,随便编一个数字,最后一位对不上的概率是九成。听起来挺可靠。 可UPC-E的情况特殊。它是8位,而GTIN-8也是8位。位数这道闸对它完全无效。剩下的就只有校验位那一关了。 所以我把所有可能的UPC-E码穷举了一遍。数字系统位取0和1,后面6位数据从000000排到999999,一共200万个。每一个都按GS1规范展开成UPC-A算出真校验位,拼成商家会从条码上照抄的那8位,再拿GTIN-8的校验规则去验一次。跑之前先用五组公开的标准配对校准了尺子,包括EAN-13的经典示例9780306406157,以及UPC-E 0425261展开成042100005264这一对,全部吻合才开始跑。 结果比我预想的难看得多。 UPC-E末位数字 | 样本量 | 被当成合法GTIN-8收下的比例 | 5、6、7、8、9 | 各20万 | 100% | 0、1、2 | 各20万 | 20% | 4 | 20万 | 20% | 3 | 20万 | 0% | 合计 | 200万 | 58% | 末位是5到9的UPC-E码,直接填进去,校验位验证一次都拦不住。不是概率高,是必然通过。 这不是巧合,是能证明的。UPC-E展开成UPC-A时,末位5到9那一档的规则是在中间插进4个零。校验位算法按从右往左的奇偶位分配3和1两种权重,插进去的零本身不贡献任何数值,而4是偶数,插完之后后面每一位的奇偶都没变。于是两个式子算出来的加权和完全相同,校验位自然也相同。 末位是3那一档,插的是5个零,奇偶全部翻转,而且被抽走的那个3在展开体里根本不出现。两个式子的差固定是个奇数,永远不可能被10整除。所以那20万个码,一个都通不过。 把这两件事合起来说就是:你把UPC-E直接填进gtin,有超过一半的概率不会收到任何报错,商品照常上架,而那个8位数字指向的是GTIN-8编码空间里另一件东西——那是GS1单独分配给小包装商品的号段,跟你的商品没有半点关系。 会报错的那42%,反倒是幸运的。至少它告诉你填错了。 ## 校验位算得过,就等于填对了吗? 顺着上面那条线再往下走一步。既然校验位这道闸在UPC-E面前形同虚设,那它到底能拦住什么? 我又跑了三组对照。 填错的方式 | 样本量 | 完全漏过去的比例 | 位数就不对(9位、10位、11位内部编号) | 各20万 | 0% | 纯数字的内部SKU冒充12位UPC | 200万 | 7.01% | UPC-E不展开直接提交 | 200万 | 58% | 位数不对的那一类,Google一个都不放过。ISBN-10的10位、内部编号的9位和11位,全部被位数闸挡在门外。这道闸虽然笨,但绝对可靠。 中间那一行是重点。把店铺自己的SKU填进gtin,这个错误在独立站里泛滥成灾。随机的12位纯数字,恰好通过校验位的概率是十分之一,再扣掉落在受限前缀里被二次拦下的那部分,还剩7%左右能完整地漏进Google的商品目录。 说到受限前缀,这是Google那道闸的第二层,很多人根本不知道它存在。官方明确写了两条禁止提交的号段:前缀为02、04或2的属于受限范围,前缀为05、98或99的属于优惠券范围。前者是企业内部自用码,超市里现场称重打印的价签就用它;后者是优惠券专用。这两类号在GS1体系里本来就不指向任何一件全球流通的商品。我算了一下,随机生成的合法13位码里有15.06%会落进这两个区间,等于白送一道拦截。 这一层拦截也解释了一个现象:为什么有些卖家在某个中文平台上买了一批“便宜条码”,提交后不报错,过一阵子却被判无效。因为那批码要么本来就在受限号段里,要么早就被别人用过。 顺带说一句站内的实测数据。之前抓了131个海外独立站的商品页,在结构化数据里真填了条码的只有11个站 (https://zhangwenbao.com/product-identifier-cross-copy-mismatch-audit.html),一共141条,其中25条经不起校验位一算,而这25条集中在4个站——挖开看,填的其实是平台变体ID的后八位。这就是上面那7%在真实世界里的样子。 ## 手上只有MPN,能顶替GTIN填进去吗? 不能。而且这个错法有个很坏的性质:它有小概率不报错。 MPN是厂商自己定的料号,通常带字母、带横线,位数也不按GTIN那套走。填进gtin那一栏,多数情况下当场报invalid value [gtin],位数闸先把它挡在门外了。 危险的是少数情况:万一你的MPN恰好是纯数字,位数又正好是12位。上面那组对照量过这种概率——纯数字冒充12位UPC,7%能完整漏过去。漏过去之后是什么局面?你提交了一串合法的、但属于别人产品的GTIN。缺一个标识符只是信息不全,提交一个别人的标识符是编造,后者在Google那里的定性严重得多。 MPN有它自己的位置,就叫mpn。填在那里,同时务必把brand也填上。至于identifier_exists,下一节会说它的语义;这里先补一句:这个字段缺省值就是true,所以有品牌有料号、只是没条码的时候,最省事的处理是根本不提交它。 ## brand加MPN这一组,能顶多少用? 比什么都没有强不少,但要清楚它弱在哪。 GTIN是全球唯一且跨平台通用的,MPN只在“品牌加料号”这个组合下才唯一。机器做跨源合并时,前者是精确匹配,后者要先确认品牌名说的是同一家公司——多一道判断就多一分不确定。后面要讲的评论聚合、比价合并那套价值,MPN只能兑现一部分。 在配件、零部件、工业品这些品类里,厂商料号本来就是行业内通用的检索键,MPN的实际效果会好一些。OpenAI的商品feed规范里也收mpn,同样是可选字段,要求是“保留其标点和大小写”——注意这跟gtin那一栏“不带空格和短划线”的要求正好相反,别用同一套清洗规则处理两个字段。 缺GTIN的代价是有的,只是不像很多人以为的那么重。Merchant Center里有一类专门的提示叫“因缺少值而导致效果受限”,缺gtin是其中最常见的一种。它不是拒登,商品照常投放,但Google没办法把你的商品和目录里的同款对上,覆盖面和展示量都要打折。 ## 代理别人的品牌,码该找谁要? 找供应商。他们手上一定有,只是常常懒得给。 要的时候把用途说具体:Google Merchant Center和AI购物渠道需要这个号,比笼统地说“给我个条码”容易要到得多。前者是一个能落到具体系统的诉求,后者听起来像可有可无的资料整理。 ## 说自己没有GTIN,凭什么Google说了不算? 现在说回最开始那个动作:找不到UPC字段,于是把商品标成没有标识符。 这个开关在feed里叫identifier_exists。它的取值只有yes、true、no、false四个,Merchant API里只收true和false,而且必须用英文提交,写成中文的“否”不算数。这一条看着像废话,但每年都有人栽在本地化插件自动翻译上。 关键在于,这个开关不是你说了算的。 Google官方对“商品标识码不正确”这个问题的说明 (https://support.google.com/merchants/answer/12158126?hl=zh-Hans)写得很直白:如果你把这个属性提交成false,而Google认为该商品应该拥有GTIN,商品会被拒登,直到你提供为止。判断依据是那句“我们认为该商品拥有全球贸易项目代码,因为类似的商品/服务会使用此标识码”。 注意这句话的落点。它不是去比对别家商店的同款商品页,而是看你所在的品类通常怎么做。你卖的是量产的电动牙刷,这个品类里九成九的商品都有条码,那你说自己没有,这句话本身就不成立。 这里要区分两种后果,中文教程里经常混为一谈: - 把identifier_exists错填成no:官方措辞是“将收到警告”,不是立刻拒登。 - 提交了不正确的标识符:官方措辞是“您的商品可能会被拒登”。 - 被判定为“商品标识码不正确”:这条明确写了拒登,直到补上为止。 换句话说,最危险的不是留空,是填了一个错的。这跟大多数人的直觉正好相反——很多人觉得随便填点什么总比空着强,实际情况是空着只挨一句警告,填错了直接下架。 ## 自有品牌到底该填no还是干脆留空? 这是自有品牌卖家最常问的一句,也是被误导得最狠的一句。 先把identifier_exists的真实语义摆出来。Google对这个属性的官方定义 (https://support.google.com/merchants/answer/6324478?hl=zh-Hans)说得很清楚:只有在你确定商品没有任何可用的唯一商品标识码时,才能把它设成否。而所谓唯一商品标识码,按Merchant Center对唯一商品标识码的说明 (https://support.google.com/merchants/answer/160161?hl=zh-Hans),是由GTIN、MPN、品牌这三个属性共同构成的。 三个,不是一个。 所以identifier_exists = no的意思,从来不是“我没有条码”,而是“条码、厂商零件号、品牌,我一样都没有”。一个有自己LOGO、有型号、有品牌注册的自有品牌卖家,去勾这个选项,等于在系统里说自己是三无产品。Google那边看到的是一组自相矛盾的数据:品牌栏填得好好的,却声称没有任何标识符。 官方给出的、可以合理填no的场景其实只有两类,英文原文列得很具体:一类是定制或独一无二的商品,比如定制T恤、艺术品、手工制品;另一类是GTIN制度出现之前的老东西,比如老货、古董、1970年前出版的书。 那自有品牌该怎么填?gtin留空,brand和mpn填满,identifier_exists不动。这样系统读到的是“这件商品用品牌加厂商零件号来识别”,逻辑自洽,不会报矛盾。 但这只是权宜之计。品牌加零件号这套组合的问题在于,它是你自己家的语言。别人家的目录里没有你这套编号,跨渠道对不上,等于每一个渠道都要重新认识你一次。真要长期做,还是得去GS1申请一段属于自己的厂商识别代码,申请流程和材料清单在这篇里写过 (https://zhangwenbao.com/cross-border-product-gtin-guide.html),走完大概两到四周。 ## 同款不同色,能共用一个码吗? 不能。这句话说了很多年,但落到具体怎么做,还是有人搞混。 GS1的分配规则是一物一码,不同规格、不同包装、不同颜色尺码,厂商分配的本来就是不同的码。红色M码和黑色L码是两件商品,各有各的号。共用一个码不只是不规范,是让Google无法区分你的两件商品,比价的时候会把它们当成同一件来算。 结构化数据这一侧的要求也是配套的。按Google对商品款式结构化数据的规定,商品组必须有一个唯一ID,用productGroupID或者变体上的inProductGroupWithID声明;而每一个款式“在对应的结构化数据标记中都必须具有唯一ID,例如使用sku或gtin属性”。 注意官方这里说的是sku或gtin,两个都行。所以变体层的唯一性不是非要靠条码不可,用你自己的SKU也能满足。但这两条路的效果差得远:SKU只在你家系统里有意义,gtin才能让别人家的机器认出这是同一件东西。 预算有限的时候有个折中办法:给销量前20%的变体买独立的码,剩下的用SKU撑住结构。页面JSON-LD的具体写法和各平台字段差异 (https://zhangwenbao.com/product-gtin-seo.html)另有一篇写得比较细,这里不重复。 ## 页面上那几个标识符字段,各自管什么? 前面说的都是feed那一侧。页面的结构化数据里还有一组对应的字段,不少人以为要在它们之间二选一,其实它们是四个平行的属性,有哪个填哪个。 把schema.org官方词汇表拉下来查一遍就很清楚:gtin、mpn、sku三个的定义完全对称,都允许挂在Demand、Offer、Product上,值的类型都是文本;brand的取值类型是Brand或Organization,所以它必须写成一个对象,写成裸字符串是不合规的。 字段 | 它回答的问题 | 没有它会怎样 | gtin | 全世界怎么称呼这件商品 | 跨站合并失效,效果受限 | mpn | 厂商内部怎么称呼它 | 没有GTIN时连备用键都没有 | sku | 你自己怎么称呼它 | 着陆页可能对不上你的feed | brand | 它是谁家的 | MPN失去唯一性,等于白填 | sku那一行值得单独说。它看着最没技术含量,却有个很多人不知道的用途。Merchant Center对结构化数据属性与值的官方说明 (https://support.google.com/merchants/answer/6386198?hl=zh-Hans)里写着:“建议在每个注释中提供SKU(ID id属性)或GTIN(gtin属性)。如果您未提供此信息,您着陆页上的商品可能与您的结构化商品数据不匹配。”它是页面和feed之间的那把对齐钥匙——feed里那个id,就是页面上这个sku。 同一份文档里还有两条约束,比字段本身更容易被忽略。第一条是关于生成方式的:“结构化数据标记必须包含在从网络服务器返回的HTML中。页面加载后,将无法使用JavaScript生成结构化数据标记。”第二条是关于取值的:“结构化数据必须与客户所看到的值一致。在商品着陆页上提供不正确的数据属于违反Web开发者指南的行为。” 第一条直接判了一类常见做法的死刑:装一个应用,让它在页面加载完之后往DOM里塞一段JSON-LD。你在浏览器里看得见,Google那边不认。 ## 没有GTIN的时候,那一栏怎么处理? 直接不写。别写空字符串,别写N/A,更别把MPN复制一份塞进去。空值会触发校验错误,假值是编造标识符,两条都比缺字段严重。 还有一件事容易想当然:identifier_exists在schema.org里根本没有对应属性。把词汇表1676个属性翻一遍,没有这个名字——它是Merchant Center feed独有的字段。页面上没办法、也不需要声明“我没有条码”,缺就是缺。某个属性到底能不能挂在某个类型上 (https://zhangwenbao.com/third-party-review-schema-entity-linking.html),有个离线核对的办法,另一篇里写了。 最后是一致性:页面schema里的gtin、mpn、sku必须和feed里的值完全一致。多语言站点尤其容易翻车,一个语言版本改了另一个没跟上,两边就开始互相打架。 ## GTIN对GEO到底有什么用? 到这里,前面所有关于位数、校验位、开关的话题,才终于连到一起。 Merchant Center那份文档里有一句话,是整件事的地基:制造商会为每种商品指定唯一商品标识码,因此,如果您销售的商品与其他零售商的相同,那么商品的唯一商品标识码也会相同。 这句话读起来平平无奇,但它定义了GTIN在生成式引擎优化里的全部价值。GTIN不是一个用来给你的商品打分的信号,它是一把钥匙,用来判定“你这个商品”和“别处那个商品”是不是同一件东西。 这件事在AI推荐商品的场景里格外要紧。同一个SKU,可能同时躺在你的独立站、亚马逊、几个地区经销商、两三个比价站的目录里。机器要判断这件商品值不值得推荐,会去看它的评论数、评分、价格区间。有统一的GTIN,这些分散在各处的信号才能合并成一个实体的证据;没有,机器眼里就是五六件各自只有零星几条评论的可怜商品,哪一件都不够格被推荐。 更微妙的是,这把钥匙是双向的。同一个机制,往一个方向用,是把好评归拢起来;往另一个方向用,就是前面那条拒登规则——Google之所以能反驳你的“我没有GTIN”,靠的正是它对这个品类里其他商品的认知。能替你聚合信号的那套逻辑,同时也是能戳穿你的那套逻辑。 ## 这算实体消歧,还是别的什么? 圈子里习惯把这件事叫实体消歧,方向没错,但两个概念被合在一起用了,分开看更有指导性。 实体消歧解决的是“一个名字对应好几个候选,该选哪个”——小米是公司还是谷物,苹果是水果还是那家公司。那是文本侧的问题。GTIN干的是另一件事:你官网、亚马逊、经销商站、比价平台上那五条记录,本来就没有歧义,没人搞不清它们各自是什么,问题在于引擎不知道它们是同一件东西。把多条记录合并到同一个现实对象上,这在学术上叫实体归并,是数据侧的问题。 这个区分有实操价值,因为两者的可控性差得远。 GEO里大部分实体工作是概率性的:你写sameAs、建各种条目、让第三方一致地提你的品牌名,引擎把这堆弱信号加权,最后给一个置信度。你能施加影响,但保证不了结果。GTIN是确定性的——字符串精确匹配,要么对上要么对不上,没有打分也没有模糊地带。在这个到处是概率的领域里,能拿到一把硬主键属于稀罕事。 所以它的性价比高得有点不讲道理。同样的人力,补GTIN覆盖率是确定收益,做品牌实体建设是概率收益,先做哪个不用犹豫。 但也别指望它包打天下。品牌层的组织信息、社媒与百科条目之间的对应关系,GTIN一点都管不到;属性层的规格参数、型号名在各处内容里的表述是否一致,它同样管不到。它的主场只有中间那一层:商品与SKU。 顺便说个反面例子。OpenAI早期做ChatGPT购物时,商品信息有相当一部分是靠抓取零售商网站得来的,结果就是库存和运费经常不准,沃尔玛那边对这套体验的抱怨很直接。抓取之所以不准,本质上就是因为缺一把能把两边对上的钥匙——页面上写的和数据库里存的,机器没办法确认是同一件商品。 ## ChatGPT的feed规范里,gtin并不在必填清单上 这一节要泼一点冷水,因为中文圈里关于这件事的说法大多不准确。 常见的说法是:AI购物的feed有一套pass/fail前置检查,缺必填字段的商品会被静默丢弃,所以GTIN是生死线。前半句对,后半句错。 翻开OpenAI公布的商品feed规范 (https://developers.openai.com/commerce/specs/feed/),必填字段一共九个:item_id、title、description、url、brand、seller_name、image_url、availability、price。gtin不在里面,它是可选字段。规范里对它的要求是“exactly 8, 12, 13, or 14 digits, including a valid check digit”,保留前导零,不带空格和短划线,而且明确说明它标识的是具体商品而不是变体组。 两套规范放在一起对照,能看出不少东西: 要表达的事 | Google Merchant Center | OpenAI商品feed | 商品条码 | gtin(必填条件视品类而定) | gtin(可选) | 没有标识符 | identifier_exists | Google兼容格式里同样认identifier_exists=no | 评论条数 | 商品评论feed单独提交 | review_count | 平均评分 | 同上 | star_rating,0到5分,两位小数 | 变体关系 | item_group_id | group_id加listing_has_variations加variant_dict | 所以别把Merchant Center那套字段名照搬过去,两边不是一回事。评论字段尤其容易搞错,OpenAI那边叫review_count和star_rating,而且规范要求这两个必须配对出现。 那GTIN在这套体系里到底算什么?它不是准入线,是消歧线。没有它,你的商品照样能进feed;但进去之后,它是一个孤零零的条目,没法跟任何外部证据挂上钩。关于ChatGPT购物推荐从哪里取数、query fan-out怎么把一句话拆成多条意图,之前那篇拆得比较透 (https://zhangwenbao.com/chatgpt-shopping-carousel-google-shopping-optimization-guide.html),可以对着看。 ## 结账那半边停了,发现这半边反而更值钱 2026年3月,OpenAI宣布把站内结账迁到apps里去,重心转回ChatGPT内部的商品搜索与发现。这个转向的背景不太好看:用户在对话里问了大量商品问题,但很少在里面完成购买。沃尔玛测出来的数字是,ChatGPT站内结账的转化率比跳回自己网站差大约三倍。 这件事对做电商的人有个直接推论:别把资源压在agentic checkout上。成交那半边现在是停滞的,而发现那半边活得好好的,并且因为结账退场,它反而成了AI购物里唯一还在跑的环节。 发现环节的全部输入是什么?就是feed,加上页面上机器能读到的东西。这也是为什么保哥这两年给客户做电商SEO诊断时,越来越多的问题最后都指回商品数据本身,而不是页面标题写得好不好、外链够不够。 顺带提醒一句页面这一侧:产品页JSON-LD里的gtin,要和feed里提交的那个值完全一致。两边不一致比只有一边更糟——只有一边是信息不全,两边打架是信息可疑,机器对后者的处理方式通常是两个都不信。 ## 哪些AI问题里,GTIN一点忙都帮不上? 这一节是给自己泼的第二盆冷水,也是我觉得最该讲清楚、却几乎没人讲的一件事。 GTIN起作用的前提,是这次对话里存在一个确定的商品实体。用户说“帮我看看Anker那款737充电宝现在多少钱”,或者“这三款扫地机器人哪个吸力大”,机器要去目录里取具体条目,这时候能不能把你的商品和别处的同款对上,直接决定你出不出现。 可用户也会这样问:“露营用的手电筒怎么挑,需要注意什么”。这句话里没有任何一个可以落到商品条目上的东西。机器这时候要找的是解释、是对比逻辑、是使用经验,它去引用的是评测文章、论坛讨论、品牌自己的内容页。你的feed修得再干净,在这类问题里的权重是零。 怎么快速分辨这两类问题?看那句话里有没有能唯一指向一件商品的锚点:品牌加型号、一组具体参数、一个明确的价格带、某个具体的使用场景加具体的规格要求。有锚点的走目录,没锚点的走内容。 这个分界带来的实际后果是,商品数据和内容这两条腿得分开算账,也得分开投人。保哥见过的一种典型误判是:某个客户把GEO预算几乎全压在feed治理上,半年后确实在比价类问题里露脸多了,可品类教育类的问题一条都没进去——因为那半边根本没人写。 反过来的误判也有,而且更常见:内容团队写了一堆选购指南,商品数据那边条码乱七八糟,结果用户看完AI推荐的指南想买,机器却指不出他家的具体商品。 还有一种情况比信息型问题更隐蔽:商品是同一件,名字却裂开了。官网叫“XX Pro二代”,包装盒印的是“XX Pro II”,亚马逊listing写成“XX Pro 2升级版”,评测视频和论坛里大家一律简称“XX Pro”。GTIN能把feed层面那几条记录焊死在一起,可当用户在对话里问“XX Pro二代比一代强在哪”,机器去检索的是文本语料,那四个名字是不是同一个东西,GTIN根本没参与。 所以型号命名的规范化是跟GTIN并行的另一件事,谁也替代不了谁。见过最常见的失误是市场部改了产品叫法,旧内容和经销商物料没同步,一个型号在语料里裂成三个实体,彼此谁也不认识谁。 ## 一次把自己站上的商品编号盘清楚 说了这么多,落到能动手的事情上其实不多,一个下午够了。 第一步,把feed导出来,跑一遍位数和校验位。下面这段脚本不依赖任何第三方库,直接能跑: def check_digit(body): s = 0 for i, ch in enumerate(reversed(body)): s += int(ch) * (3 if i % 2 == 0 else 1) return str((10 - s % 10) % 10) def audit(code): c = code.strip().replace(' ', '').replace('-', '') if not c.isdigit(): return '不是纯数字,多半填了SKU' if len(c) not in (8, 12, 13, 14): return '位数不合法:%d位' % len(c) if check_digit(c[:-1]) != c[-1]: return '校验位对不上' c13 = c.rjust(13, '0') if c13.startswith(('02', '04', '2')): return '落在受限号段,不能提交' if c13.startswith(('05', '98', '99')): return '落在优惠券号段,不能提交' if len(c) == 8: return '注意:8位码请确认是GTIN-8而不是没展开的UPC-E' return 'OK' 最后那条提示是这次实验的直接产物。8位码是唯一一类机器帮不了你的情况,只能人去确认它到底是GS1分配的GTIN-8,还是从UPC-A压缩来的UPC-E。判断办法也简单:问供应商要商品包装上那个完整的12位码。 第二步,把UPC-E展开成UPC-A。规则按末位数字分档:末位0、1、2的,取前两位数据加末位再补4个零再接剩下三位;末位3的,取前三位加5个零加剩下两位;末位4的,取前四位加5个零加最后一位;末位5到9的,取前五位加4个零再把末位接回去。展开完重算校验位,别沿用原来那一位。 第三步,检查identifier_exists有没有被误设。重点看这三类商品: - 用了本地化插件、字段被自动翻译过的; - 从别的平台批量迁移过来、迁移工具默认给了false的; - 自有品牌,当初找不到GTIN顺手勾上的。 第四步,看变体层。母款有码、变体没码是最常见的形态,也是最容易被忽略的——因为Merchant Center不会为此报错,它只是安静地把你的几十个变体当成几十件互相独立、彼此陌生的商品。 ## 站在Shopify上的话,这个字段藏在哪? 不用建元字段,Shopify原生就有,只是不叫GTIN。位置在变体层的库存区块,那一栏写着“条形码Barcode (ISBN, UPC, GTIN, etc.)”。Google与YouTube销售渠道会把变体的条形码直接映射成feed里的gtin,没有别的来源——这一栏空着,feed里的gtin就是空的。 注意它在变体层不在商品层。不同尺码颜色各填各的,只在父级填一个不算数。 这个字段刚刚变过,就在2026年9月8日。Shopify的变更日志说,变体现在最多支持20个条形码,每个可以指定类型,UPC、EAN、ISBN、GTIN、ASIN都能选,也支持自定义类型放内部编号;选了类型之后,Shopify会按那个标准的格式校验数值,输入时就能抓到打字错误。商品CSV里对应的列名是Variant Barcodes,第一个条形码在只需要单个条形码的场景里继续使用,向后兼容。 这条变更之前,那一栏是完全不做校验的——填字母、填内部编号都不报错,于是不少店把它当成了第二个SKU用,直到feed同步过去才发现全是废号。如果你的店还没拿到这次更新,自己写条规则先过一遍:长度是8、12、13或14位,且全是数字。 另外两个字段的对应关系也顺带说清楚:brand映射的是vendor,很多店铺那一栏填的是供应商名字或者干脆留空,这是Shopify站在Merchant Center里被拒的常见原因之一;mpn则没有原生字段,要建一个商品元字段,再在feed应用里映射过去。 最后提醒一句:条形码填了,不等于产品页的结构化数据里就有gtin,那是两套数据。而且按前面引过的那条官方要求,标记必须包含在服务器返回的HTML里,靠应用在页面加载后用JavaScript塞进去的那一段,Google不认。 这四步做完,再去谈GEO的其他动作才有意义。商品身份都没对齐的时候,内容写得再好,机器也不知道你在说哪一件东西。 ## 常见问题解答 ## UPC和GTIN到底是什么关系? UPC是GTIN的一种格式,不是并列的两样东西。GTIN是统称,涵盖UPC、EAN、JAN、ISBN、ITF-14五种,分别对应北美、欧洲、日本、图书和整箱包装。所以Merchant Center里没有UPC字段,只有gtin,手上有UPC直接填进去就是正确做法。 ## 8位的条码能直接填进gtin吗? 要看它是什么。GS1分配的GTIN-8可以直接填,从UPC-A压缩来的UPC-E必须先展开成12位。麻烦的是两者位数一样,系统分不出来。实测200万个UPC-E码,58%直接提交能通过校验位验证,末位是5到9的更是100%全过,一点报错都不会有。所以拿到8位码时,最稳妥的办法是问供应商要包装上那个完整的12位码。 ## identifier_exists填no会不会被拒登? 分两种情况。单纯把它错填成no,官方的处理是发一条警告;但如果Google判定你这个品类的商品本来就该有GTIN,问题会升级成“商品标识码不正确”,后果是拒登,直到补上为止。另外要注意这个字段只收英文值,yes、true、no、false四个,中文的“否”不管用。 ## 手上只有MPN,能填进gtin那一栏吗? 不能。MPN多半带字母和横线,位数也不对,填进去通常直接报invalid value [gtin]。真正麻烦的是万一它恰好是纯数字、位数又正好,校验位有7%的概率侥幸通过,那你就提交了一串属于别人产品的GTIN,性质从信息不全变成了编造标识符。正确做法是填进mpn字段并补上brand,identifier_exists保持缺省的true。代价是缺GTIN会收到“因缺少值而导致效果受限”的提示,商品照常投放但覆盖面打折。 ## Shopify里的GTIN字段在哪,需要建元字段吗? 不用建,原生就有,只是不叫GTIN。它在变体层的库存区块,那一栏写着“条形码Barcode (ISBN, UPC, GTIN, etc.)”,Google与YouTube销售渠道会把它直接映射成feed里的gtin。2026年9月8日Shopify更新过这个字段:一个变体最多能放20个条形码,每个可以指定UPC、EAN、ISBN、GTIN、ASIN等类型,选了类型之后Shopify会按该标准校验格式,CSV里的列名是Variant Barcodes。真正需要建元字段的是mpn,Shopify没有原生字段。 ## 自有品牌没去GS1申请过码,该怎么填? gtin留空,brand和mpn填完整,identifier_exists不要动。填no是错的,因为这个开关的真实含义是条码、厂商零件号、品牌三样都没有,而你至少有品牌。长期看还是建议去GS1申请自己的厂商识别代码,品牌加零件号这套组合只在你自己家的系统里通用,跨渠道对不上。 ## 同一件商品在亚马逊和独立站要用同一个GTIN吗? 要,而且必须是同一个。GTIN由制造商分配,同一件商品在哪里卖都是同一个号,这正是不同零售商的目录能对上的原因。给同一件商品在不同渠道分配不同的码,等于亲手把本该合并的评论、评分、价格信号拆成互不相干的几堆。 ## 结构化数据里的gtin和feed里的对不上会怎样? 比只填一边更糟。只填一边是信息不完整,两边不一致是信息互相矛盾,机器通常的处理方式是两个都不采信,页面和feed的可信度一起下降。所以改任何一边的时候,另一边要同步改。 ## 权威参考资料 ## 站内搜索页搜不到也返回200,两道锁锁的是同一扇门 - URL:https://zhangwenbao.com/site-search-results-page-identity-audit.html - 分类:电商SEO - 发布:2026-08-31 | 更新:2026-08-31 - 摘要:站内搜索页搜不到东西也返回200,标题里还带着用户随手敲进去的任何字符。35个站里,robots.txt和noindex真正配对的只有2个。 - 关键词:电商SEO,抓取预算,站内搜索,索引控制 > **TLDR**:摘要:131个海外品牌站里,35个站的站内搜索结果页被完整探到。搜一个不存在的词,35个站全部返回200,没有一个返回404;页面上白纸黑字写着0 results found的18个站,状态码也是200。有结果页和空结果页的noindex处理34个站完全一致——也就是说,没有一个站区分过“搜到了”和“搜不到”。robots.txt和页面noindex这两道锁,同时用上的19个站其实是同一扇门锁了两遍,真正配对的只有2个。schema.org有个类型叫SearchResultsPage,用它的站是0个。 > 摘要:131个海外品牌站里,35个站的站内搜索结果页被完整探到。搜一个不存在的词,35个站全部返回200,没有一个返回404;页面上白纸黑字写着0 results found的18个站,状态码也是200。有结果页和空结果页的noindex处理34个站完全一致——也就是说,没有一个站区分过“搜到了”和“搜不到”。robots.txt和页面noindex这两道锁,同时用上的19个站其实是同一扇门锁了两遍,真正配对的只有2个。schema.org有个类型叫SearchResultsPage,用它的站是0个。 8月27日OpenAI给ChatGPT的桌面浏览器加了WebMCP支持。Search Engine Journal的报道 (https://www.searchenginejournal.com/chatgpt-adds-webmcp-support/587237/)里的说法是,网页可以把自己能干的事情结构化地暴露出来,让模型直接调用,而不是靠猜页面上哪个按钮能点。 这件事听起来很新,但它想解决的问题很老。 网站上最老的那个“动作”是什么?是搜索。从1990年代末开始,几乎每个站的右上角都挂着一个放大镜。用户敲一个词,站点吐回一页结果。这个动作比购物车早,比登录早,比现在这些花哨的交互都早。 问题是:这个跑了快三十年的动作,它产出的那一页,对机器说过自己是什么吗? 保哥这一轮就是去问这个问题的。答案挺干脆——没说过。 ## 站内搜索页这一类,是怎么被量出来的? 样本还是这一系列在跑的131个海外品牌与电商独立站。每个站的流程是四步: - 打开首页,从DOM里找搜索框,记下表单的提交地址和输入框的字段名; - 用一个大概率有结果的词(shirt)拼出搜索地址,抓一遍; - 用一串一定没结果的乱码(qzxkvw7391)拼出另一个地址,再抓一遍; - 顺手把根目录的robots.txt也拉下来。 两页都记录状态码、响应头里的X-Robots-Tag、页面里的meta robots、规范网址、标题、JSON-LD类型,以及渲染完之后页面上还剩多少商品卡片、有没有出现“没找到”这类文案。 131个站里,能在首页HTML里找到搜索入口的只有48个。这个数字本身值得停一下:三分之二的站,搜索框是JavaScript渲染出来的组件,对不执行脚本的抓取方来说,那个放大镜压根不存在。这跟JS渲染那一轮量到的损失面 (https://zhangwenbao.com/js-rendering-loss-three-myths-audit.html)是一致的:丢的往往不是正文,是入口。搜索框是独立站最被低估的高转化入口 (https://zhangwenbao.com/site-search-bar-ux-design-conversion.html),可它在机器眼里的能见度,和它在用户眼里的完全是两回事。 ## 为什么45个探到的样本,最后只留了35个? 这一步是这轮最该讲的一步。 脚本探到45个站有结果页返回。可逐条人工核对地址和标题的时候,发现其中10个根本没到搜索结果页: - article.com、burrow.com、italic.com、peakdesign.com、philips.com、shein.com、traeger.com——这7个站的表单提交地址是空的或者指向#,参数被原封不动挂到了首页上,抓回来的是一份首页; - brompton.com的参数在跳转中被整个丢掉; - everlane.com返回的是反爬挑战页,warbyparker.com直接403。 剔掉这10个,严口径样本是35个站。所有百分比都按这个分母算。这一步是这一系列反复吃过亏之后的规矩 (https://zhangwenbao.com/obsolete-html-tags-platform-fossil-audit.html):新造的判据跑完先人工过一遍,别信脚本第一遍给的分母。 这8个被剔的站(7个参数落在首页,1个参数在跳转里丢了)顺手给了一条额外的发现:给首页挂一个它完全不认识的参数,8个站全部返回200和一份完整页面。example.com/?q=shirt、example.com/?searchTerm=shirt、example.com/?header-search=shirt——参数随便编,页面照发。唯一在拦这件事的是规范网址:这8个站的canonical全都指向不带参数的首页。这一层要是也没写,一个首页就能被参数繁殖出无数份。 ## 搜到东西的那一页,对机器说了什么? 35个站,有结果的搜索页: 声明 | 站数 | 占比 | 状态码200 | 35 | 100.0% | meta robots里写了noindex | 9 | 25.7% | 响应头X-Robots-Tag里写了noindex | 15 | 42.9% | 两处任一有noindex | 21 | 60.0% | 写了规范网址 | 31 | 88.6% | 有任意JSON-LD | 20 | 57.1% | 声明自己是SearchResultsPage | 0 | 0.0% | 最后一行是这轮最干脆的一个数字。schema.org里有SearchResultsPage这个类型 (https://schema.org/SearchResultsPage),2015年就有了。57.1%的搜索结果页发了结构化数据,发的是Organization、WebSite、SearchAction这些“我们是谁”的东西。没有一页说过“这一页是一批搜索结果”。 这跟上一轮量到的类目页只有三分之一说清自己是什么 (https://zhangwenbao.com/ecommerce-page-type-declaration-audit.html)是同一条线上的事,而且更极端一档:类目页至少还有33.3%说了,搜索结果页是0。 原因不难理解。产品页写Product有富媒体回报,类目页写ItemList偶尔有,搜索结果页写SearchResultsPage一分钱回报都没有——它本来就不该进搜索结果。没有回报的声明,没人写。 但这里有个逻辑上的拧巴:正因为这类页面不该被索引,它才更需要说清自己是什么。一页没有身份声明、又返回200的内容,机器只能按普通网页对待。 ## 搜不到东西,页面为什么还说自己是200? 把那串乱码喂进去,34个站的空结果页抓到了。 结果是一条直线: - 返回200的:34个,100.0% - 返回404的:0个 - 页面上明确写着“没找到”的:18个,52.9% - 这18个里,状态码仍是200的:18个,100.0% 页面正文说“0 results found”,HTTP层说“200 OK,内容在这儿”。这两句话在同一次响应里,方向相反。 打个比方,这就像客服接起电话跟顾客说“您要的这款我们没有”,挂了之后在工单系统里把这通电话标成了处理成功。顾客那边信息是准的,系统这边记录是错的,而看报表的人只看得到系统。 这就是软404的标准形态 (https://zhangwenbao.com/google-404-crawl-seo-positive-signal.html)——内容层承认没有,协议层坚持有。搜索引擎对这类页面有一套自己的识别逻辑,识别出来之后会当404处理,但那是在抓完、渲染完、判断完之后。这中间的抓取成本已经花掉了。要判断自己站上有多少这种页面,得从收录异常那一头倒着查 (https://zhangwenbao.com/google-not-indexed-fix-playbook.html)。 还有一半更微妙。34个空结果页里,18个(52.9%)在“搜不到”的同时,页面上还铺着三个以上的商品卡片——热门推荐、你可能喜欢、大家都在买。从留客的角度这是对的 (https://zhangwenbao.com/site-search-bar-ux-design-conversion.html),甩个空白页给用户等于把人赶走。可从机器的角度,这一页有商品、有价格、有链接、返回200,它看起来跟一个正常的类目页没有区别。 换句话说:为了留住人做的那件事,恰好抹掉了机器判断这一页是空的唯一线索。 ## 有结果和没结果,站点区分过吗? 34个站两页都探到,逐项对比: 对比项 | 一致的站数 | 占比 | noindex处理完全相同 | 34 | 100.0% | 状态码相同 | 34 | 100.0% | 标题一字不差 | 19 | 55.9% | 规范网址指向同一个地址 | 15 | 44.1% | 头两行是100%。34个站,没有一个在技术声明上区分过“搜到了”和“搜不到”。 这不是疏忽,是结构决定的。这些声明写在模板层:一份搜索结果页模板,输出的时候不管命中几条,那几行meta都长一个样。要区分,得让模板知道结果数,再据此改状态码或者改robots指令——这是应用层的事,不是模板层的事,绝大多数平台默认不给这个口子。 标题那一行倒是分开了,55.9%的站两页标题不同。分开的方式很有意思,下面单说。 ## 那14个把乱码原样写进标题的站,是怎么回事? 32个空结果页有标题,其中14个(43.8%)把qzxkvw7391这串乱码原样写进了title: Search: 0 results found for "qzxkvw7391" Search: 0 results found for "qzxkvw7391" – Decathlon Search results: 0 results for "qzxkvw7391" – OLIPOP Suchergebnisse für "qzxkvw7391" 13个是同一句英文模板,标点和短横线的样式都一致,一眼能看出是同一个平台的默认写法。第14个是德语站,句式换了,逻辑一模一样。 这句话本身写得没毛病,用户看着很清楚。问题在于它意味着什么:标题是用户输入的函数。任何人往地址栏里塞任何字符串,都能得到一个标题独一无二的页面,返回200,带完整导航和页脚,还带一批推荐商品。 这就是那个老问题的现代版本。搜索引擎很早就描述过“无限空间”这件事:一个能按参数无限生成页面的入口,会把抓取资源耗在没有价值的组合上。抓取预算的优化清单 (https://zhangwenbao.com/google-crawl-frequency-optimization-guide-2026.html)里排在前面的几条,讲的都是怎么关掉这类入口。 而这类页面被外部链接指到的情况并不罕见:论坛里有人贴了一条搜索链接,比价站抓走了一批带参数的地址,广告落地页带着追踪参数被人复制转发。这些链接一旦被爬到,就是一个个带独立标题的200页面。 ## robots.txt和noindex这两道锁,为什么锁的是同一扇门? 这是本轮数据里最值得说的一组。 把robots.txt里有没有挡住搜索路径,和页面上有没有noindex,交叉起来看,35个站落在四个格子里: 组合 | 站数 | 占比 | 实际效果 | robots挡了 + 页面也写了noindex | 19 | 54.3% | 第二道锁读不到 | robots挡了 + 页面没写noindex | 7 | 20.0% | 不抓,但可能凭外链收录 | robots没挡 + 页面写了noindex | 2 | 5.7% | 唯一真正生效的组合 | 两样都没有 | 7 | 20.0% | 完全敞开 | 第一行占了一半以上,而且这一半恰恰是做得最认真的那批人——两道防线都上了。 可这两道防线不能叠加。Google关于阻止索引的文档 (https://developers.google.com/search/docs/crawling-indexing/block-indexing)里写得很清楚:noindex要生效,前提是这一页能被抓到。robots.txt把这一页挡在门外,爬虫就永远读不到页面里那行noindex。 结果是:你以为上了两把锁,实际上第二把锁被第一把锁在了门里。 更麻烦的是,这两种做法防的不是同一件事。robots.txt管的是爬虫能不能来读这一页 (https://developers.google.com/search/docs/crawling-indexing/robots/intro),noindex管的是这一页能不能进结果。一个已被收录的页面加noindex之后要多久才从结果里消失 (https://zhangwenbao.com/when-does-noindex-page-remove-from-google-search-results.html),本身就是个需要抓取才能推进的过程;robots.txt挡住之后,这个过程直接停摆——旧的索引条目留在那儿,新的noindex指令永远送不到。 只有2个站落在了正确的那个格子里:不挡抓取,让爬虫进来读到noindex,然后把这一页从索引里剔掉。站内搜索URL到底该不该写Disallow (https://zhangwenbao.com/should-search-page-urls-be-disallowed-in-robots-txt.html)这个问题,多数人凭直觉选了Disallow,而直觉在这件事上刚好选反。 顺便说一句样本外的数字:130个能拿到robots.txt的站里,40.8%挡了搜索类路径,55.4%写了Disallow: /*?这种一刀切的参数规则。后者的杀伤面比多数人以为的大得多——它会把所有带问号的地址一起挡掉,包括分页 (https://zhangwenbao.com/category-pagination-seo.html)、包括筛选 (https://zhangwenbao.com/filter-generated-pages-robots-txt-disallow.html)、包括带追踪参数的正常落地页 (https://zhangwenbao.com/robots-txt-disallow-utm.html)。 ## 规范网址是唯一在认真干活的那一层吗? 四层声明里,规范网址的覆盖率最高:88.6%的搜索结果页写了。但它写的内容有点出人意料。 规范网址指向 | 站数 | 指向自己(带搜索词) | 5 | 指向首页 | 1 | 指向别处 | 25 | 其中把查询参数整个去掉的 | 12 | 没写 | 4 | 12个站的规范网址指向不带任何搜索词的/search。这意味着搜shirt、搜shoes、搜那串乱码,三页的规范网址是同一个地址。按规范网址的合并逻辑 (https://zhangwenbao.com/google-canonical-url-selection-logic.html),这三页会被当成同一页的不同版本,最终只有一份进索引。 从治理角度这是聪明的:一行配置就把无限空间收成了一个点。从数据角度它有代价——Search Console里所有搜索词的表现会被合并到一个地址上,你再也看不出用户搜了什么。 还有一个值得记下来的:joolz.com的规范网址是…/search?cgid=undefined。undefined这个词被拼进了规范网址里。某个变量没取到值,模板照拼不误,于是全站所有搜索结果页的规范网址都指向同一个语法上合法、语义上没有意义的地址。这种错误不报警、不掉排名、也不会有任何工具提醒你——它跟同一页写两条meta各说各话 (https://zhangwenbao.com/duplicate-meta-tag-first-declaration-wins-audit.html)属于同一族:语法过关,语义失效。 ## 代理时代要来了,这一类页面为什么突然重要了? 回到开头那件事。 过去搜索结果页在SEO里的位置很清楚:一类不该被索引的垃圾页,关掉就行。这个判断在“机器只是来抓内容”的年代是对的。 但WebMCP这类东西改变的是机器和网站的关系。模型不再只是读你的页面,它要在你的站里执行动作——搜一个词,看一批结果,选一个,进详情,加购。上一轮量过AI代理能不能在电商站里完成四个基本动作 (https://zhangwenbao.com/agent-actionability-html-audit.html),83个站里只有1个全通。搜索是那四个动作里最基础的一个。 这时候搜索结果页的身份就有了新意义。它不需要进索引,但它需要能被理解:这一页是不是一批结果,有几条,每条对应什么商品,搜不到的时候机器怎么知道自己搜空了。 目前的答案是:机器无从知道。返回200,页面上有商品卡片,标题里有搜索词,一切看起来都像搜到了。唯一能说明搜空了的信号,是页面上那行给人看的英文句子。 这里面有个很实际的分野。索引和理解,从此是两件事:你可以既不想让这一页进搜索结果,又希望机器能读懂它。过去这两件事捆在一起,用一个noindex就解决了;现在得分开处理。 ## 这一类页面到底该怎么配? 先说一个例外,不然下面的结论会用错地方。有一小类站,站内搜索页本身就是有价值的着陆页——商品品类极多、用户搜的词本身就是成型的长尾需求,把高频搜索词的结果页转成正经类目页,是很成熟的做法。属于这一类的站,下面几条要反着读:那些词的结果页不该加noindex,该当类目页认真做内容和标题。 但这条例外的适用面比多数人以为的窄。它成立的前提是你拿得出一份名单,说清楚哪几十个词值得留、剩下的一律不留。拿不出名单就一律留着,那不叫策略,那叫没管。 下面按这轮量到的问题,从最该动的排起。 ## 先把两道锁拆开,只留一道 如果你现在既在robots.txt里挡了搜索路径,又在页面上写了noindex,选一个。推荐的是后者:从robots.txt里去掉搜索路径的Disallow,保留页面上的noindex。 代价是爬虫会来抓这些页面,消耗一点抓取额度。收益是noindex真正生效,已经进了索引的旧条目会被清掉。等索引清干净了,再考虑要不要加回Disallow——但那时候多半也没必要了。 如果你的站抓取额度确实紧张,且搜索页从来没被收录过,那保留Disallow、去掉noindex也行。别两个一起上,那是自欺欺人。 ## 让空结果页说实话 搜不到东西的时候,最规矩的做法是返回404。但这会伤用户体验,多数团队不会接受。 折中方案有两个。一是保持200,但在页面上给机器一个明确信号——把结果数写进结构化数据,条数为0的时候机器就知道了。二是把空结果页和有结果页拆成两套模板,空的那套加noindex,有结果的那套按索引策略处理。第二种改动更小,效果也更直接。 不管选哪种,别在空结果页上铺满推荐商品还返回200。要推荐可以推荐,但得让机器知道这些卡片跟这次搜索无关。 ## 把搜索词从标题里拿掉,或者收窄 标题里带用户输入,等于把标题的控制权交给了任何一个能编辑地址栏的人。稳妥的做法是给搜索词加长度和字符集限制:超过一定长度、含有非预期字符、或者结果数为0的时候,标题回落成一个固定值。 这一条改起来最快,五分钟的模板改动,直接掐掉整条无限生成的链路。 ## 规范网址想清楚再指 指向不带词的/search是最省事的做法,35个站里12个这么干。但这等于放弃了搜索词的数据。 如果你的站内搜索词是重要的需求来源,更好的做法是让规范网址指向自己,同时靠noindex控制索引。这样Search Console里能看到每个词的抓取情况,索引这一层由noindex管。规范网址和noindex是两件事 (https://zhangwenbao.com/canonical-url-seo-guide.html),不要用一个去代替另一个:前者按合并重复网址的规则 (https://developers.google.com/search/docs/crawling-indexing/consolidate-duplicate-urls)决定收哪一版,后者决定收不收。 ## 顺手补一句身份声明 在搜索结果页的JSON-LD里加一段SearchResultsPage,成本是几行代码。它现在没有任何富媒体回报,短期内也不会有。但它把“这一页是什么”这件事说清楚了,而这件事在代理时代的价值会比在索引时代高。 顺带把结果数也写进去。这一条比什么都直接:"numberOfItems": 0比页面上那句英文可靠得多。 ## 先查一遍自己站 最小成本的自查是三步:搜一个真词,搜一串乱码,然后各看一遍状态码、meta robots、X-Robots-Tag、规范网址。再打开robots.txt看有没有挡住这条路径。四样凑齐,问题在哪一眼就出来了。 要看历史情况,得从服务器日志里查爬虫到底抓了多少搜索地址 (https://zhangwenbao.com/log-analyzer-crawl-budget-googlebot-guide.html)。这个数字往往比想象的大——尤其是robots.txt里写了Disallow、以为已经挡住了的那些站。 ## 这套查法还能用在哪儿? 站内搜索只是这类页面里最典型的一个。同样的四层对账,能套到几个地方。 筛选后的类目页是最像的一个。用户点了颜色和尺码,网址多了两个参数,页面结构没变。它跟搜索结果页共享同一套问题:能被无限组合、内容重复、状态码永远200。区别是筛选页往往有真实的搜索需求,分面导航的治理要在放和挡之间做取舍 (https://zhangwenbao.com/faceted-navigation-seo-crawl-budget-index-control.html),不能一刀切。 购物车、结账页、账户页是另一类。它们同样不该进索引,但处境跟搜索页不太一样——这几类页面牵涉隐私和交易,通常有专人盯着。电商站该屏蔽哪几类页面 (https://zhangwenbao.com/page-types-to-block-in-robots-txt-for-ecommerce.html)那份清单里它们排在最前,搜索页往往排在最后。这一轮没有专门测这几类页面,所以只说到这儿。 比价和排序参数是第三类。?sort=price_asc这种地址产生的页面,内容跟原页面一模一样,只是顺序不同。这类最适合用规范网址收,不适合用noindex。 还有一类容易被忘掉:站点自己的404页面。它有没有真的返回404?这件事跟空结果页是同一个毛病的两种表现,自定义错误页配错状态码 (https://zhangwenbao.com/apache-errordocument-custom-error-pages-http-status-codes-soft-404.html)是相当常见的一个坑。 站内搜索页的尴尬在于,它是站里唯一一类由用户写内容、由模板发身份、然后没有人审的页面。三十年来它一直这么跑着,因为它从来不出错——返回200,页面完整,用户满意,报表上什么异常都没有。只有换成机器的视角看一遍,才发现它对机器一句实话都没说过。 ## 常见问题解答 ## 站内搜索页到底该不该让搜索引擎抓 让抓,别让索引。这是这轮数据支持的结论,也是Google文档的逻辑推出来的结论:noindex要生效必须先被抓到。如果你的抓取额度极度紧张,且这些页面从来没进过索引,用robots.txt挡也可以,但那时候就别再写noindex了,写了也没用。 ## 空结果页返回404,会不会伤用户体验 会,所以多数站不这么做,这轮35个站里一个都没有。更实际的方案是保持200但拆模板:空结果那套模板加noindex,同时把结果数写进结构化数据。用户看到的还是一个友好的页面,机器拿到的是明确的信号。 ## 规范网址指向不带词的搜索页,算不算错 不算错,是一种取舍。好处是把无限空间收成一个点,坏处是丢掉了搜索词维度的数据。如果站内搜索词对你的选品和内容规划有价值,就别这么做;如果只是想尽快止血,这是最快的一招。 ## 为什么要写SearchResultsPage,它又没有富媒体展示 短期确实没有回报。写它的理由是把页面身份说清楚,让机器不必靠猜。这轮35个站一个都没写,说明这件事目前完全是自选动作。判断标准很简单:如果你在意AI代理和生成式搜索怎么理解你的站,就值得写;如果只在意传统搜索排名,可以先放着。 ## 标题里带搜索词,会被当成关键词堆砌吗 不会。它的问题不是堆砌,是可以被外部无限操纵。真实风险有两个:一是任何人都能造出一个带自定义标题的页面挂在你的域名下,二是这些页面被外链指到之后会消耗抓取资源。给搜索词加长度和字符限制就能解决。 ## 我的搜索框是JS渲染的,会影响SEO吗 搜索框本身不影响,它不是内容。真正的影响是抓取方发现不了这个入口,从而发现不了搜索结果页——从减少无效抓取的角度看,这反而是件好事。但如果你希望AI代理能用你的站内搜索,那就得让这个入口在HTML里可见,或者用WebMCP这类机制显式声明出来。 ## 这轮为什么只有35个站的数据 131个站里,能在服务端HTML找到搜索入口的48个,实际探到结果页的45个,人工核对后剔掉10个没真正到达搜索页的,剩35个。剔除的主要原因是表单提交地址为空,参数被挂到了首页上。这一步不做,数据里会混进一批首页,所有比例都会跑偏。 ## 权威参考资料 ## 结构化数据实测66个站:产品页都写了,类目页只有三分之一 - URL:https://zhangwenbao.com/ecommerce-page-type-declaration-audit.html - 分类:电商SEO - 发布:2026-08-30 | 更新:2026-08-30 - 摘要:AI代理打开你的类目页,怎么判断这是一个能往下钻的列表,还是一个能直接下单的详情页?多数电商站没有给出这个答案。 - 关键词:结构化数据,电商SEO,AI代理,页面类型 > **TLDR**:摘要:131个海外品牌站,用真实浏览器把首页、类目页、产品页各抓一遍,66个站三种页面齐全。给人看的那几行分辨率很高——三种页面的标题无一重复,规范网址无一重复。可轮到机器要判断“这一页是什么”,产品页有Product类型的占93.9%,类目页有列表类型的只有33.3%。剩下那44个类目页里,16个页面上唯一的列表是面包屑,12个连一段结构化数据都没有。三种页面全都说清了自己是谁的站,58个严口径样本里只有15个。 > 摘要:131个海外品牌站,用真实浏览器把首页、类目页、产品页各抓一遍,66个站三种页面齐全。给人看的那几行分辨率很高——三种页面的标题无一重复,规范网址无一重复。可轮到机器要判断“这一页是什么”,产品页有Product类型的占93.9%,类目页有列表类型的只有33.3%。剩下那44个类目页里,16个页面上唯一的列表是面包屑,12个连一段结构化数据都没有。三种页面全都说清了自己是谁的站,58个严口径样本里只有15个。 先做个小测试。下面三个网址,你不打开页面,只看地址,能判断出各是什么页吗? bellroy.com/products/category/outlet babybjorn.com/products/baby-carriers/ untuckit.com/collections/new-arrivals/products/morningside 第一个路径里写着products,其实是个折扣专区的列表页。第二个也写着products,是背带的品类页。第三个路径里写着collections,反倒是一个实实在在的商品详情页。 这三条不是我挑出来为难人的,是这一轮实测里脚本自己撞上的。用网址模式挑页面,70组里挑错了4组——而这恰恰是本文要讲的那件事:网址不是身份声明。它长什么样,取决于当年谁定的路由规则。 人不看网址,看页面。屏幕上摆着一排商品卡片,一眼就知道这是列表页;摆着一个大图加一个加购按钮,那就是详情页。这个判断快到你意识不到自己在判断。 但机器没有这个眼力。它得从字节里找线索。这一轮就是想量清楚:三种页面并排放着,究竟有多少东西能让机器把它们区分开。 ## 三种页面各抓一遍,样本是怎么来的? 样本沿用这一系列一直在跑的131个海外品牌与电商独立站,覆盖服饰、家居、户外、3C、美妆、食品饮料几大类,绝大多数是有独立品牌的中大型站。这个分母要先说清楚:Web Almanac 2024统计过全网只有0.77%的页面带Product结构化数据 (https://almanac.httparchive.org/en/2024/structured-data),那是把所有网页放一起算的;本文的样本全是电商站的商品页,两个数字不矛盾,分母压根不是一回事。 抓取方式是真实浏览器(Chromium),带常见的桌面浏览器身份,每个站按同一套流程走三步: - 打开首页,等页面渲染完; - 从首页链接里挑一个类目页,打开; - 再挑一个商品详情页,打开。 每一页都存两份:服务器直接吐出来的那份HTML,和浏览器执行完脚本之后的那份DOM。两份都解析,取并集——也就是说,只要结构化数据是在渲染后才出现的,也算它有。这一点很重要,不然会把一批用前端框架的站冤枉掉。 131个站里,128个拿到了首页;三种页面全部拿到的有70个。拿不齐的原因基本都是首页链接结构特殊,脚本按路径规则没挑出合适的候选,跟站本身好坏无关。 两份分开存这一步没白做。后面要用到的那几个身份声明,服务端就有和渲染后才有,差着几个百分点:产品页的Product声明服务端有60个站,渲染后61个;类目页的列表声明服务端19个,渲染后22个。差值不大,但方向一致——正文整段要等脚本跑完才出现的空壳页 (https://zhangwenbao.com/html-shell-page-readable-text-audit.html)确实存在,只是在结构化数据这一层没那么普遍。有个站还反过来:服务端那份里有Product,渲染完反而没了,多半是前端把整段节点重写掉了。 然后是人工那一步。70组网址我逐条看过一遍,剔掉了4个挑错页面的站,主口径落在66个站。另外单独标出了8个站的“产品页”其实是礼品卡——它是商品,但没有尺寸重量这些属性,很多站不给它发结构化数据,放在一起会稀释结论。严口径的58个站会在后面单独出现一次。 ## 给人看的那几行,三种页面写得一样吗? 先看好消息,而且是相当出乎意料的好消息。 做技术审计的人,脑子里大多有个刻板印象:内页没人管,标题是模板拼的,描述干脆空着。这一轮的数据不支持这个印象。 字段 | 三种页面都填了的站 | 三条一字不差 | 三条互不相同 | 标题标签 | 67 | 0 | 67 | 规范网址 | 66 | 0 | 66 | 社交分享标题 | 61 | 0 | 61 | 页面描述 | 56 | 2 | 51 | 社交分享描述 | 47 | 0 | 40 | 社交分享图 | 33 | 0 | 18 | 标题、规范网址、分享标题这三样,三种页面之间没有一个站出现重复。规范网址这一栏还能再挑一次刺——三条互不相同只说明它们指向不同的页,指得对不对是另一回事,首页那一轮量下来有23%的站自己跟自己对不上 (https://zhangwenbao.com/canonical-self-declaration-conflict-google-selected.html)。页面描述56个可比站里只有2个三条完全一样(flyingtiger和italic)。文字层的分辨率几乎是满的。 顺带说一句,模板做齐了不等于内容做对了。allbirds的类目页有一行完整的描述标签,只是content写成了空字符串——框架发下去了,填值那步没跟上。这类“标签在、值空着”的情况,跟标签压根不在,是两种病。 再往下走一层,情况就变了。 ## 那机器怎么知道这一页是列表还是详情? 屏幕上那排商品卡片,在字节里是几十个div。机器要判断“这是个列表页”,最直接的依据是页面自己声明:我是一个CollectionPage,里面有一个ItemList,成员是这些商品。schema.org给ItemList的定义 (https://schema.org/ItemList)很朴素——一组有序的条目,配上itemListElement和numberOfItems两个字段,就够机器把这一页认出来了。 66个站的三种页面,各查一项最该有的身份声明: 页面 | 该有的声明 | 有的站 | 占比 | 首页 | WebSite或Organization | 55 | 83.3% | 类目页 | ItemList或CollectionPage | 22 | 33.3% | 产品页 | Product | 62 | 93.9% | 产品页93.9%,类目页33.3%。这不是一点差距,是接近三倍。 把礼品卡那8个站也剔掉,只留下有真实商品属性的58个站,差距只会更大:产品页94.8%,类目页29.3%。 再换个角度数。这58个站里,三种页面全都说清了自己是什么的,只有15个(25.9%);说清两种的34个;只说清一种的8个;一种都没说清的1个。四分之三的站,页面身份这件事上是缺一块的,而缺的那块几乎总是同一块。 ## 为什么产品页做到了94%,类目页只有33%? 这个问题的答案,比“大家偷懒”要有意思得多。 顺便说一句,这两类页面的结构化数据经常不是同一个人在维护。主题输出一套、SEO插件再输出一套,最后在head里撞成一团 (https://zhangwenbao.com/cms-seo-plugin-theme-tag-conflict-duplicate-canonical-title-og-schema-cleanup.html)是很常见的局面,而撞车最多的恰恰是产品页——因为那一层大家都在抢着写。 产品页的结构化数据是有直接回报的。写了Product和offers,搜索结果里就可能带上价格、库存、评分那几行。这个回报十几年来一直存在,一直被工具检测,一直被建站平台写进默认模板。同一批样本里,产品页带offers的比例是92.9%,带评分的57.1%——这些字段的分布,跟Google富媒体结果需要什么,几乎是同一张形状。 类目页没有这个回报。很长一段时间里,把类目页标成CollectionPage,搜索结果不会因此多出任何东西。没有可见回报的事,默认模板就不做;模板不做,绝大多数商家也不会自己补。 这里有个更早的证据可以对照。上一轮量产品页规格的时候发现过一件事:64个有Product结构化数据的产品页,写了价格的64个一个不落,写了规格属性的只有7个 (https://zhangwenbao.com/product-spec-field-value-pairing-audit.html)。同一批人、同一套模板、同一个页面,差别只在于哪个字段能换来搜索结果里的一行显示。 行业是被富媒体结果牵着走的。牵到哪,就写到哪。这句话在字段层成立,在页面类型层同样成立。 ## 那44个没说清自己是列表的类目页,页面上都写了什么? “没有ItemList”不等于“没有结构化数据”。把66个站的类目页按有什么分成四类: 类目页的形态 | 站数 | 占比 | 有ItemList或CollectionPage | 22 | 33.3% | 没有列表类型,但有面包屑 | 16 | 24.2% | 有别的结构化数据,列表和面包屑都没有 | 16 | 24.2% | 完全没有结构化数据 | 12 | 18.2% | 中间那两类加起来48.5%,占了将近一半。这些页面不是空白——它们有Organization,有WebSite,有搜索动作声明,有联系方式,甚至有客服电话和邮寄地址。关于“我们是谁”,写得很齐;关于“你现在看的这一页是什么”,一个字没有。 把70个类目页的结构化数据类型统计一遍,排在最前面的是ListItem,出现38次。乍一看挺好,列表项都有了。但再看第三名是BreadcrumbList,32次——ListItem大部分是面包屑的成员项。 也就是说,类目页上出现最多的那种“列表”,描述的是你在网站的哪一层,不是这一页有哪些商品。 再往下,ItemList只有20次,CollectionPage 17次。Organization倒是有34次。 这个排序本身就能说明问题。面包屑在搜索结果里能显示成路径,所以做的人多;ItemList在过去很多年里不显示,所以做的人少。跟上一节是同一个机制。 ## aloyoga:三种页面发的是同一份声明 有个站值得单独拎出来。aloyoga的首页、类目页、产品页,结构化数据的类型集合完全一样,一个字不差:Organization、WebSite、SearchAction、SoftwareApplication、AggregateRating、Offer。 包括产品页——它的产品页里没有Product。一个卖瑜伽服的站,全站每一页都在庄严声明自己是个软件应用,而且评分不低。 顺着看下去还挺有意思:那个SoftwareApplication加AggregateRating,跟一个服装品牌的商品毫无关系,多半是某个评分类应用注入的模板。第三方脚本往页面里塞东西这件事,只看HTML基本看不出来 (https://zhangwenbao.com/third-party-domain-dependency-invisible-in-html-audit.html),等它塞完,你的结构化数据里就多了一段不属于你的类型。整套东西就这么挂在全站每一页上,不管你打开的是首页还是一双鞋。 这是“身份声明”最极端的形态:它给每一页都发了一份“我们是谁”,却没有一页说清“这一页是什么”。全站一致,一致得毫无信息量。 ## 用网址判断页面类型,我自己就判错了4次 说回开头那三条网址。 脚本挑页面用的是路径规则:路径里有 /products/、/p/、/item/ 的当详情页,有 /collections/、/category/、/shop/ 的当列表页。这是所有爬虫、所有审计工具、所有做站内分析的人都在用的办法。 70组里错了4组: - bellroy的 /products/category/outlet,路径里有products,实际是折扣列表页; - babybjorn的 /products/baby-carriers/,同样是列表页; - lookfantastic的 /c/info/delivery/,路径里有 /c/,实际是配送说明页; - madewell的 /c/inspo/,是内容专题页。 错误率5.7%。听着不高,但请注意,这是一个人拿着70条网址逐条看过之后才发现的。如果没有这一步,产品页那一栏的数字会被两个类目页拉低,我会得出一个偏低的结论,而且完全不知道自己错在哪。 顺带一提,那8个礼品卡也是这么发现的——脚本挑中的“产品页”是礼品卡,8个里只有7个有Product声明,比正常商品页低。这个数太小不足以下结论,但足以说明分层的必要。 这件事本身就是本文的论据。连人带脚本,靠网址判断页面类型都会错;AI爬虫扫过来的时候,它凭什么判对? 做审计时按页面模板抽样是对的,几万行网址落到代码上其实只有几十个模板 (https://zhangwenbao.com/ecommerce-seo-audit-template-level-sampling.html)。但模板的边界在哪,得由页面自己说,不能靠网址猜。 ## 除了结构化数据,还有别的线索能用吗? 结构化数据不是唯一一条线索。页面上还有两样东西经常被当成页面类型的依据:社交分享标签里的类型字段,和H1。这两样都便宜,都好写,问题是它们靠不靠得住。 ## 社交分享那一层,能不能顺便把身份补上? og:type这个字段,本来就是干这个的:网页类型。它比结构化数据简单得多,一行搞定,Open Graph协议原文 (https://ogp.me/)里给的标准取值也就那么几个。 66个站的实际填法: - 首页:website 49个,没写20个; - 类目页:website 38个,product.group 13个,没写18个; - 产品页:product 46个,website 8个,没写16个。 有意思的是最后那一列:三种页面的og:type完全一样的站有22个,占31.4%——首页写website,类目页写website,产品页还是website。这个字段等于没填。 类目页那13个product.group值得注意,它不是Open Graph的标准取值,是电商站自己扩的。这至少说明有人认真想过“这一页是什么”这件事。 不过话说回来,og:type的读者主要是社交平台的抓取器,搜索引擎和AI爬虫基本不拿它当页面类型的依据。它可以顺手写对,但指望它承担身份声明,不现实。真正管用的还是结构化数据。这两层怎么分工,首页那六个自我介绍字段各归各的读者 (https://zhangwenbao.com/self-description-copies-title-og-h1-schema-audit.html)那篇已经拆过一遍。 ## 三种页面的H1,是不是也各是各的? H1是另一条常被当成页面身份的线索。理论上它该回答“这一页讲什么”,跟页面类型天然相关。 66个站的渲染后DOM,按三种页面数H1个数: - 三种页面都恰好一个H1的,20个站,30.3%; - 首页一个H1都没有的,15个站; - 至少有一页H1超过一个的,30个站; - 最夸张的是beistravel的类目页,25个H1——每张商品卡片的标题都用了H1。 三种页面H1个数完全一样的只有21个站。也就是说,同一个站的三种页面,H1的用法本来就不统一,拿它当页面类型的判据是靠不住的。 这跟之前量过的另一件事是配套的:屏幕上最大那行字,四成多的电商首页里根本不是H1 (https://zhangwenbao.com/visual-hierarchy-vs-heading-tags-audit.html)。标题标签在实际站点上早就不承担“这一页是什么”的职责了,它更多是个排版遗留。指望机器从H1推断页面类型,跟指望它从网址推断,性质是一样的。 ## 换个建站平台,这件事会自动解决吗? 把66个站按建站平台分组,能看出默认值起了多大作用。平台判定是单独跑的一轮:抓首页源码,找cdn.shopify.com、myshopify.com、Shopify.theme、shopify-section、window.Shopify这几个确凿特征,命中才算。 三种页面齐全的样本里,Shopify站50个,非Shopify站11个,还有几个因为限流没判出来。11这个数太小,下面的对比只能当方向,不能当结论。 项目 | Shopify(50) | 非Shopify(11) | 首页有WebSite或Organization | 84.0% | 72.7% | 类目页有列表类型 | 40.0% | 18.2% | 产品页有Product | 96.0% | 72.7% | 产品页有offers | 98.0% | 72.7% | 方向很清楚:站在一个成熟平台的默认值上,产品页这块基本白送。96%这个数不是50个商家各自努力的结果,是主题模板里本来就写好的。 但类目页那一栏,Shopify也只有40%。默认模板把有回报的那件事做了,没回报的那件事同样没做。 这就是默认值这件事一直以来的形状:它替你做的那部分,做得比你自己做还好;它没替你做的那部分,你多半也不知道它没做。上一轮量AI代理能不能用你的站时,也撞上过同一堵墙——四个动作83个站只有1个全通 (https://zhangwenbao.com/agent-actionability-html-audit.html),通得最多的两项恰好是平台自己实现的搜索和加购。 ## 这件事对AI购物代理意味着什么? 放在几年前,类目页没有ItemList,代价基本为零。搜索引擎有的是办法认出一个列表页——链接密度、卡片重复结构、分页参数,随便哪一条都够用。 现在多了一类读者。AI代理替用户逛店,第一步要判断的就是“我现在在哪一层”:这是个可以往下钻的列表,还是一个可以下单的详情?判断错了,后面全错。 而它的输入条件比搜索引擎苛刻得多。搜索引擎可以对一个域名抓几十万页慢慢学结构,代理往往只有当前这一页,甚至只有这一页的一部分。机器优先的架构要解决的就是这类问题 (https://zhangwenbao.com/machine-first-architecture-ai-agent-website.html)——把人靠眼睛得到的信息,明确写进字节里。 这类判断做不对,后果不止是少一次曝光。给独立站打一份智能体就绪度分 (https://zhangwenbao.com/agent-readiness-scorecard-dtc-ai-shopping-agent.html)的时候会发现,页面类型识别是那张表最靠前的一行,因为它错了后面每一项都白测;代理替用户逛店时品牌是没被看见还是被淘汰 (https://zhangwenbao.com/agentic-commerce-brand-visibility-blindspot.html),很多时候就卡在这一步。 更现实的一点:类目页恰恰是电商站最有价值的那类页面。它对应的是“男士跑鞋”“无线充电器”这种有搜索量、有商业意图的词。集合页在AI购物场景里才是主战场 (https://zhangwenbao.com/shopify-collection-page-geo-ai-shopping.html)这个判断,跟这一轮的数据是对得上的:主战场上有三分之二的页面没有向机器报过身份。 ## 但也别把ItemList想成灵丹妙药 得说句公道话。没有ItemList,页面不会被降权,也不会不被收录。搜索引擎照样能理解你的类目页,这一点Google的文档里说得很清楚:结构化数据是让你有资格获得某些展示形式,不是排名因素。 它的价值在于确定性。有声明,机器不用猜;没声明,机器靠推断,推断就有概率错。三分之二的类目页现在把这件事交给了概率。当读者只有搜索引擎时,这个概率足够高;当读者变成一个只看一页就要做决定的代理时,就不一定了。 ## 类目页的列表声明,怎么写才算数? 先说最容易踩的一个坑:ItemList里的每一项,得给出商品自己的网址。 Google关于轮播富媒体结果的文档 (https://developers.google.com/search/docs/appearance/structured-data/carousel)对这一点有明确要求——列表里的每个ListItem要用url指向对应的详情页,而不是把商品的全部信息塞在列表页里。写成后者,通常拿不到轮播展示,白写。 一个能用的最小结构长这样: { "@context": "https://schema.org", "@type": "CollectionPage", "name": "男士跑鞋", "url": "https://example.com/collections/mens-running", "mainEntity": { "@type": "ItemList", "numberOfItems": 24, "itemListElement": [ { "@type": "ListItem", "position": 1, "url": "https://example.com/products/cloud-6" }, { "@type": "ListItem", "position": 2, "url": "https://example.com/products/cloudrunner-2" } ] } } 几个实操上的注意点: - position要跟页面上的实际顺序一致。翻到第二页时position应该从25开始,不是从1重新数。这条最常被忽略,因为分页模板往往是另一个人写的。 - numberOfItems填当前页的商品数还是整个类目的总数,两种写法都有人用。填当前页更保险,跟页面内容对得上。 - 筛选之后的页面要不要发列表声明,看你的规范网址怎么定。用户连点五个筛选之后自己都忘了选过什么 (https://zhangwenbao.com/shopify-collection-applied-filters-overview-ux.html),机器更是如此。如果筛选页指向未筛选的类目页,那就别在筛选页上另发一份列表,会自相矛盾。电商重复内容的成因地图 (https://zhangwenbao.com/ecommerce-duplicate-content-causes-diagnosis-canonical-strategy.html)里这一类占了不小比重。 - 别和面包屑混为一谈。面包屑那份文档 (https://developers.google.com/search/docs/appearance/structured-data/breadcrumb)说得很清楚,BreadcrumbList描述的是层级位置;商品列表用ItemList,两个都发,各管各的。 - 手写容易漏字段,可以先用结构化数据生成器把13种常见类型的骨架拉出来 (https://zhangwenbao.com/schema-generator-jsonld-13-types-guide.html)再改。 - 发之前过一遍语法。一个尾逗号就能让整页结构化数据失效 (https://zhangwenbao.com/json-ld-validator-syntax-debug-guide.html),这种错误肉眼很难看出来。 ## 怎么查自己站上这三层身份? 不用买工具,三步能查完,比泡一杯咖啡的时间长不了多少。 第一步,选样本。每种页面模板挑一个代表页就够了:首页、一个主类目页、一个筛选后的类目页、一个普通商品页、一个变体商品页、一个礼品卡或虚拟商品页。六个网址,覆盖大部分情况。 第二步,看服务端给的那份。在页面上右键查看源代码(注意不是开发者工具里的Elements面板,那是渲染后的),搜application/ld+json,把每一段的@type记下来。这一步能分清哪些声明是服务端就有的,哪些要等脚本跑完才出现——对AI爬虫来说这个区别很关键,渲染这件事上真正会丢东西的地方跟大家担心的不太一样 (https://zhangwenbao.com/js-rendering-loss-three-myths-audit.html)。 第三步,填一张表。六行,每行三列:这一页是什么类型、它声明了什么类型、两者对不对得上。 页面 | 该声明 | 实际声明 | 结论 | 首页 | WebSite或Organization | | | 主类目页 | CollectionPage + ItemList | | | 筛选后类目页 | 看规范网址策略 | | | 普通商品页 | Product + Offer | | | 变体商品页 | ProductGroup或Product | | | 礼品卡页 | Product(属性可以少) | | | 填完之后,大概率会出现本文那个形状:产品页那行是满的,类目页那行是空的。 保哥给客户做这一步的时候有个习惯,先不看代码,先问一句“你们类目页是谁做的”。答案通常是“主题自带的”。那基本就能猜到结果了——主题自带的那部分做得挺好,主题没带的那部分一片空白。 补起来其实不难。类目页模板里加一段JSON-LD,商品循环里顺手把url收集进itemListElement,多数主题不到二十行代码。难的是先知道它缺着。 如果你用的是Shopify,这件事还要看你手上有什么工具。平台内置、通用工具与专属应用是三层 (https://zhangwenbao.com/shopify-seo-tools-three-layer-selection.html),能改模板的和只能改字段的,处理这件事的成本差好几倍。商品标识符那一层也顺手对一下,GTIN这类字段在几大平台上的写法各不相同 (https://zhangwenbao.com/product-gtin-seo.html)。 ## 回报的账,该重算了 你的三种页面,给人看的那部分各说各的,分辨率很高;给机器看的那部分,只有产品页说清了自己是什么。 不是因为没人在乎类目页,是因为过去很多年里,把类目页说清楚这件事没有回报。现在多了一类只看一页就要做决定的读者,回报的账要重新算了。 ## 常见问题解答 ## 类目页加了ItemList,排名会变好吗 不会直接变好,别指望改完下周看排名。结构化数据决定的是展示资格,比如能不能进商品轮播,不是排名信号。它真正省掉的是机器的推断成本:有声明,这一页是什么当场就定了;没声明,机器靠链接密度和卡片重复度去推,推得对不对看运气。要看效果,盯的应该是Search Console里富媒体结果那几张报表有没有新条目冒出来,而不是盯关键词排名。生效周期通常按周算,取决于重新抓取的频率。 ## 我的类目页有面包屑结构化数据,算不算已经声明了页面类型 不算。面包屑说的是这一页在网站层级里的位置,不是这一页的内容是什么。实测里16个站的类目页正好卡在这个状态——有BreadcrumbList,没有ItemList,占24.2%。两者是互补的:面包屑帮机器理解站点结构,列表声明帮机器理解当前页内容,都发一份才完整,各占各的位置,不冲突。 ## 用JavaScript渲染出来的结构化数据,搜索引擎和AI爬虫认吗 搜索引擎认,因为它会执行脚本再解析;很多AI爬虫不认,因为它们大多只取服务端返回的那份HTML。这一轮的统计取的是两份的并集,所以数字对渲染型的站是宽容的。如果你的读者里有AI爬虫,建议把身份声明这类关键信息放进服务端输出,不要等脚本跑完才注入。查法很简单:右键查看源代码,能搜到就在服务端,搜不到就不在。 ## 产品变体很多的商品页,该发Product还是ProductGroup 有多个变体、每个变体有独立价格或独立网址的,用ProductGroup包住,把各变体作为hasVariant里的Product,字段清单见Google的商品结构化数据文档 (https://developers.google.com/search/docs/appearance/structured-data/product)。实测样本里产品页出现ProductGroup的有33个站,跟Product几乎是并行使用的关系。只有一个规格的普通商品,直接发Product就行,不必强行套ProductGroup。 变体到底该合成一页还是拆成多页,同一商品几十个网址是合还是拆 (https://zhangwenbao.com/product-variant-seo-url-canonical-indexation-strategy.html)那篇给过一套判断顺序:先定网址再定结构化数据,顺序反了会反复返工。关键是别让变体各自发一份互相冲突的声明。 ## 礼品卡、服务类商品这种页面要不要发Product 要发,但属性可以少。实测里8个礼品卡页面有7个发了Product,只是没有尺寸重量这些字段。对机器来说,重要的是“这一页是一个可购买的东西”这个判断,属性齐不齐是第二位的。反过来,如果礼品卡页面什么都不发,代理很可能把它当成一个普通内容页,直接跳过。 ## 类目页翻到第二页第三页,列表声明要不要跟着改 要。ListItem的position应该反映真实位置,第二页从25开始就写25,不要每页都从1数起。另外每一页的列表成员当然也不同,得跟着分页一起生成。分页模板和类目模板经常不是同一个人维护,这是这条最容易掉链子的地方。改完之后随便翻两页对一下position,一分钟能验完。 ## 只有一个类目页没有列表声明,值不值得为它改模板 改模板的收益从来不在一个页面。类目页是模板产物,一个站几十上百个类目页共用同一份模板,改一次全站生效。实测里22个有列表声明的站,几乎都是模板层统一发的,不是一页一页手工加的。所以问题不该是“这一页值不值得”,而是“这个模板值不值得”,后者的答案通常是值得。 ## 权威参考资料 ## 网站页脚署的公司名,116个站里只有11个能查到编号 - URL:https://zhangwenbao.com/footer-legal-entity-name-verifiable-audit.html - 分类:电商SEO - 发布:2026-08-29 | 更新:2026-08-30 - 摘要:Anker官网页脚署的是Fantasia Trading,Rab署的是Equip Outdoor Technologies。机器要判断这个站属于谁,拿到的是一串它对不上号的名字。 - 关键词:电商SEO,页脚公司信息,版权署名,实体识别 > **TLDR**:摘要:116个海外品牌站的首页页脚,79.3%在版权行里署了一个名字。这个名字对得上品牌的占91.3%,剩下8个署的是外人根本认不出的公司——Anker署Fantasia Trading LLC,Rab署Equip Outdoor Technologies UK Ltd,Stanley署PMI WW Brands, LLC。真正的缺口不在这儿:能拿去工商系统查证的编号,116个站里只有11个给了,其中9个是被中国的备案制度硬性要求的。法律不强制的地方,主动写编号的只剩2个。一个名字不是身份,能被查到的那串号码才是。 > 摘要:116个海外品牌站的首页页脚,79.3%在版权行里署了一个名字。这个名字对得上品牌的占91.3%,剩下8个署的是外人根本认不出的公司——Anker署Fantasia Trading LLC,Rab署Equip Outdoor Technologies UK Ltd,Stanley署PMI WW Brands, LLC。真正的缺口不在这儿:能拿去工商系统查证的编号,116个站里只有11个给了,其中9个是被中国的备案制度硬性要求的。法律不强制的地方,主动写编号的只剩2个。一个名字不是身份,能被查到的那串号码才是。 打开anker.com,滑到底,页脚的版权行写着: © Fantasia Trading LLC 2025 品牌叫Anker,域名叫anker.com,商品叫Anker SOLIX、Anker Prime,而这个站在它唯一一处正式署名的位置,写了一个大部分访问者从没听过的名字。 这不是笔误,也不是什么见不得人的事。版权声明本来就该写持有版权的法律实体,这么写完全合规。有意思的是另一面:一个要判断“这个网站属于谁”的程序,在这一行里拿到的是一个它无法与品牌关联起来的字符串。 顺着这个念头,116个站的页脚版权行被逐行读了一遍。 ## 页脚那个名字,到底是谁在署名? 版权声明的标准格式是三段:版权符号、年份、版权所有人的名字。美国版权局的版权声明通函 (https://www.copyright.gov/circs/circ03.pdf)把第三段写作“版权所有人的名字”,可以是个人,可以是公司,也可以是能被普遍识别的简称或别名。 注意它说的是版权所有人,不是品牌。这两者经常不是一回事: - 品牌是拿来卖东西的,越好记越好 - 法律实体是拿来签合同、开发票、承担责任的,通常是一串没人念得出的全称 一家公司完全可以同时拥有十几个品牌,也可以在不同国家用不同的子公司持有同一个品牌。页脚这行字要求填的是后者,而访问者认识的是前者。矛盾从这里开始。 schema.org给这件事准备过解法。Organization类型 (https://schema.org/Organization)里有两个并列的字段:name 放通用名称,legalName 放官方注册的法律名称。设计者早就想到了这两个会不一样,所以给了两个格子。问题是这两个格子有没有人填,以及填的东西跟页脚上那行字对不对得上。 ## 116个站里,有多少在页脚给出了一个名字? 样本沿用这一系列的那批海外品牌与电商独立站,保哥把131个站的首页又走了一遍,116个正常打开,和JS渲染那一轮 (https://zhangwenbao.com/js-rendering-loss-three-myths-audit.html)用的是同一份名单。做法是用真实浏览器打开首页、滚到底触发页脚,抓渲染后的正文文本,找到版权标记之后把紧跟着的那段名字切出来。 切分这一步比想象中麻烦。名字有的在年份前,有的在年份后;有的紧跟版权符号,有的隔着一整句话;有的干脆用 @ 代替 ©。所以自动切完之后又人工过了一遍,改掉了9处切错和归一化误差。比如babybjorn.com的句式是“is the property of BabyBjörn AB”,机器把前半句也当成名字的一部分带了进来;wusthof.com署的WÜSTHOF因为变音符号在归一化时被抹掉,一度被判成对不上。 这种“机器切完人再过一遍”的做法,在这一系列里已经是标配,爬虫名单那一轮 (https://zhangwenbao.com/crawler-ua-list-named-vs-real-visits-audit.html)就是靠人工复核才没把纸面上的令牌当成真流量。最后的分布是这样: 页脚版权行的状态 | 站数 | 占比 | 给出了一个名字 | 92 | 79.3% | 只有年份,没有名字 | 7 | 6.0% | 一行版权声明都没有 | 17 | 14.7% | 中间那7个值得单独看一眼,因为它们是主动写了一行、又什么都没说的。everlane.com写的是 © 2026 ALL RIGHTS RESERVED,hellotushy.com写的是 © 2026 All Rights Reserved,functionofbeauty.com、bollandbranch.com、tentree.com也是同一句。保留一切权利——谁保留?没说。 剩下那17个连版权行都没有的站,页脚被政策链接、社媒图标、支付图标和订阅框塞得满满当当。页脚本该是信任收口的最后一关 (https://zhangwenbao.com/ecommerce-footer-design-trust-conversion.html),实际却常常是最先被挤掉署名的那块地方。把这7个和不写的17个加起来,116个站里有24个(20.7%)在整个首页页脚上没有交出任何一个可以当作署名的名字。 ## 给出的那个名字,认得出这个品牌吗? 92个给了名字的站,把署名和域名主体做归一化之后比对:去掉Inc、LLC、Ltd、GmbH、B.V. 这类法律后缀,去掉标点和空格,转小写,然后看是不是相等或者互相包含。 84个对得上,占91.3%;8个对不上,占8.7%。 站 | 页脚署名 | allbirds.com | AB DNAM LLC | anker.com | Fantasia Trading LLC | ice-watch.com | BEWATCH srl | rab.equipment | Equip Outdoor Technologies UK Ltd | segway.com | 纳恩博(北京)科技有限公司 | stanley1913.com | PMI WW Brands, LLC | sulwhasoo.com | AMOREPACIFIC CORPORATION | theordinary.com | DECIEM Beauty Group Inc | 这八个名字有个共同点:都带着LLC、Ltd、srl、有限公司这类法律后缀,也就是说它们是注册实体的全称,不是对外传播的那个牌子。 它们在页面上露不露面,另做了一次抽查:把这几个站重新打开,数署名里的关键词在整页可见文本里出现几次。结果是从1次到5次不等:allbirds.com的DNAM、rab.equipment的Equip Outdoor、sulwhasoo.com的AMOREPACIFIC都只出现1次,也就是只在版权行那一处;ice-watch.com的BEWATCH和theordinary.com的DECIEM各出现5次,页面别处也提到了。所以“署名认不出品牌”并不等于“这个名字被藏起来了”——有的站确实说了,只是说在了没人会去读的地方。 这次抽查还撞上一件事:segway.com这一回返回的是英文站,页脚署名换成了另一套,中文实体名一次都没出现。同一个域名在不同的访问条件下给出不同的署名,这本身就说明这行字是跟着站点版本走的模板变量,不是一处被认真维护的声明。 8.7%听上去不大,但这个比例的分母只包含“写了名字”的那92个站,而且是在最规范的一批大牌里量出来的。真正值得留意的是错位的方向:八个全都朝同一边偏——署名给的是持股和承担责任的那个实体,不是用户认得的那块牌子。 ## 为什么会在自己的官网上写一个外人不认识的名字? 这不是谁犯了错,是几股力量各自正确地作用之后的结果。 法务那边的诉求很清楚:版权行要写真正持有版权的那个法律实体,写品牌名在权利主张上是有瑕疵的。集团旗下十几个品牌共用一套页脚模板时,最省事也最安全的做法就是全部署母公司。品牌方那边不会反对,因为这行字在设计评审里排不上号。它字号最小、位置最低、点击率接近零。 于是就出现了这么个局面:全站唯一一处需要法律严谨性的文案,落在了全站最没人看的位置上,由一个跟品牌传播完全脱节的部门决定内容。 再叠上一层:这行字通常写在全局模板里,一次配置管所有页面、所有语言、所有地区站点。一个品牌被集团收购之后,改的是营业执照,不是模板;模板要等到下一次改版才可能被顺手更新,而改版的需求清单里从来没有“页脚版权行的公司名”这一项。 把这8个署名摆在一起看,错位的来源大致分三种,对应的处理办法完全不同: - 控股方署名。品牌被更大的集团持有,页脚直接署集团。这种最常见也最好办,页脚补一句“某某品牌隶属于某某集团”,关系就说清了。 - 属地实体署名。跨国品牌在某个市场设了独立公司,本地站的页脚署的是这家本地公司。麻烦在于同一个品牌在不同国家会署不同的名字,机器如果不做归并,读到的就是几个互不相干的组织。 - 注册名与商用名从一开始就不一样。中间没有收购也没有重组,纯粹是当年注册公司时用的名称和后来打出去的牌子不是一个。这种最容易被忽略,因为公司内部所有人都知道这两个名字指同一家,只有外面的人不知道。 第二种在这一轮里撞上过一次:同一个域名在不同的访问条件下返回不同的地区站,页脚署名跟着换。对一个按域名归并实体的系统来说,它先后读到两个不同的公司名,而页面上没有任何字段告诉它这两个是一回事。 顺带一提,这行字上另一个数字也有同样的毛病。同一批站的页脚年份实测 (https://zhangwenbao.com/footer-copyright-year-client-clock-audit.html)里,19%的站直接用浏览器时钟现算年份——把系统时间调到2031年,那行字当场变成 © 2031。名字和年份,版权声明的三要素里有两个都在自动漂移。 ## 一个名字,够不够让机器把你认出来? 不够,原因很实在:名字不唯一。 “Apple Inc.”这种级别的名字可以直接定位,但绝大多数公司名不行。各国的商业登记系统各管各的,重名在跨境范围内既常见又完全合法,系统之间也没有任何自动的消歧机制。搜索引擎构建实体图谱时,把一个字符串绑定到一个真实组织上,靠的从来不是名字本身,而是围绕这个名字的一圈交叉证据:官网、社交账号、维基条目、新闻提及、注册信息,彼此指认。实体消歧那套机制 (https://zhangwenbao.com/entity-disambiguation-mechanism-seo-signal-control.html)处理的就是这件事。 这里有个容易被忽略的连锁反应。前面抽查里那三个只在版权行出现过一次的名字,处境最尴尬:它不仅没帮上忙,还多给出一个悬空的字符串——机器得判断这是不是一个跟本站有关的实体,而整页上再没有第二处线索可以佐证。本地SEO里判断一家商户是不是同一个实体 (https://zhangwenbao.com/local-seo-google-entity-business-category.html),卡住的往往也是这一步。 schema.org的解法前面提过:name 填品牌,legalName 填法律实体,两个字段并列摆在同一个Organization里,等于明说“这两个名字指的是同一个组织”。用 @graph把站点的几个实体串起来 (https://zhangwenbao.com/schema-org-advanced-graph-entity-knowledge-panel-mechanism.html)是常见的做法,Google的组织结构化数据文档 (https://developers.google.com/search/docs/appearance/structured-data/organization)里也有一份可填字段清单,除了名称之外还有地址、联系方式、法律名称、注册号,以及 sameAs 那一组指向官方社交账号和百科条目的链接。 把页脚上那个法律实体名填进 legalName,成本大概是十分钟,收益是让那行小字从一个悬空字符串变成一条被认领的证据。这一轮没有逐站去核对结构化数据里的legalName填了没有。那是另一次实测的活儿。但从商家名称写法 (https://zhangwenbao.com/business-name-single-form-structured-data-audit.html)和首页几处自我描述互相打架 (https://zhangwenbao.com/self-description-copies-title-og-h1-schema-audit.html)这两轮的结果推断,这个字段的填写率大概率不高。 ## 能拿去核验的编号,有几个站给了? 这是整轮数据里落差最大的一格。 名字之外还有一样东西能定位一个法律实体:注册号。营业执照号、商业登记号、增值税号、备案号,各国叫法不同,作用一样:在某个官方登记系统里唯一地指向一个组织。有了它,任何人都能去英国公司注册处这类公开查询入口 (https://www.gov.uk/get-information-about-a-company)把这家公司调出来看。 116个站的页脚里,给出了这类编号的只有11个,占9.5%。 把这11个拆开看,落差就出来了: 编号类型 | 站数 | 站 | 中国ICP备案号 | 9 | casetify.com、dji.com、ecoflow.com、insta360.com、narwal.com、philips.com、segway.com、swarovski.com、uniqlo.com | 丹麦CVR登记号 | 1 | jysk.com | 英国VAT税号 | 1 | rab.equipment | 需要说清楚口径:这一轮的抓取从中国大陆的网络环境发起,上面那9个站返回的是它们的中国站页面,而在中国大陆运营的网站按规定要在页面底部展示ICP备案号。换句话说,这9个编号不是这些公司想写,是必须写。 把被强制的那9个拿掉,剩下的107个站里,主动在页脚给出可核验编号的只有2个。 而这并不是因为别处没有要求。欧盟的电子商务指令第5条 (https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=CELEX%3A32000L0031)列了一份清单,要求在线服务提供者把这些信息做到“容易、直接、永久可访问”:名称、设立地的地理地址、包括电子邮箱在内的联系方式、商业登记处的登记号、以及从事应税业务时的增值税号。这份清单跟版权声明的三要素几乎不重叠——它要的不是版权归属,是身份可核验。 这份要求在页脚上的落实程度,跟ICP那9个形成了很干净的对照:有硬性检查的地方就有编号,没有硬性检查的地方就只剩一个名字。做技术SEO久了会发现这个规律到处适用——真正被普遍执行的规范,背后一般都站着一个会来查的人。 ## 那机器把一个站认成实体时,到底读的是哪几个字段? 把这一系列量过的东西摞起来,一个站能交给机器的身份证据大致分四层: - 结构化数据层。Organization里的name、legalName、address、identifier、sameAs。这一层是唯一有明确字段语义的,机器不用猜。前提是同一个字段别写好几份互相打架 (https://zhangwenbao.com/duplicate-meta-tag-first-declaration-wins-audit.html)。 - 页面文案层。页脚版权行、关于我们、联系方式、法律声明页。语义要靠推断,写法五花八门,就是这一轮量的这一层;要是首页干脆是个连正文都读不到的空壳 (https://zhangwenbao.com/html-shell-page-readable-text-audit.html),这一层等于不存在。 - 站外指认层。官方社交账号、百科条目、行业目录、新闻报道里的公司名。E-E-A-T那组信号 (https://zhangwenbao.com/strengthen-authority-eeat-signals-ai-citations-2026.html)里权重最高的部分在这儿。 - 注册系统层。工商登记、商标、域名注册信息。最权威,但需要主动把编号交出来,机器才能顺着查过去。 这四层里,第二层是唯一一个绝大多数站都做了的,也是唯一一个没有统一格式的。第一层和第四层最好用,恰恰做的人最少。 这个错位跟配送和退货承诺那一轮 (https://zhangwenbao.com/shipping-return-promise-human-vs-machine-readable.html)的形状一模一样:话在页面上说得清清楚楚,换到机器读的通道里就只剩零星几个。区别在于,配送政策说错了顶多影响一次转化,而身份说不清楚,是所有信任信号的地基出了问题。独立站的信任是分层搭起来的 (https://zhangwenbao.com/dtc-ecommerce-trust-7tier-eeat-mechanism.html),最底下那层就是“你到底是谁”。 ## 页脚这行署名,具体该怎么改? 按投入产出排一下,从最省事的开始。 第一件,把品牌名和法律实体名同时写出来。版权行写成“© 2019-2026品牌名,由某某有限公司运营”这种形式,法务要的严谨性在,用户和机器要的可识别性也在。这一步不需要动代码,改的是模板里的一个字符串。 第二件,把legalName填进结构化数据。首页的Organization里,name 填品牌,legalName 填页脚上那个法律实体名,两者并列。这等于用机器能读懂的方式说明“这两个名字是同一个组织”,是这一整篇里性价比最高的一个动作。写出来就这么几行: { "@context": "https://schema.org", "@type": "Organization", "@id": "https://example.com/#organization", "name": "Rab", "legalName": "Equip Outdoor Technologies UK Ltd", "url": "https://example.com/", "identifier": { "@type": "PropertyValue", "propertyID": "VAT", "value": "GB115143946" }, "sameAs": [ "https://www.instagram.com/xxx", "https://en.wikipedia.org/wiki/xxx" ] } 几个字段各管一件事:name 是别人称呼你的那个词,legalName 是登记系统里的那个词,identifier 把编号挂上去,sameAs 提供站外的交叉指认。@id 给这个组织一个稳定的标识,站内其他结构化数据引用它的时候指向同一个地址,而不是每处各写一份互不相干的Organization。 要提醒一句:这几个字段填的内容必须和页面上写的一致。页脚署A、结构化数据写B,比只写一个还糟——机器拿到两个互相矛盾的声明,只会两个都不信。 第三件,如果你在有强制披露要求的市场经营,把编号放到页脚。欧盟站要登记号和增值税号,中国站要ICP备案号,英国公司要在网站上写明注册号和注册地。这既是合规动作,也顺带把身份的可核验性补上了。要注意别把这些信息藏进折叠区 (https://zhangwenbao.com/hidden-content-machine-readability-verdict-audit.html)——指令里“容易、直接、永久可访问”这几个词是有分量的。 第四件,检查一下这个名字在站内还出现在哪儿。这件事和核对sitemap里的地址页面认不认账 (https://zhangwenbao.com/sitemap-url-three-layer-identity-audit.html)是同一种活儿:把同一个东西在几处的写法摆到一起看。关于我们、联系方式、隐私政策、服务条款,理想状态是它们和页脚署的是同一个实体名。如果关于我们页写着品牌故事、隐私政策里是另一家公司、页脚又是第三个名字,那这个站在机器眼里就是三个模糊的实体。关于我们那一页 (https://zhangwenbao.com/about-us-page-entity-eeat-ai-search-guide.html)本来就该承担把这几个名字串起来的活儿。 第五件,别指望靠删掉解决。这一轮有24个站在页脚没给出任何名字,它们没有因此变得更清白。只是把这个问题推到了别的页面上,而那些页面的机器可读性通常更差。商品规格里字段和值配不上对 (https://zhangwenbao.com/product-spec-field-value-pairing-audit.html)是同一个毛病的另一种长相:信息在,但没被放进机器认得的格子里。 最后回到开头那行字。页脚署名是一个网站唯一一处被迫说真话的地方:其他文案都可以写得漂亮,这一行必须写法律上成立的那个名字。可正因为它必须说真话,它说出来的往往是用户和机器都听不懂的那句真话。让它同时被听懂,才是这一行该有的样子。 ## 常见问题解答 ## 页脚署名和品牌名不一致,会影响搜索排名吗 没有直接的排名影响。它影响的是实体识别的确定性——搜索引擎和大模型把这个站关联到某个组织时,页脚这行是可用的证据之一,写一个站内其他地方从未出现的名字,等于给出一条断掉的线索。要修,成本最低的做法是在结构化数据里用legalName把法律实体名认领下来。 ## 版权行里到底该写品牌名还是公司全称 两个都写最稳妥。版权声明要求的是版权所有人,写公司全称在法律上更严谨;但从可识别性出发,品牌名不能缺。写成“© 2019-2026品牌名,某某有限公司”这类形式,两边的需求都能满足,也没有任何规则禁止这么写。 ## 页脚不写公司名只写All Rights Reserved,有什么问题 法律上不构成问题,1989年3月1日之后发表的作品,版权声明本身就不是取得权利的前提。实际问题是这行字变成了纯装饰:它占了一个位置,却没有回答任何人的任何问题。这一轮有7个站是这么写的。 ## ICP备案号、增值税号这类编号放在页脚,会不会有安全风险 这些编号本来就是公开信息,公司注册号、增值税号在各国的登记系统里都能查到,属于设计上就要公开的标识。真正需要谨慎的是个人信息。法人代表的身份证件号、私人手机号这类不该出现在页脚。 ## 集团旗下多个品牌共用页脚模板,署名怎么处理 按品牌站分别配置,而不是全部署母公司。技术上通常只是模板里加一个变量的事。如果确实无法拆分,退一步的做法是写成“品牌名is a brand of母公司名”这种形式,把两者的关系明确写出来,而不是只留母公司一个名字让人去猜。 ## 这一轮的结论能推广到中小独立站吗 方向能,比例不能。样本是131个有品牌的中大型电商站,实际用上116个,本身就是相对规范的一批。中小站和自建站的页脚署名只会更随意,可核验编号的比例只会更低。另外这一轮只量了首页页脚,同一个站的关于我们、隐私政策页可能有更完整的实体信息,这一轮没有去逐页核对。 ## 权威参考资料 ## 结构化数据里价格64个站全写了,规格只有7个 - URL:https://zhangwenbao.com/product-spec-field-value-pairing-audit.html - 分类:电商SEO - 发布:2026-08-28 | 更新:2026-08-30 - 摘要:产品页的规格表看着横平竖直,把样式一关就塌成一根字符串。字段名和值能不能对上,靠的往往只是模板里谁先写谁后写——改版挪一次促销条、加一层标签页,某批参数就悄悄配错了,而页面上一点变化都看不出来。你的产品页现在处在哪一档,怎么用记事本一分钟自查一遍。 - 关键词:结构化数据,语义化HTML,产品页SEO,实测数据,电商独立站 > **TLDR**:摘要:80个电商独立站的产品页,63个页面上找得到规格字段名,一共187处。把这些字段名放回机器实际拿到的那条文本流里逐条人工核对,字段名后面紧跟的内容只有51.9%真是它的值;15.0%是另一个字段名或分组标题,33.2%是评价区、促销条、标签页名这类不相干的东西。站一级的中位配对成功率正好50.0%,20个站一条都没对上。而能让机器不必靠猜的三条通道,使用率分别是8.8%、7.5%、8.8%。 > 摘要:80个电商独立站的产品页,63个页面上找得到规格字段名,一共187处。把这些字段名放回机器实际拿到的那条文本流里逐条人工核对,字段名后面紧跟的内容只有51.9%真是它的值;15.0%是另一个字段名或分组标题,33.2%是评价区、促销条、标签页名这类不相干的东西。站一级的中位配对成功率正好50.0%,20个站一条都没对上。而能让机器不必靠猜的三条通道,使用率分别是8.8%、7.5%、8.8%。 产品页上那张规格表,你大概很久没认真看过了。它长得规规矩矩:左边一列字段名,右边一列值,行距均匀,字号统一,扫一眼就知道净重多少、尺寸多大、什么材质。 现在把浏览器的样式关掉。设置里有“禁用样式”,或者干脆开阅读模式。那张表会塌成一根竖着的字符串: Specifications Input 9.0V⎓3A / 12V⎓3A / 15V⎓3A Output Phone: 25W Max Dimensions 3.74 × 2.38 × 1.22 in Weight 8.11 oz 这是anker一个充电站产品页塌下来的样子。读起来还行,字段名和值一上一下交替出现,谁都能还原出那张表。 问题在于,这个“还行”背后没有任何东西在保证它。它成立,仅仅因为写模板的人恰好把字段名的div写在了值的div前面。哪天设计改成两列、字段名全进左边那个容器、值全进右边那个,塌下来就成了“Input Output Dimensions Weight 9.0V 25W 3.74in 8.11oz”。人看着还是那张表,机器拿到的已经是两堆互不认识的词。 所以这一轮想量的不是“机器读不读得到”,而是机器读对的时候,究竟是有人保证它对,还是顺序碰巧对。 ## 把CSS关掉之后,你的规格表还剩什么? 先说清楚这件事为什么值得单独量一次。 前面几轮量过内容整段掉出通道的情形。图上的字62%在文本层里一个都找不到 (https://zhangwenbao.com/image-text-not-in-text-layer-ocr-audit.html)是一种,屏幕上最大那行字44.6%不是标题标签 (https://zhangwenbao.com/visual-hierarchy-vs-heading-tags-audit.html)是另一种。这两种的共同点是信息真的没了:机器那边整段消失,而且不报错。 规格不一样。规格的字全都在文本里,一个字符都没少。少掉的是字段和值之间的那根线。人靠对齐看出这根线——这一行左边是名、右边是值,因为它们横着排在一起。机器没有“横着排在一起”这个概念,它只有一串按DOM顺序展开的字符。 这根线在HTML里本来有专门的表达方式。表格里,th和同一行的td是一对;定义列表里,dt和紧跟的dd是一对;结构化数据里,additionalProperty下面每个PropertyValue自带name和value两个字段。这三种写法都不依赖顺序碰巧对,它们把配对关系直接写进了标签。 可要是用两个div拼出同样的视觉效果,这根线就只存在于CSS里。CSS不进索引。 ## 51.9%——这是63个站给出的配对成功率 口径先摆出来,每一层的站数都不一样,混着说会得出很难看的错误结论。 - 起手131个英文电商与消费品牌站; - 首页采集成功130个(getquip.com导航超时); - 从首页找到并打开产品页的80个,这是本文所有产品页统计的分母; - 产品页上匹配到规格字段名的63个站,字段名共出现187处。 “字段名”的判定用了一份写死的词表:material、weight、dimensions、capacity、warranty、country of origin、tech specs这一类,六十多个词,并且要求这个元素显示出来的全部文字就是这个词本身——不然正文里那句“materials and features…”也会被当成字段名。 然后取document.body.innerText。这大致就是把样式关掉之后剩下的东西,也接近爬虫和大模型切段时拿到的形态。按行切开,找到每个字段名所在的行,看它下一行是什么。 187条全部人工过了一遍,分成三类: 下一行是什么 | 条数 | 占比 | 确实是这个字段的值 | 97 | 51.9% | 另一个字段名,或一个分组标题 | 28 | 15.0% | 跟这个字段无关的模块 | 62 | 33.2% | 同一个站同一个字段去重之后(评价区经常把“Fit”重复五六遍),156条的分布是51.9%、14.1%、34.0%。去重前后第一档一模一样,说明51.9%不是被重复项撑出来的。 换成站的口径:63个站的配对成功率中位数正好50.0%;20个站一条都没对上,占31.7%;13个站全对,占20.6%。 也就是说,你的产品页上的规格,机器大概能拿对一半。至于是哪一半,它自己也不知道。 ## 配错的那一半,都错在哪里? 两类错法性质完全不同,得分开讲。 ## 第一类:值和名分了家 28条属于这类,特征是字段名的下一行还是个字段名。 - anker的“Specifications”,下一行是“Input”; - decathlon的“Specifications”,下一行是“Materials”; - menuspace的“Dimensions”,下一行是“Specifications”; - nomadgoods的“Tech Specs”,下一行是“Materials”; - beistravel更彻底,“Fabric”“color”“fits”“style”四个词连着落下来,中间一个值都没夹。 规律其实很清楚:分组标题和字段名,在文本流里长得一模一样。“Specifications”是这一整块的名字,“Input”是这一块里的一条,可它们都是独立成行的短词,字面上没有任何区别。人靠字号和缩进一眼分清层级,机器要么两个都当字段名、于是把“Input”当成“Specifications”的值,要么两个都当标题、于是这一块一条也抽不出来。 untuckit那条最有喜剧效果:“Fit”的下一行还是“Fit”。一个是筛选器的分组名,一个是规格里的字段名,同一个单词连着出现两次,中间什么都没有。机器读到这儿,多半会以为自己卡带了。 everlane的“Materials & Care”下一行是“Materials:”,同一个毛病——外层是合并的分组名,内层才是真字段,两层用了同一个词根。 ## 第二类:下一行压根是别的模块 62条,占三分之一,这类才是真会让人一惊的。 - burrow的“Dimensions”下一行是“Up To 35% OFF”,一条促销带插在了规格和它的值中间; - govee的“Specifications”下一行是“Reviews”,soundcore、nomadgoods、jackery的“Tech Specs”下一行都是“FAQ”——这是标签页的名字,规格藏在没被激活的那个面板里; - rapha的“Materials & Care”下一行是“YOU MAY ALSO LIKE”,推荐位直接顶上来了; - tentree的“Size & Fit”下一行是“$25”; - vuoriclothing的“Height”下一行是“Showing 60 results”; - menuspace的“Care Instructions”下一行是“Privacy Policy”,页脚都挤进来了; - hellotushy的“Specifications”下一行是“Download PDF”。规格是有的,在一个PDF里。 这类的成因大多是字段名本身就是标签页或折叠块的把手,内容在另一个还没展开的容器里。采集时已经把所有原生details展开过一次,但用div加JavaScript自己实现的手风琴展不开——这恰恰就是机器面对的真实情况。隐藏内容到底算不算数那一轮 (https://zhangwenbao.com/hidden-content-machine-readability-verdict-audit.html)拆过十六种藏法各自的裁决,这里是它落在规格上的具体后果:不是内容被降权,是字段和值被彻底切断。 说个题外的观察。规格书在屏幕上好好的、机器复制走的却是另一串字符 (https://zhangwenbao.com/minor-language-pdf-text-layer-extraction-failure.html)那件事,跟hellotushy这个“Download PDF”是同一个逻辑的两端:一个是把规格搬进了PDF的图层,一个是把规格搬进了PDF这个文件。人点开就能看,机器要多走一道,而多走的那道往往没人走。 ## 为什么“机器读对了”和“机器有把握”是两回事? 这是本文真正想说的一句话,值得单独展开。 51.9%第一眼看着不算灾难:一半能对上,剩下一半改改就是了。但换个角度问——那对上的51.9%,靠的是什么机制? 答案是DOM书写顺序。字段名的元素恰好写在值的元素前面,中间恰好没插别的东西,塌下来就是对的。这里没有任何一层在做校验,没有任何一层在声明“这两个是一对”。它对,是因为写模板的那个人当时顺手就那么写了。 顺手写对的东西,会被顺手改错。改版把规格区从一列改成两列,把促销带挪到规格上面,给规格加一层标签页容器——任何一次都能让某一批字段从对的那半掉进错的那半,而页面上看不出一点变化。对齐是CSS在管,CSS没坏。 这就是它和“信息整段消失”的关键区别。信息消失至少还有明确的失败信号:打开阅读模式,那句话不在,一眼就看见了。配对关系断掉这件事没有信号,塌下来的文本流照样通顺,你甚至会觉得它读着挺好。 做SEO的人对这种事其实不陌生。一个尾逗号就能让整页结构化数据失效 (https://zhangwenbao.com/json-ld-validator-syntax-debug-guide.html)是同一类:肉眼看页面完全正常,机器那侧已经全丢。区别只是JSON-LD好歹有校验器会红着脸告诉你,而“字段和值靠顺序凑在一起”这件事,没有任何工具会报警。 ## 能给出把握的三条通道,现在各有多少人在用? HTML和schema.org一共提供了三种把配对关系写死的办法。80个产品页上的实际使用情况: 通道 | 用了的站 | 占80个产品页 | 可见的