Чому ми Послуги Портфоліо Блог Технології Процес розробки Розпочати проєкт →
UA EN RU
← Всі статті
Розробка · 16.05.2019 · 13 хв читання

Приклад технічного завдання на інтернет-магазин. Частина 3

Третя частина типового ТЗ на інтернет-магазин: макети всіх ключових сторінок і повний блок SEO-вимог — від структури URL і 301-редиректів до robots.txt і мікророзмітки.
Приклад технічного завдання на інтернет-магазин. Частина 3

Розробка сайтів і подальша технічна підтримка — наша основна спеціалізація, тому нас регулярно просять порахувати вартість проєкту без технічного завдання або просто показати, як таке завдання має виглядати. Саме тому ми зібрали й виклали у відкритий доступ типовий приклад повноформатного ТЗ на створення інтернет-магазину електроніки та побутової техніки. Це третя частина документа: макети сторінок і повний блок SEO-вимог. На його основі клієнти можуть складати власні завдання під свої проєкти.

Макети сторінок

Повноформатне технічне завдання обов'язково містить макети — щоб і замовник, і команда розробки однаково розуміли, що саме буде на екрані. У цьому прикладі описані макети тринадцяти ключових сторінок магазину.

  • Головна сторінка
  • Сторінка каталогу
  • Детальна сторінка товару
  • Порівняння товарів
  • Кошик
  • Оформлення замовлення, крок №1
  • Оформлення замовлення, крок №2
  • Оформлення замовлення, крок №3
  • Особистий розділ «Дані покупця»
  • Історія замовлень
  • Особистий розділ «Список бажань»
  • Особистий розділ «Лист очікування»
  • Сторінка «Результати пошуку»
Макет головної сторінки інтернет-магазину з технічного завдання
Головна сторінка
Макет сторінки каталогу з фільтрами та списком товарів
Сторінка каталогу
Макет детальної сторінки товару інтернет-магазину
Детальна сторінка товару

Адреси сторінок (URL) і структура сайту

Дублювання URL

  • Кожній сторінці сайту — статичній чи згенерованій динамічно — присвоїти лише одну унікальну адресу.
  • Кожен товар зробити доступним тільки за однією адресою, навіть якщо його віднесли одразу до кількох категорій товарів.
  • Фільтри мають давати один кінцевий URL незалежно від послідовності, у якій їх обирав користувач.

Вимоги до формату URL

За можливості нову структуру адрес рекомендуємо реалізувати за таким принципом.

