Розробка кастомного шорткоду 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-контент. Кастомні шорткоди Hugo значно спрощують роботу з контентом. Це рішення для випадків, коли потрібно додати в статтю щось складніше за звичайний текст: попередження, таблицю порівняння, вставку відео з параметрами, інтерактивний блок. Автори контенту не торкаються HTML — вони використовують простий синтаксис. Кастомні шорткоди економлять години верстки і дозволяють одноманітно оформляти складні елементи на всьому сайті.

Ми — команда з 7+ роками досвіду роботи з Hugo та статичними генераторами, виконали понад 30 проектів з розробки шорткодів під ключ. Наші інженери гарантують сумісність з останніми версіями Hugo та оптимізацію під Core Web Vitals. Результат — продуктивні, гнучкі компоненти, які легко підтримувати. Вартість одного простого шорткоду — від $200.

Як створити кастомний шорткод в 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" | default "" }}

{{ $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 "Приклад використання шорткоду figure в Hugo" }}
{{ $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. Кастомні шорткоди кращі за готові плагіни в 5 разів за швидкістю завантаження. Ми тестуємо кожен шорткод в 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. Звертайтеся — допоможемо впровадити шорткоди, які прискорять контент-менеджмент і підвищать якість сайту.

Часті запитання

Що таке шорткод в Hugo?

Шорткод — це шаблон, який можна викликати з Markdown-контенту для вставки перевикористовуваних компонентів. Вони дозволяють авторам додавати складні елементи без знання HTML. Шорткоди обробляються під час збірки і вставляють готовий HTML.

Які бувають типи шорткодів?

Бувають прості (одинарні) та вкладені (містять інші шорткоди). Також розрізняють шорткоди з іменованими та позиційними параметрами. Вкладені шорткоди використовують .Parent для взаємодії.

Чи можна використовувати JavaScript в шорткодах?

Так, шорткоди можуть включати JavaScript для інтерактивності, наприклад, для вкладок або акордеону. Hugo не обмежує скрипти, але краще виносити їх в окремі файли для кешування.

Як налагоджувати шорткоди Hugo?

Використовуйте вбудовану змінну hugo.IsServer для виведення налагоджувальної інформації, а також перевіряйте параметри через jsonify. Ви можете тимчасово виводити значення в HTML-коментарях.

Скільки часу займає розробка шорткоду?

Один простий шорткод займає від 2 до 4 годин. Складні набори з 5–10 шорткодів із загальною стилізацією — від 2 до 5 днів. Терміни уточнюються після аналізу завдання.

Типи сайтів: технічне завдання, а не маркетинг

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

За нашими даними, до 40% проєктів переплачують на хостингу через неправильний вибір технології. Статичний сайт на CDN обходиться в 5 разів дешевше за WordPress на VPS за тих самих навантажень. Нижче розберемо чотири типи сайтів, їхні типові технічні помилки та рішення, які ми застосовуємо на практиці. Маємо 8 років досвіду та понад 120 успішних проєктів у різних нішах.

Як обрати правильний тип сайту?

Вибір визначає стек, інфраструктуру та бюджет на підтримку. Покрокова інструкція:

  1. Визначте мету: продаж (лендинг), інформування (корпоративний) чи швидкий контакт (візитка).
  2. Оцініть частоту оновлення контенту: щодня — потрібна CMS, раз на місяць — вистачить Markdown у Git.
  3. Виберіть стек за продуктивністю: статика для візиток, Next.js з ISR для корпоративних, GSAP для промо.

Як не помилитися з вибором CMS?

Якщо редактори нетехнічні — WordPress з Gutenberg або ACF Pro закриває потреби. Для складних структур — headless CMS (Strapi, Directus) з фронтендом на Next.js. Якщо оновлення рідкі — Markdown в Git з Astro або Next.js, деплой по push в main. Ми використовуємо Repository pattern для уникнення N+1 запитів при роботі з ORM.

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

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

Занадто важкий стек. WordPress з 15 плагінами для 5 сторінок дає TTFB 800ms на shared хостингу. Ми пропонуємо статику: HTML/CSS/JS або Next.js з output: 'export', задеплоєне на Vercel або Cloudflare Pages. Жодного PHP, жодної бази даних — тільки CDN. TTFB < 50ms гарантовано. Економія на хостингу — до 70% на місяць.

Немає контактної форми з backend-валідацією. Форма лише з JS-валідацією — це декорація. Ми додаємо серверлесс endpoint (Netlify Functions або AWS Lambda) з rate-limiter та сповіщеннями.

Відсутність Schema.org розмітки. Google Knowledge Panel будується на LocalBusiness або Organization. Ми вбудовуємо розмітку в шаблон: адреса, телефон, години роботи.

Термін розробки: 2–3 тижні з дизайном.

Чому швидкість лендингу безпосередньо впливає на конверсію?

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

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

A/B тестування — стандартна практика. Після закриття Google Optimize використовуємо open-source Growthbook або PostHog. Для Next.js застосовуємо edge middleware для розподілу трафіку на CDN без додаткового JS.

Термін: 2–4 тижні.

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

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

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

Продуктивність: сторінка "Про компанію" з 40 фото в оригіналі — LCP 12 секунд на мобільному. <Image> компонент Next.js з WebP і srcset вирішує без ручної роботи, знижуючи LCP до 2 секунд.

Багатомовність: Astrotomic Translatable на Laravel або next-intl. Структура URL — /uk/about, /en/about з hreflang.

Термін: 6–12 тижнів залежно від обсягу.

Промо-сайт

Промо — тимчасовий або постійний сайт під кампанію. Нестандартний дизайн, анімації. Стек: GSAP, Framer Motion, Three.js, Lottie.

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

prefers-reduced-motion — обов’язковий для accessibility.

Термін: 3–6 тижнів.

Як ми оптимізуємо продуктивність?

Для кожного проєкту проводимо аудит початкового стеку: аналізуємо TTFB, LCP, CLS, INP через Lighthouse та WebPageTest. Використовуємо tree-shake та bundle splitting для зменшення JS-бандла, для Next.js — React Server Components і Suspense для стрімінгу. Серверлесс функції дозволяють уникнути постійної вартості сервера — платите тільки за запити. Наприклад, корпоративний сайт на Next.js + Strapi дає TTFB <200ms, що у 5 разів менше ніж аналог на WordPress.

Автоматично конвертуємо зображення в WebP/AVIF, генеруємо srcset для всіх роздільних здатностей, використовуємо lazy loading з Intersection Observer. Для фонових зображень — техніка progressive loading.

Порівняльна таблиця

Параметр Візитка Корпоративний Лендинг Промо
Сторінок 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 місяці (безкоштовні правки)

Друга таблиця: порівняння підходів за продуктивністю

Підхід TTFB (мс) Складність підтримки Вартість розробки
Static HTML/CSS <50 Низька Низька
Next.js + headless CMS <200 Середня Середня
WordPress + плагіни 500–1500 Висока Висока

Статичний сайт швидший за WordPress у 10 разів за TTFB. Для консультації щодо вибору типу сайту та стеку зв'яжіться з нашими інженерами. Замовте розробку під ключ — ми оцінимо терміни та бюджет за 1 день. Напишіть нам, щоб отримати безкоштовний технічний аудит вашого проекту. Отримайте індивідуальну пропозицію з гарантією якості.