搜索全站
Google SEO 11 分钟阅读

WordPress 站内视频索引优化:缩略图、时长与 VideoObject 完整写法

站内视频能否进入 Google 视频结果,取决于 VideoObject 字段是否完整准确。本文给出 name、description、thumbnailUrl、uploadDate、duration 的写法,以及用 ffprobe 自动生成时长与封面的脚本。

U
UFO_PF 2025-12-30 · 阅读 11 分钟
Wo GOOGLE SEO
阅读提示
本文约 4,152 字,预计阅读 11 分钟。文中命令与配置均经过实测,可直接参考执行。

引言:结构化数据写了,视频却一条都没被索引

在主题里加了 VideoObject 结构化数据,用富媒体结果测试工具一测全部通过,但 Search Console 的视频报告里「已索引的视频数」一直是 0。这类问题的排查方向往往不是 JSON 语法,而是字段的真实性——duration 写的是 10 分钟、实际视频 3 分钟;thumbnailUrl 指向的图被 CDN 拦截;uploadDate 写每次访问都变化的当前时间。Google 会把这些当作与实际资源不符的标注,直接放弃索引。

视频索引与网页索引不同,它是一种「资源级」索引:Google 要确认视频文件真的存在、真的能播、真的与页面描述一致。任何一项对不上,标注就作废。

原理分析:Google 对视频索引的三类要求

第一类是可访问性:视频文件与缩略图必须能被 Googlebot 下载,不能要求登录、不能有 Referer 白名单、不能有时效签名。robots.txt 不能屏蔽这些资源。

第二类是标注完整性。Google 文档给出的 VideoObject 必填字段包括 name、description、thumbnailUrl、uploadDate;强烈建议提供 duration、contentUrl 或 embedUrl;可选字段有 expires、interactionStatistic、publication、regionsAllowed。其中:

字段 常见错误 正确写法
thumbnailUrl 用相对路径、尺寸过小、被防盗链 绝对 URL,建议提供多个尺寸的数组,至少 640px 宽
uploadDate 写当前时间或格式缺时区 ISO 8601 完整带时区,如 2026-01-18T09:30:00+08:00
duration 写 10:30 或 630 ISO 8601 时长格式 PT10M30S
contentUrl 写需要登录的地址 公开可下载直链
name/description 与页面标题正文完全不同 与页面主题一致,描述控制在 200 字内

第三类是页面本身:页面必须可被索引(不能 noindex),视频应在页面显著位置可播放,而不是藏在需要点击三次才能打开的弹窗里。另外,缩略图与实际视频内容不符(用一个通用封面)也是常见的不符项。

保姆级实操

步骤 1:用 ffprobe 与 ffmpeg 生成真实元数据。 时长和封面不要手填,从文件里读:

# 读取视频时长(秒)
DURATION=$(ffprobe -v error -show_entries format=duration \
  -of default=noprint_wrappers=1:nokey=1 /srv/videos/wordpress-video-seo.mp4)
echo "时长秒数: $DURATION"

# 在第 3 秒截取一帧作为封面,统一缩放到 1280 宽
ffmpeg -ss 00:00:03 -i /srv/videos/wordpress-video-seo.mp4 \
  -frames:v 1 -vf "scale=1280:-2" -q:v 3 /srv/videos/covers/wordpress-video-seo.jpg

# 顺便把视频转成 Web 友好的 H.264 + AAC,并开启快速起播(faststart)
ffmpeg -i input.mov -c:v libx264 -crf 23 -preset medium \
  -c:a aac -b:a 128k -movflags +faststart wordpress-video-seo.mp4

步骤 2:在 WordPress 里自动注入 JSON-LD。 用自定义字段存视频地址与时长,模板输出时读取:

