如何将Hugo页面shortcode变量传入sitemap.xml补充图片SEO字段
Hugo 自定义Sitemap提取shortcode图片参数解决方案
Hugo默认不支持直接在Sitemap模板中读取页面内嵌入的shortcode参数,可通过以下两种方案实现需求,优先推荐第一种:
方案1:参数存入页面Front Matter(稳定无兼容问题)
步骤1:将图片参数迁移到页首Front Matter
每个page.md的头部元数据区添加图片配置,示例如下:
--- # 其他原有Front Matter配置,比如title、date等 featured_image: name: "THE_IMAGE_NAME.jpg" featuredTitle: "THE_IMAGE_TITLE" location: "THE_IMAGE_LOCATION" alt: "THE_IMAGE_ALT/CAPTION" ---
步骤2:简化原有shortcode调用
修改featured-image shortcode的内部逻辑,直接读取当前页面Front Matter的参数,不用再在调用时传入参数:
{{/* 短代码内部逻辑示例 */}} {{ with .Page.Params.featured_image }} {{ $img := $.Page.Resources.GetMatch .name }} <img src="{{ $img.Permalink }}" alt="{{ .alt }}" title="{{ .featuredTitle }}"> {{ end }}
页面内的shortcode调用简化为:
{{< featured-image >}}
步骤3:Sitemap模板直接读取参数
修改你的sitemap.xml模板,直接读取每个页面的Front Matter参数即可:
{{ $license := .Site.Params.schema.license }} {{ range .Data.Pages }} {{ with .Params.featured_image }} {{ $img := $.Resources.GetMatch .name }} {{ if $img }} <image:image> <image:loc>{{ $img.Permalink }}</image:loc> <image:license>{{ $license }}</image:license> <image:geo_location>{{ .location }}</image:geo_location> <image:title>{{ .featuredTitle }}</image:title> <image:caption>{{ .alt }}</image:caption> </image:image> {{ end }} {{ end }} <!-- 如需处理页面内其他非首图资源,可继续保留原有.Resources.ByType遍历逻辑 --> {{ end }}
方案2:正则解析页面内容提取shortcode参数(不推荐,兼容性差)
如果不想修改现有shortcode的使用方式,可以通过正则匹配页面原始内容提取参数,但是如果shortcode的写法发生变化(比如参数顺序调整、引号类型变化、新增参数),很容易匹配失败:
{{ $license := .Site.Params.schema.license }} {{ range .Data.Pages }} {{ $rawContent := .RawContent }} {{/* 匹配页面内的featured-image短代码块 */}} {{ $scMatch := findRE `{{<\s*featured-image\s+([\s\S]*?)>}}` $rawContent 1 }} {{ if $scMatch }} {{ $paramStr := index $scMatch 0 }} {{/* 正则提取各个参数值 */}} {{ $name := replaceRE `.*name\s*=\s*"([^"]+)".*` "$1" $paramStr }} {{ $title := replaceRE `.*featuredTitle\s*=\s*"([^"]+)".*` "$1" $paramStr }} {{ $location := replaceRE `.*location\s*=\s*"([^"]+)".*` "$1" $paramStr }} {{ $alt := replaceRE `.*alt\s*=\s*"([^"]+)".*` "$1" $paramStr }} {{ $img := .Resources.GetMatch $name }} {{ if $img }} <image:image> <image:loc>{{ $img.Permalink }}</image:loc> <image:license>{{ $license }}</image:license> <image:geo_location>{{ $location }}</image:geo_location> <image:title>{{ $title }}</image:title> <image:caption>{{ $alt }}</image:caption> </image:image> {{ end }} {{ end }} {{ end }}
内容的提问来源于stack exchange,提问作者CelticParser
相关产品推荐
相关产品推荐

