本文约 5,749 字,预计阅读 15 分钟。文中命令与配置均经过实测,可直接参考执行。
引言:商品提交了两百个,通过审核的只有十几个
做外贸独立站的卖家常卡在这一步:把 WooCommerce 的商品提交到 Google Merchant Center,第二天打开”诊断”页面,一片红色——”缺少 gtin””价格与落地页不符””图片尺寸过小””availability 无效”。两百个商品里只有十几个通过审核,其余全部被拒。
购物广告(Shopping ads)与自然搜索是两套体系:自然搜索靠页面内容和链接,购物广告靠结构化商品数据。Google 不读你的页面 HTML 去猜价格,它只读你提交的 Feed 里的字段。Feed 里任何一个必填属性缺失或与目标页不一致,商品就会被拒。所以 Feed 的质量直接决定了购物广告能跑多少品。
原理分析:Feed 的必填属性与一致性校验
一条商品数据由若干属性组成,按重要性分三类:
| 类别 | 属性 | 缺失后果 |
|---|---|---|
| 核心必填 | id、title、description、link、image_link、price、availability | 商品被拒 |
| 强烈建议 | gtin / mpn + brand、condition、shipping、tax、item_group_id | 曝光受限或限流 |
| 场景必填 | color、size、gender、age_group(服饰类) | 类目相关拒绝 |
gtin(原 UPC/EAN)不是强制项,但没有它时必须同时提供 brand 与 mpn,否则商品会被标记为”缺少唯一商品标识符”。服饰类目没有 color、size、gender 几乎无法通过审核。
最容易踩的是一致性校验:Google 会抓取 link 指向的落地页,比对页面上的价格、库存与 Feed 是否一致。不一致就判为”价格不匹配”,这是最常见的拒绝原因。所以 Feed 的生成必须与页面保持同一数据源,且价格含税/运费规则要一致(用 shipping 与 tax 属性声明)。
Feed 的提交方式有三种:Google Sheets、定时抓取(Scheduled fetch,支持 XML/TSV 文件 URL)、Content API for Shopping(适合大体量实时同步)。中小站点用定时抓取最简单,每天一次足够。
保姆级实操
步骤 1:准备商品数据。 在 WooCommerce 里补全品牌、GTIN、重量、尺寸。品牌可用商品属性或专用字段;GTIN 若用的是官方插件(Google for WooCommerce,早期版本名为 Google Listings & Ads),可在商品编辑页的”Google”面板里填写。
步骤 2:生成 Feed 文件。 优先用官方插件自动生成;若需要定制字段,可自建 Feed 端点。WordPress 的 add_feed() 可注册一个自定义 feed 路由。
<?php
// 注册 /feed/google-shopping/ 端点,输出 Merchant Center 可抓取的 XML
add_action('init', function () {
add_feed('google-shopping', 'mmm_render_shopping_feed');
});
function mmm_render_shopping_feed() {
header('Content-Type: application/xml; charset=UTF-8');
$currency = function_exists('get_woocommerce_currency') ? get_woocommerce_currency() : 'USD';
$q = new WP_Query([
'post_type' => 'product',
'post_status' => 'publish',
'posts_per_page' => -1,
'fields' => 'ids',
'no_found_rows' => true,
'meta_query' => [[
'key' => '_stock_status',
'value' => 'instock',
'compare' => '=',
]],
]);
echo '<?xml version="1.0" encoding="UTF-8"?>' . "\n";
echo '<rss version="2.0" xmlns:g="http://base.google.com/ns/1.0"><channel>' . "\n";
echo '<title>' . esc_html(get_bloginfo('name')) . '</title>' . "\n";
foreach ($q->posts as $id) {
$p = wc_get_product($id);
printf(
'<item>
<g:id>%s</g:id>
<g:title><![CDATA[%s]]></g:title>
<g:description><![CDATA[%s]]></g:description>
<g:link>%s</g:link>
<g:image_link>%s</g:image_link>
<g:availability>%s</g:availability>
<g:price>%s %s</g:price>
<g:brand><![CDATA[%s]]></g:brand>
<g:condition>new</g:condition>
</item>' . "\n",
esc_html($p->get_sku() ?: $id),
$p->get_name(),
wp_strip_all_tags(wp_trim_words($p->get_short_description() ?: $p->get_description(), 60)),
esc_url(get_permalink($id)),
esc_url(wp_get_attachment_url($p->get_image_id())),
$p->is_in_stock() ? 'in stock' : 'out of stock',
esc_html($p->get_price()),
esc_html($currency),
get_bloginfo('name')
);
}
echo '</channel></rss>';
}
注册后需要到”设置 → 固定链接”点一次保存以刷新重写规则(或在插件激活时调用 flush_rewrite_rules())。
步骤 3:确认 XML 结构符合规范。 Merchant Center 支持 RSS 2.0、Atom 1.0 与 TSV,用 g: 命名空间声明 Google 属性。
<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:g="http://base.google.com/ns/1.0">
<channel>
<title>Example Store</title>
<item>
<g:id>SKU-1001</g:id>
<g:title>轻量化折叠登山杖 碳纤维</g:title>
<g:description>7075 铝合金杆身,三节折叠,收纳长度 35cm,适合徒步与登山。</g:description>
<g:link>https://example.com/product/sku-1001/</g:link>
<g:image_link>https://example.com/wp-content/uploads/sku-1001.jpg</g:image_link>
<g:condition>new</g:condition>
<g:availability>in stock</g:availability>
<g:price>49.99 USD</g:price>
<g:brand>Example</g:brand>
<g:gtin>0690123456789</g:gtin>
<g:google_product_category>Sporting Goods > Outdoor Recreation</g:google_product_category>
<g:shipping>
<g:country>US</g:country>
<g:service>Standard</g:service>
<g:price>5.99 USD</g:price>
</g:shipping>
</item>
</channel>
</rss>
注意 g:price 必须带币种且不含千分位符号;g:availability 的取值是固定的 in stock / out of stock / preorder,写成 instock 会被拒。
步骤 4:在 Merchant Center 提交。 商品 → Feed → 添加 Feed → 选”定时抓取”,填入 Feed URL,设定每天抓取一次。首次提交后等 30 分钟到数小时看”诊断”结果。
步骤 5:处理诊断问题。 按”诊断”页的严重级别(Error / Warning)逐项处理:Error 必须修,Warning 影响曝光。价格不匹配要检查落地页是否有币种切换插件输出了不同价格。
步骤 6:验证与监控。 抓取完成后查看商品数量与已批准数量;每周看一次”诊断”,新增商品后留意审批状态。落地页质量本身也会影响转化,可配合 Core Web Vitals 优化指南 优化商品页体验。
常见踩坑
- 案例: 某站用多币种插件,Feed 按默认币种生成美元价,而 Google 抓取落地页时读到的是欧元价,导致 300 多个商品全部”价格不匹配”被拒。解决方式是让 Feed 生成逻辑读取与页面相同的币种上下文,或锁定单一币种投放。
availability写成instock(无空格),属性无效,商品被拒。必须是in stock。- 主图带水印、带促销文字,或尺寸小于 100×100 像素,服装类要求更高(建议至少 800×800)。
- Feed 里仍保留已下架商品,
link打开是 404,被判为”落地页无效”。生成时要用meta_query过滤库存与状态。 - 没有 GTIN 也没填
brand+mpn,商品被标记”缺少唯一商品标识符”,曝光极低。 add_feed()注册后没有刷新固定链接,访问 Feed URL 返回 404,Merchant Center 抓取失败。- 用中文逗号或全角字符写价格小数位,解析失败。价格字段必须是纯数字加半角小数点。
总结
Feed 质量的判断标准:批准率(已批准商品数 / 提交总数)应大于 95%,Error 项清零。行动清单:先补全品牌、GTIN、图片、重量等基础字段;生成 XML Feed 并确保 availability、price、condition 取值符合官方枚举;提交定时抓取并逐项处理诊断;每次改价或改库存后确认 Feed 同步。购物广告与自然流量并不冲突,Feed 做得规范,等于多了一条稳定的商品曝光通路。