// functions.php:为带视频的文章注入 VideoObject
add_action( 'wp_head', function () {
    if ( ! is_singular( 'post' ) ) {
        return;
    }
    $post_id     = get_the_ID();
    $video_url   = get_post_meta( $post_id, '_video_url', true );
    $seconds     = (int) get_post_meta( $post_id, '_video_duration', true );
    $poster      = get_post_meta( $post_id, '_video_poster', true );
    if ( ! $video_url || ! $poster ) {
        return;
    }

    // 秒数转 ISO 8601 时长:PT10M30S
    $duration = 'PT' . floor( $seconds / 60 ) . 'M' . ( $seconds % 60 ) . 'S';

    $data = array(
        '@context'     => 'https://schema.org',
        '@type'        => 'VideoObject',
        'name'         => get_the_title( $post_id ),
        'description'  => wp_strip_all_tags( get_the_excerpt( $post_id ) ),
        'thumbnailUrl' => array( esc_url( $poster ) ),
        'uploadDate'   => get_the_date( 'c', $post_id ), // ISO 8601,含时区偏移
        'duration'     => $duration,
        'contentUrl'   => esc_url( $video_url ),
        'embedUrl'     => esc_url( get_permalink( $post_id ) ) . '#video',
    );

    echo '<script type="application/ld+json">' . wp_json_encode( $data, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE ) . '</script>' . "\n";
} );

步骤 3:校验结构化数据。 用 Google 的富媒体结果测试工具(Rich Results Test)输入 URL,确认 VideoObject 被识别且无警告;再用网址检查工具看渲染后的 HTML 里 JSON-LD 的字段值是否与实际情况一致。

步骤 4:确认资源可抓取。 在 robots.txt 里放行视频目录与封面目录;CDN 上关闭对 Googlebot 的 Referer 校验;如果用了签名 URL,改成长时效或公开直链。

步骤 5:提交并观察视频报告。 Search Console 左侧「视频」相关报告(视频索引报告/视频页面报告)会显示「已发现的视频数」与「已索引的视频数」,并列出问题类型。sitemap 中提交的视频数与已索引数不一致时,优先看报告里的问题说明,而不是反复提交。

步骤 6:逐项修复问题。 报告里常见的问题有「视频无法访问」「缩略图无法加载」「时长或缩略图与实际不符」。按顺序处理:先解决状态码,再解决缩略图,最后核对时长与日期字段。

常见踩坑

  1. uploadDate 用 date('c') 动态生成,每次抓取都是新日期,Google 判定为不可信标注。
  2. duration 写成 10:30,不是 ISO 8601 格式,字段被忽略。
  3. 缩略图用了懒加载且不输出在 HTML 里,Googlebot 拿不到封面地址。
  4. 视频放在需要登录的会员区,却仍声明 contentUrl,属于无效标注。
  5. 封面与实际内容无关,用统一品牌图应付所有视频,索引率明显偏低。
  6. 案例:某健身站用 -movflags +faststart 之前转码的视频,Googlebot 抓取视频文件头超时,视频报告里 42 条视频全部显示「无法访问」。排查了半个月防盗链和 robots.txt,最后发现是 moov atom 在文件尾部,Googlebot 只抓取前若干 KB 就放弃。重新转码开启 faststart 后,两周内 38 条进入索引。
  7. 页面上视频靠 JS 弹窗播放,HTML 里没有 <video> 元素,Google 无从判断视频位置。
  8. 多个视频共用一个页面却只写了一个 VideoObject,应写成数组,或用 ItemList 组织。

总结

视频能否被索引的判断标准:Googlebot 匿名、无 Referer、无登录的情况下,能不能下载到视频文件和缩略图,并且页面上声明的时长、封面、日期与实际一致。执行上先用 ffprobe/ffmpeg 生成真实元数据并转码开启 faststart,再用 wp_head 注入 VideoObject,字段值全部来自自定义字段而非手写常量,最后用富媒体结果测试与 GSC 视频报告双向验证。托管方式的选择(YouTube 还是自托管)参考 视频 SEO 策略,结构化数据的通用校验方法参考 Schema 结构化数据。

U
UFO_PF作者

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

留下你的想法

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