Разработка кастомного шорткода Hugo
Шорткоды Hugo — механизм встраивания переиспользуемых компонентов непосредственно в Markdown-контент. Это решение для случаев, когда нужно добавить в статью что-то сложнее обычного текста: предупреждение, таблицу сравнения, вставку видео с параметрами, интерактивный блок. Авторы контента не трогают HTML — они используют простой синтаксис. Кастомные шорткоды экономят часы вёрстки и позволяют единообразно оформлять сложные элементы на всём сайте.
Мы — команда с 7+ годами опыта работы с Hugo и статическими генераторами, выполнили более 30 проектов по разработке шорткодов под ключ. Наши инженеры гарантируют совместимость с последними версиями Hugo и оптимизацию под Core Web Vitals. Результат — производительные, гибкие компоненты, которые легко поддерживать.
Как создать кастомный шорткод в Hugo?
Шорткод — это HTML-шаблон в папке layouts/shortcodes/. Имя файла становится именем шорткода. Доступны два синтаксиса вызова: {{< >}} для неэкранированного HTML и {{% %}} для Markdown-контента внутри. Параметры передаются именованно (.Get "param") или позиционно (.Get 0). Внутренний контент доступен через .Inner. Для вложенных шорткодов используется .Parent.
Примеры шорткодов
Callout/предупреждение
Простой шорткод для выделения блоков разного типа. Поддерживает типы info, warning, danger, success, tip. Код:
{{/* layouts/shortcodes/callout.html */}}
{{ $type := .Get "type" | default "info" }}
{{ $title := .Get "title" }}
{{ $icons := dict
"info" "ℹ️"
"warning" "⚠️"
"danger" "🚨"
"success" "✅"
"tip" "💡"
}}
<div class="callout callout--{{ $type }}">
<div class="callout__icon">{{ index $icons $type }}</div>
<div class="callout__body">
{{ with $title }}
<strong class="callout__title">{{ . }}</strong>
{{ end }}
<div class="callout__content">{{ .Inner | markdownify }}</div>
</div>
</div>
Использование:
{{</* callout type="warning" title="Важно" */>}}
Перед обновлением сделайте резервную копию базы данных.
{{</* /callout */>}}
Figure с позиционными параметрами
Шорткод для вставки изображений с поддержкой WebP, lazy loading и подписей. Код:
{{/* layouts/shortcodes/figure.html */}}
{{ $src := .Get 0 }}
{{ $alt := .Get 1 | default "" }}
{{ $caption := .Get 2 | default "" }}
{{ $width := .Get "width" | default "100%" }}
{{ $img := resources.Get $src }}
{{ if $img }}
{{ $webp := $img | images.Resize (printf "%s WebP" (default "1200x" (.Get "resize"))) }}
<figure class="article-figure" style="max-width: {{ $width }}">
<picture>
<source srcset="{{ $webp.Permalink }}" type="image/webp">
<img src="{{ $img.Permalink }}" alt="{{ $alt }}" loading="lazy">
</picture>
{{ with $caption }}
<figcaption>{{ . | markdownify }}</figcaption>
{{ end }}
</figure>
{{ else }}
<figure class="article-figure" style="max-width: {{ $width }}">
<img src="{{ $src }}" alt="{{ $alt }}" loading="lazy">
{{ with $caption }}<figcaption>{{ . | markdownify }}</figcaption>{{ end }}
</figure>
{{ end }}
Вкладки (tabs) с вложенными шорткодами
Сложный кейс: два шорткода, связанные через .Scratch. tabs оборачивает контейнер, tab — отдельная вкладка. Код:
{{/* layouts/shortcodes/tabs.html */}}
{{ .Scratch.Set "tabs" slice }}
{{ .Inner | markdownify }}
{{ $tabs := .Scratch.Get "tabs" }}
<div class="tabs" data-tabs>
<div class="tabs__nav" role="tablist">
{{ range $i, $tab := $tabs }}
<button
class="tabs__trigger{{ if eq $i 0 }} is-active{{ end }}"
role="tab"
aria-selected="{{ if eq $i 0 }}true{{ else }}false{{ end }}"
aria-controls="tab-panel-{{ $tab.id }}"
>{{ $tab.label }}</button>
{{ end }}
</div>
{{ range $i, $tab := $tabs }}
<div
id="tab-panel-{{ $tab.id }}"
class="tabs__panel{{ if not (eq $i 0) }} is-hidden{{ end }}"
role="tabpanel"
>{{ $tab.content | safeHTML }}</div>
{{ end }}
</div>
{{/* layouts/shortcodes/tab.html */}}
{{ $label := .Get "label" }}
{{ $id := $label | urlize }}
{{ $content := .Inner | markdownify }}
{{ $tabs := .Parent.Scratch.Get "tabs" }}
{{ $tabs = $tabs | append (dict "label" $label "id" $id "content" $content) }}
{{ .Parent.Scratch.Set "tabs" $tabs }}
Как шорткоды влияют на Core Web Vitals?
Кастомные шорткоды напрямую влияют на LCP, CLS и INP. Например, figure-шорткод с lazy loading и WebP снижает LCP на 30–40% по сравнению с обычным <img>. Callout-шорткоды с фиксированной высотой устраняют CLS. Tabs-шорткоды с отложенной загрузкой контента улучшают INP. Мы тестируем каждый шорткод в Lighthouse и реальных браузерах, чтобы гарантировать прохождение Core Web Vitals.
Как отлаживать шорткоды Hugo?
Используйте встроенную переменную hugo.IsServer для вывода отладочной информации. Например, внутри шаблона можно добавить {{ if hugo.IsServer }}<pre>{{ . | jsonify }}</pre>{{ end }} — это покажет все параметры. Также работает временный вывод в HTML-комментарии: <!-- {{ .Get "param" }} -->. Для сложных кейсов используйте partial с выводом дампа.
Почему кастомные шорткоды выгоднее готовых решений?
Готовые плагины часто перегружены лишними функциями, тормозят сборку и сложно кастомизируются. Кастомные шорткоды легче в 5 раз, не содержат мёртвого кода и полностью контролируются вами. Они быстрее загружаются и лучше проходят Core Web Vitals. Например, замена готового плагина кастомным шорткодом снижает LCP на 30–40% и экономит 20–30% времени контент-менеджеров.
Таблица сравнения типов шорткодов
| Тип | Пример | Параметры | Вложенность |
|---|---|---|---|
| Простой | {{</* callout type="info" */>}} |
Именованные | Нет |
| Вложенный | {{</* tabs */>}}...{{</* /tabs */>}} |
Именованные + .Inner |
Да, через .Parent |
| Позиционный | {{</* figure "src.jpg" "Alt" */>}} |
Позиционные | Нет |
Детальный синтаксис параметров
Именованные параметры: {{</* shortcode param="value" */>}} — доступны через .Get "param". Позиционные: {{</* shortcode "value1" "value2" */>}} — доступны через .Get 0, .Get 1. Если параметр не передан, можно задать значение по умолчанию: {{ $val := .Get "param" | default "default" }}.
Сравнение шорткодов по сложности и времени разработки
| Тип шорткода | Время разработки | Необходимые навыки |
|---|---|---|
| Простой (callout, badge) | 2–4 часа | Базовые HTML/CSS |
| Средний (figure, video) | 4–8 часов | HTML, обработка ресурсов Hugo |
| Сложный (tabs, accordion) | 1–2 дня | JavaScript, вложенные шаблоны |
Процесс работы над шорткодами
Мы подходим к разработке системно:
- Аналитика — изучаем типовые сценарии использования, собираем требования к компонентам.
- Проектирование — определяем API шорткодов (параметры, поведение, вложенность).
- Реализация — пишем шаблоны на Go-шаблонизаторе Hugo, интегрируем CSS/JS.
- Тестирование — проверяем на крайних кейсах (пустые параметры, длинный контент, вложенность).
- Деплой и документация — развёртываем на сервере или CI, описываем использование.
Что входит в разработку под ключ
В результате вы получаете:
- Исходный код шорткодов с комментариями.
- Готовые стили и скрипты для интеграции.
- Документацию по каждому шорткоду с примерами.
- Адаптацию под существующую тему (если требуется).
- Возможность лёгкого расширения в будущем.
Сроки разработки
Сроки зависят от сложности:
- Один простой шорткод (callout, badge) — 2–4 часа.
- Набор из 5–10 шорткодов с общей стилизацией — 2–3 дня.
- Сложные связанные шорткоды (tabs, accordion, compare table) — 3–5 дней.
Сроки уточняются после анализа задачи. Оценим ваш проект бесплатно — напишите нам для консультации или закажите разработку шорткодов под ключ.
Наши инженеры гарантируют поддержку и обновление под новые версии Hugo. Обращайтесь — поможем внедрить шорткоды, которые ускорят контент-менеджмент и повысят качество сайта.







