Разработка кастомного шорткода Hugo: от идеи до production

Наша компания занимается разработкой, поддержкой и обслуживанием сайтов любой сложности. От простых одностраничных сайтов до масштабных кластерных систем построенных на микро сервисах. Опыт разработчиков подтвержден сертификатами от вендоров.

Разработка и обслуживание любых видов сайтов:

Информационные сайты или веб-приложения
Сайты визитки, landing page, корпоративные сайты, онлайн каталоги, квиз, промо-сайты, блоги, новостные ресурсы, информационные порталы, форумы, агрегаторы
Сайты или веб-приложения электронной коммерции
Интернет-магазины, B2B-порталы, маркетплейсы, онлайн-обменники, кэшбэк-сайты, биржи, дропшиппинг-платформы, парсеры товаров
Веб-приложения для управления бизнес-процессами
CRM-системы, ERP-системы, корпоративные порталы, системы управления производством, парсеры информации
Сайты или веб-приложения электронных услуг
Доски объявлений, онлайн-школы, онлайн-кинотеатры, конструкторы сайтов, порталы предоставления электронных услуг, видеохостинги, тематические порталы

Это лишь некоторые из технических типов сайтов, с которыми мы работаем, и каждый из них может иметь свои специфические особенности и функциональность, а также быть адаптированным под конкретные потребности и цели клиента

Услуги, которые мы предлагаем
Показано 1 из 1Все 2062 услуг
Разработка кастомного шорткода Hugo: от идеи до production
Простой
~1 день
Часто задаваемые вопросы

Наши компетенции:

Этапы разработки

Последние работы

  • image_website-b2b-advance_0.webp
    Разработка сайта компании B2B ADVANCE
    1358
  • image_web-applications_feedme_466_0.webp
    Разработка веб-приложения для компании FEEDME
    1250
  • image_websites_belfingroup_462_0.webp
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    956
  • image_ecommerce_furnoro_435_0.webp
    Разработка интернет магазина для компании FURNORO
    1188
  • image_crm_enviok_479_0.webp
    Разработка веб-приложения для компании Enviok
    929
  • image_bitrix-bitrix-24-1c_fixper_448_0.webp
    Разработка веб-сайта для компании ФИКСПЕР
    947

Разработка кастомного шорткода 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, вложенные шаблоны

Процесс работы над шорткодами

Мы подходим к разработке системно:

  1. Аналитика — изучаем типовые сценарии использования, собираем требования к компонентам.
  2. Проектирование — определяем API шорткодов (параметры, поведение, вложенность).
  3. Реализация — пишем шаблоны на Go-шаблонизаторе Hugo, интегрируем CSS/JS.
  4. Тестирование — проверяем на крайних кейсах (пустые параметры, длинный контент, вложенность).
  5. Деплой и документация — развёртываем на сервере или CI, описываем использование.

Что входит в разработку под ключ

В результате вы получаете:

  • Исходный код шорткодов с комментариями.
  • Готовые стили и скрипты для интеграции.
  • Документацию по каждому шорткоду с примерами.
  • Адаптацию под существующую тему (если требуется).
  • Возможность лёгкого расширения в будущем.

Сроки разработки

Сроки зависят от сложности:

  • Один простой шорткод (callout, badge) — 2–4 часа.
  • Набор из 5–10 шорткодов с общей стилизацией — 2–3 дня.
  • Сложные связанные шорткоды (tabs, accordion, compare table) — 3–5 дней.

Сроки уточняются после анализа задачи. Оценим ваш проект бесплатно — напишите нам для консультации или закажите разработку шорткодов под ключ.

Наши инженеры гарантируют поддержку и обновление под новые версии Hugo. Обращайтесь — поможем внедрить шорткоды, которые ускорят контент-менеджмент и повысят качество сайта.

Выбор типа сайта — техническая задача, а не маркетинг

Мы видим, как команды тратят бюджет на неподходящий стек. Лендинг на Next.js со статической генерацией и корпоративный сайт с CMS — принципиально разные инфраструктуры, даже если внешне похожи. Ошибка на старте ведёт к переплате за хостинг в 5–10 раз и низкой скорости загрузки. Core Web Vitals (LCP, INP, TTFB) для каждого типа сайта — свой набор приоритетов.

Ниже разберём четыре типа сайтов, их типичные технические ошибки и как мы их исправляем.

Как не ошибиться с выбором CMS?

Сайт-визитка

Самый компактный формат: 1–5 страниц, минимум динамики. Основная задача — дать контактную информацию и создать первое впечатление. Технически здесь нет сложности, но есть типичные ошибки.

Слишком тяжёлый стек. WordPress с 15 плагинами для 5 страниц — это 800ms TTFB на shared хостинге. Мы предлагаем статику: HTML/CSS/JS или Next.js с output: 'export', задеплоенное на Vercel или Cloudflare Pages. Никакого PHP, никакой базы данных — только CDN. TTFB < 50ms гарантированно. Экономия на хостинге — до 50 000 ₽ в год.