Тип сторінкиФормат URL
Головна[домен].[доменна зона]/
Портальна сторінка (Смартфони і телефони — якщо в асортименті з'являться стаціонарні та інші види телефонів)[домен].[доменна зона]/[портальна сторінка]/
Розділ (Смартфони та аксесуари)[домен].[доменна зона]/[розділ]
Категорія (Смартфони)[домен].[доменна зона]/[розділ або портальна сторінка]/[категорія]/
Фільтр (Android)[домен].[доменна зона]/[категорія]/[фільтр]/
Картка товару (Смартфон LG D325 L70 Dual Black)[домен].[доменна зона]/[категорія]/[картка товару].html
Інформаційні сторінки (Про магазин)[домен].[доменна зона]/[інформаційна сторінка].html

Відповідно до структури варто створити кілька портальних сторінок — зокрема ті, на які стоятимуть посилання в мегаменю. Якщо на сайті є пошук або складна фільтрація за параметрами, у адресі допускається використовувати символи ? і = не більше одного разу. Усі інші нелітерні та нецифрові символи, а також пробіл, крім -, _ і # (для переходу всередині сторінки), не використовувати.

URL сторінок оформлення замовлення

Адреси кошика, форми замовлення та сторінки підтвердження замовлення («дякуємо за замовлення») мають бути статичними й незмінними для всіх користувачів і для купівлі будь-якого товару. Ідентифікатори замовлення та відвідувача в URL передавати не можна.

Важливо. Якщо на новому сайті адреси змінюються, потрібно налаштувати посторінковий 301-редирект зі старих URL на нові — інакше проєкт втратить трафік і позиції.

Швидкість завантаження та редиректи

Для стабільної та швидкої індексації час віддачі HTML-коду сторінки має бути не більший за 200–300 мс, а повне завантаження сторінки — не довше за 2–3 секунди. Рекомендації з оптимізації зібрані в довіднику Google PageSpeed.

200–300 мс
віддача HTML-коду сторінки
2–3 с
повне завантаження сторінки
50 000
максимум URL в одному файлі карти сайту
10 МБ
граничний розмір одного файла карти
3–5
товарів у блоках перелінкування
100
максимум посилань на сторінці HTML-карти

Якщо вимоги не виконуються, у роботу йде стандартний перелік заходів.

  • Налаштувати кешування сайту.
  • Оптимізувати код генерації сторінок.
  • Змінити хостинг на продуктивніший: наприклад, із віртуального перейти на VDS або Dedicated.
  • Оптимізувати розміри картинок, js- і css-файлів.
  • Об'єднати безліч js-файлів в один.
  • Об'єднати безліч css-файлів в один.
  • Використовувати CDN для статичного контенту.
  • Додати заголовки Expires для зображень, css, js та іншого статичного вмісту.

301-редирект

На сайті мають бути налаштовані правила переадресації 301. Кожна сторінка має лише одну доступну користувачеві й пошуковій системі адресу, а всі інші її варіації, які автоматично генерує CMS, перенаправляються на основну адресу описаного вище формату. Сайт повинен мати один основний домен: якщо до нього прикріплені інші, з них також ставимо 301-редиректи. У кожного сайту є щонайменше одне дзеркало з www.

У файлі .htaccess це робиться зв'язкою RewriteEngine On, набору умов RewriteCond за значенням HTTP_HOST для кожного дзеркала та підсумкового правила RewriteRule з прапорцями [R=301,L], яке переадресовує всі сторінки дзеркал на основний домен.

  • Дублі зі слешем. Зробити редирект з адреси без слеша на адресу зі слешем — наприклад, з /catalog/smartphones на /catalog/smartphones/. Водночас перевірити, щоб для сторінок із розширенням (скажімо, /goods/smartphones/asus-zenfone-5-a501cg-16gb-charcoal-black-16gb.html) редиректу на варіант зі слешем у кінці не було.
  • Дублі головної сторінки. Виключити адреси /index.php та /index.html, перенаправивши їх 301-м на корінь сайту.
  • Множинні слеші. Адресу на кшталт /catalog/////smartphones/ звести до /catalog/smartphones/ одним редиректом.
  • Перша сторінка пагінації. Для категорій і розділів адресу /catalog/smartphones/page1/ перенаправити на /catalog/smartphones/.

Якщо вхідною точкою CMS є скрипт index.php, щоб уникнути циклічного перенаправлення, зручніше зробити редирект на рівні PHP: прочитати REQUEST_URI, знайти в ньому index.php, віддати заголовок 301 і Location уже без цього фрагмента. Такий код заодно оброблятиме й внутрішні сторінки: /category/index.php перетвориться на /category/. Так само варто чинити з множинними слешами: більшість готових прикладів для .htaccess обробляють цю ситуацію неправильно й прибирають зайві слеші цілим ланцюжком редиректів, тоді як регулярний вираз у точці входу (шаблон #/{2,}# і заміна на один слеш) робить це за один крок.

Неіснуючі URL і сторінка 404

Будь-яка неіснуюча сторінка сайту має показувати сторінку 404 і віддавати код 404. Для перевірки варто внести помилки в різні частини адреси й для різних модулів сайту — їх можуть обробляти зовсім різні механізми.

  • Помилка в назві інформаційної сторінки: /cXntacts
  • Помилка в назві товару: /catalog/obXect1.html
  • Помилка в назві розділу каталогу: /cXtalog/object1.html
  • Помилка всередині стороннього модуля: /other-module/itXm.html
  • Вихід за межі пагінації: якщо в каталозі 10 сторінок, підставте 11 — має віддаватися 404, а не порожня сторінка /catalog/11

Технічно сторінка 404 повинна мати одну постійну адресу — наприклад, /404.html. Якщо користувач потрапляє на /catalog/smartphones/error-page1515, робимо 301-редирект на /catalog/smartphones/404.html. Коли в панелі для вебмайстрів з'являються помилки 404, треба відстежувати, на які саме адреси вони ведуть, і створювати для них правила перенаправлення.

Унікальний контент і шаблони метаданих

На сторінках розділів, категорій товарів, брендів усередині категорій, а також на сторінках фільтрів потрібно впровадити можливість розміщувати унікальні оптимізовані тексти й метадані: оптимізований текст у категорії під списком елементів, заголовок сторінки першого рівня (на будь-якій сторінці такий елемент має бути лише один), а також title, description і решту службових тегів.

Шаблонні метадані

Окремо реалізуємо шаблонні оптимізовані метадані — на всіх сторінках сайту. Це набір шаблонів: для різних груп сторінок застосовуються різні, а всередину залежно від вмісту сторінки підставляються значення змінних.

  • Розділ — Смартфони та аксесуари
  • Категорія товару — Смартфони
  • Бренд — Смартфони Samsung
  • Фільтри або набори фільтрів — Смартфон Samsung білий
  • Назва моделі — Смартфон Samsung Galaxy S6 32Gb White Pearl; у великій кількості категорій ця змінна має бути сумою змінних {категорія товару} {бренд товару} {назва товару}

Приклад шаблону для категорій. Title: [Назва категорії]. Купити [назва категорії в однині, родовий відмінок] в інтернет-магазині, найкраща ціна в Азербайджані. Meta name="Title": [Назва категорії]. [Назва категорії в однині] за найкращою ціною в Баку. Description: [Назва категорії] в інтернет-магазині. Хочете купити в Баку [назва категорії в однині, родовий відмінок] за низькою ціною з доставкою по Азербайджану?

Підставивши змінні, отримуємо: «Планшети. Купити планшет в інтернет-магазині, найкраща ціна в Азербайджані» або «Кавоварки. Купити кавоварку в інтернет-магазині, найкраща ціна в Азербайджані» — і відповідні description із назвою магазину Integralplus.

За тим самим принципом будуються шаблони для зв'язок категорія + бренд, категорія + фільтр і категорія + два фільтри: у заголовок і опис додатково підставляються назва бренду або параметри фільтра. Для сторінок пагінації до базових title, meta title і description додається «Сторінка №2», «Сторінка №3» і так далі.

Суть. Задаючи шаблон, передбачте відмінювання змінних за відмінком і числом — наприклад, у вигляді [brand_name:`ОДН`,`РОД`], де ОДН — однина, а РОД — родовий відмінок. Для сайтів на PHP для цього підходить бібліотека phpMorphy.

Заголовки та дублювання контенту

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

Усі тексти й метадані на сайті мають існувати в єдиному екземплярі. Перевіряємо та прибираємо дублювання в чотирьох типових місцях.

Пагінація

Текст і метадані, розмічені на першій сторінці каталогу, дублюються на всіх сторінках пагінації.

Рівень вкладеності n+1

Унікальний текст і метадані зі сторінки розділу переносяться на підрозділи та сторінки брендів усередині категорій.

Фільтрація

Текст і метадані категорії не повинні потрапляти на сторінку результату фільтрації.

Альтернативне відображення

Каталог, показаний більш ніж в одному вигляді зі зміною URL — списком і сіткою зображень, — створює пари сторінок-близнюків.

Важливо. Сторінки сортування, поєднання однотипних фільтрів, поєднання більш ніж двох фільтрів, два фільтри одного параметра й альтернативне відображення каталогу закриваємо від індексації мета-тегом та/або директивою disallow у robots.txt.

Пагінація, robots.txt і карти сайту

Атрибути rel=next і rel=prev

Для категорій товарів зі сторінками пагінації впроваджуємо генерацію метаданих rel=next і rel=prev — за рекомендаціями Google. Логіка проста.

  1. Перша сторінка. Містить лише rel=«next» — посилання на наступну сторінку пагінації.
  2. Сторінки з другої до передостанньої. Містять і rel=«next», і rel=«prev».
  3. Остання сторінка. Містить лише rel=«prev».

Значення href можуть бути відносними або абсолютними адресами; якщо в документі оголошено base, відносні шляхи рахуватимуться від базового URL. Як альтернативу дозволено використовувати значення rel=«previous». За неправильної розмітки Google продовжить індексувати контент власною евристикою, не спираючись на вказаний rel. Що це дає: передачу ваги природних посилань із внутрішніх сторінок пагінації на просувану першу сторінку.

Файл правил індексування robots.txt

Сайт має містити файл robots.txt за адресою /robots.txt. Директива Host вказує основний домен сайту, директива Sitemap — розташування карти сайту. Директивами Disallow закриваємо службові й сміттєві розділи.

  • Результати пошуку по сайту — наприклад, Disallow: /search?q=*
  • Кошик і форму замовлення
  • Результати сортування в категоріях
  • Альтернативне відображення каталогу (наприклад, списком)
  • Сторінки зі специфічними GET-параметрами
  • Адміністративну частину сайту та інші службові сторінки, доступні пошуковому роботу

Кожну директиву Disallow бажано супроводити коментарем — скажімо, «Disallow: /admin — забороняє індексувати адмінпанель» або «Disallow: /*filter=* — сторінки фільтрів».

Карта сайту у форматі .xml

За адресою /sitemap.xml має лежати карта у форматі .xml — за специфікацією sitemaps.org. Для великих карт, які генеруються довше ніж 200 мс, робимо скрипт оновлення й ставимо його в cron раз на добу або оновлюємо за зміною контенту; невеликі карти можна віддавати на льоту.

У файлі вказуємо всі просувані та інформативно корисні сторінки проєкту: головну, сторінки розділів, категорій товарів, брендів усередині категорій, сторінки моделей та інформативні сторінки на кшталт контактів і «Про магазин». Для кожної сторінки обов'язкові адреса, частота зміни й пріоритет сканування.

Тип сторінкиchangefreqpriority
Головна сторінкаalways1
Розділи, категорії товарів, бренди в категоріяхdaily0.8
Сторінки моделейweekly0.6
Інформативні сторінкиmonthly0.4

Якщо у файлі буде більше ніж 50 000 адрес, карту треба розбити на окремі файли, кожен з яких не перевищує 10 МБ. Тоді кореневий sitemap.xml міститиме перелік решти файлів — sitemap_1.xml, sitemap_2.xml і так далі.

Карта сайту у форматі .html

Окремо створюємо карту сайту у форматі HTML і ставимо наскрізне посилання на неї з усіх сторінок сайту. Карта має включати всі сторінки й бути багаторівневою — не більше ніж 100 посилань на одній сторінці. На останню сторінку карти додаємо мета-тег, який закриває її від подальшого обходу.

SEO-елементи: перелінкування та мікророзмітка

Блочне перелінкування

На сторінці товару виводимо два блоки: «Схожі товари» — товари з тієї самої категорії, і «З цим товаром купують» — товари, які замовляли в одному замовленні з поточним. Блоки містять 3–5 товарів залежно від дизайну й компонування сайту; кожен елемент — це зображення, назва посиланням і ціна. Категорії товарів і розділи також повинні містити блоки «Новинки» та «Популярні товари».

Розширені описи та семантична розмітка

Щоб у пошуковій видачі показувалися розширені сніппети, на сторінку товару додаємо розмітку відгуків і розмітку товарів, а на всі сторінки сайту — розмітку навігації. Ми рекомендуємо саме метод schema.org: більшість сайтів, у яких розширені описи справді відображаються, використовують його.

Мікроформати офіційно не підтримуються на території України. Вони перебувають у режимі бета-тестування й поводяться непередбачувано — можуть з'являтися та зникати в різний час або відображатися лише на певних сторінках сайту.Із тексту технічного завдання
Увага. Стовідсоткової гарантії того, що розширені описи відображатимуться, немає — це рекомендація пошукових систем, а не зобов'язання.

Хлібні крихти

На всіх сторінках сайту виводимо блок хлібних крихт (breadcrumbs) і розташовуємо його над заголовком сторінки. Вміст блоку — шлях до поточної сторінки, починаючи від головної й закінчуючи поточною, причому поточна вже без посилання. У самому коді блоку одразу закладаємо мікророзмітку — деталі описані в довідці Google про навігаційні ланцюжки.

Зображення, вихідні посилання та інформаційна частина

Атрибути alt і title зображень

Для всіх зображень на сайті прописуємо атрибути alt і title. Для зображень товарів alt повністю дублює назву товару, а title формується за шаблоном [назва товару] + [додаткове слово]. Перелік додаткових слів: купити, ціна, продаж, опис, фото, замовити, придбати, ціни. Для логотипа сайту прописуємо title картинки «інтернет-магазин Integralplus.az».

Вихідні посилання

Усі вихідні посилання на сайті мають бути закриті від індексації пошуковими системами. Крім того, рекомендуємо технічно реалізувати можливість автоматично закривати як усі наявні посилання, так і ті, що з'являться пізніше.

Інформаційна частина проєкту

Створюємо інформаційні розділи «Новини», «Огляди» та «Статті» й додаємо посилання на них у навігацію сайту. Анонси матеріалів із цих розділів мають виводитися в спеціальних блоках на головній сторінці, у розділі, у категорії товару та на сторінці бренду всередині категорії — з прямими посиланнями на повні версії матеріалів.

На сторінці категорії товарів виводимо блок з анонсами прив'язаних інформаційних розділів. Наприклад, анонси новин про смартфони мають показуватися лише в розділі «Смартфони», а новини про смартфони Apple — тільки на сторінці бренду «Смартфони Apple».

Коди відстеження

Окремим пунктом технічного завдання йде перенесення кодів аналітики: Google Analytics, код електронної комерції та Google Tag Manager. Це та частина, про яку найчастіше згадують уже після запуску — і втрачають історію даних, тому фіксуємо її в ТЗ заздалегідь.