搜索全站
Google SEO 15 分钟阅读

Google Merchant Center 与产品 Feed:电商站的购物广告入门

商品 Feed 写不对照样上不了购物广告。本文讲清 Merchant Center 的 Feed 必填属性、XML/TSV 提交方式,给出 WordPress 自定义 Feed 端点与字段补全代码。

U
UFO_PF 2024-02-19 · 阅读 15 分钟
Go GOOGLE SEO
阅读提示
本文约 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 优化指南 优化商品页体验。

常见踩坑

  1. 案例: 某站用多币种插件,Feed 按默认币种生成美元价,而 Google 抓取落地页时读到的是欧元价,导致 300 多个商品全部”价格不匹配”被拒。解决方式是让 Feed 生成逻辑读取与页面相同的币种上下文,或锁定单一币种投放。
  2. availability 写成 instock(无空格),属性无效,商品被拒。必须是 in stock。
  3. 主图带水印、带促销文字,或尺寸小于 100×100 像素,服装类要求更高(建议至少 800×800)。
  4. Feed 里仍保留已下架商品,link 打开是 404,被判为”落地页无效”。生成时要用 meta_query 过滤库存与状态。
  5. 没有 GTIN 也没填 brand + mpn,商品被标记”缺少唯一商品标识符”,曝光极低。
  6. add_feed() 注册后没有刷新固定链接,访问 Feed URL 返回 404,Merchant Center 抓取失败。
  7. 用中文逗号或全角字符写价格小数位,解析失败。价格字段必须是纯数字加半角小数点。

总结

Feed 质量的判断标准:批准率(已批准商品数 / 提交总数)应大于 95%,Error 项清零。行动清单:先补全品牌、GTIN、图片、重量等基础字段;生成 XML Feed 并确保 availability、price、condition 取值符合官方枚举;提交定时抓取并逐项处理诊断;每次改价或改库存后确认 Feed 同步。购物广告与自然流量并不冲突,Feed 做得规范,等于多了一条稳定的商品曝光通路。

U
UFO_PF作者

专注 WordPress 生态的实战作者,内容以「可复制、可验证」为第一原则。

留下你的想法

邮箱地址不会被公开。带 * 的为必填项。