Нет контактной формы с backend-валидацией. Форма только с JS-валидацией — это декорация. Бэкенд должен валидировать, rate-limit и отправлять уведомление. Для статического сайта используем Formspree или серверлесс endpoint.

Отсутствие Schema.org разметки. Google Knowledge Panel строится на разметке LocalBusiness или Organization — адрес, телефон, часы работы. Для визитки это критично. Мы делаем её встроенной в шаблон.

Срок разработки: 2–3 недели с дизайном.

Почему скорость лендинга напрямую влияет на конверсию?

Лендинг

Лендинг — страница с одной целью: конверсия. Всё, что не ведёт к целевому действию, лишнее. Core Web Vitals здесь критичны, потому что платный трафик, а Google использует CWV как фактор в Quality Score.

Конкретный кейс: лендинг с hero-видео 8MB autoplay в MP4 без preload="none" + три сторонних скрипта аналитики синхронно в <head>. LCP 9.4s, INP 780ms. Мы заменили видео на poster image с отложенной загрузкой по scroll, скрипты перевели на async/defer и частично в Web Workers через Partytown. LCP 1.8s, INP 140ms. Конверсия выросла на 23% — только за счёт скорости, не дизайна.

A/B тестирование — стандартная практика. Google Optimize закрылся, но есть Growthbook (open source), PostHog, VWO. Для Next.js используем edge middleware для распределения трафика на уровне CDN без лишнего JS.

Срок: 2–4 недели. Закажите разработку под ключ — мы оценим ваш проект за 1 день.

Корпоративный сайт

Корпоративный — это CMS, несколько разделов, мультиязычность, интеграция с CRM. Ключевой вопрос: кто будет редактировать контент и как часто.

Если редакторы нетехнические — нужен visual editor. WordPress с Gutenberg или ACF Pro закрывает это. Для сложных структур — headless CMS (Strapi, Directus) с фронтендом на Next.js. Если сайт обновляется редко — Markdown в Git с Astro или Next.js. Деплой по push в main — никакой CMS.

Производительность. Страница «О компании» с 40 фотографиями в оригинале — LCP 12 секунд на мобильном. <Image> компонент Next.js с WebP и srcset решает без ручной работы.

Мультиязычность: Astrotomic Translatable на Laravel или next-intl / react-i18next. Структура URL — /ru/about, /en/about с hreflang.

Срок: 6–12 недель в зависимости от объёма.

Промо-сайт

Промо — временный или постоянный сайт под кампанию. Нестандартный дизайн, анимации, интерактив. Стек: GSAP, Framer Motion, Three.js, Lottie, Canvas API.

Главная ловушка — анимации, тормозящие на мобильных. GPU-анимации через transform и opacity — нормально. box-shadow в анимации, filter: blur() на каждом кадре, анимация width/height — причина 20fps на iPhone 12. will-change: transform помогает точечно.

prefers-reduced-motion — обязателен для accessibility. Мы всегда добавляем.

Срок: 3–6 недель, зависит от сложности.

Сравнительная таблица

Параметр Визитка Корпоративный Лендинг Промо
Страниц 1–5 10–50+ 1–3 1–10
CMS Не нужна Нужна Не нужна Редко
SEO-приоритет Средний Высокий Высокий Низкий
Анимации Минимум Умеренно Умеренно Интенсивно
Срок (с дизайном) 2–3 нед 6–12 нед 2–4 нед 3–6 нед

Стоимость в каждом случае рассчитывается индивидуально после изучения технического задания. — Google рекомендует TTFB под 0.8s, у нас <0.2s.

Что входит в работу

  • Аналитика и прототипирование (структура, пользовательские сценарии)
  • Дизайн-концепция (адаптивный, mobile-first)
  • Вёрстка с оптимизацией LCP, CLS, INP
  • Выбор и настройка CMS (если нужна)
  • Интеграция с CRM/маркетинговыми инструментами
  • Тестирование (кроссбраузерное, load-testing)
  • Документация и передача доступов
  • Обучение редакторов (видео + письменно)
  • Гарантия 3 месяца (бесплатные правки)

Наша экспертиза

Мы на рынке 10+ лет, реализовали 200+ проектов — от простых визиток до высоконагруженных лендингов с миллионными аудиториями. Каждый проект проходит аудит на Core Web Vitals перед релизом.

Вторая таблица: сравнение подходов

Подход TTFB (мс) Сложность поддержки Стоимость разработки
Static HTML/CSS <50 Низкая Низкая (от 50 000 ₽)
Next.js + headless CMS <200 Средняя Средняя (от 150 000 ₽)
WordPress + плагины 500–1500 Высокая Высокая (от 300 000 ₽)
Подробнее об оптимизации изображений Мы автоматически конвертируем в WebP/AVIF, генерируем srcset для всех разрешений, используем lazy loading с Intersection Observer. Для фоновых изображений — техника progressive loading.

Свяжитесь с нами, чтобы получить консультацию по вашему проекту. Закажите разработку под ключ — мы оценим сроки и бюджет за 1 день.