
Ошибки в HTML-коде почти всегда выглядят страшнее, чем есть: валидатор W3C выдаёт 340 замечаний, клиент хватается за голову, а реальную пользу приносит исправление шести строк из этих трёхсот сорока. Остальное — шум, который никак не отражается ни на индексации, ни на позициях, ни на поведении посетителя. Умение отделить шесть строк от трёхсот тридцати четырёх экономит недели работы программиста и бюджет, который лучше потратить на контент и ссылки.
Почему валидатор пугает цифрами, а поиск на них не реагирует
Валидатор сверяет документ со спецификацией консорциума W3C. Спецификация описывает идеальный документ, а не документ, который поисковая система способна прочитать. Это разные задачи. Поисковый робот использует тот же принцип, что и браузер: встретив кривую разметку, он не отбрасывает страницу, а достраивает недостающее по правилам восстановления ошибок. Эти правила прописаны в стандарте HTML отдельным разделом — то есть спецификация сама описывает, как обрабатывать невалидный код.
Ни Яндекс, ни Google никогда не заявляли валидность фактором ранжирования. Джон Мюллер из Google повторял это неоднократно: валидность полезна для поддержки кода, но не входит в алгоритм. Практика подтверждает: я регулярно прогоняю через валидатор сайты из топ-3 по коммерческим запросам, и чистых среди них практически нет. Типичная картина для лидера выдачи — от 20 до 200 замечаний. Полностью валидными оказываются разве что аскетичные документации и лендинги на голом HTML без единого стороннего скрипта.
Вывод из этого не «код не важен». Вывод другой: важна не формальная валидность, а работоспособность. Ошибка значима тогда, когда из-за неё браузер или робот строит не то дерево документа, которое задумал разработчик. Всё остальное — гигиена.
Что робот на самом деле делает с вашим кодом
Робот получает исходный HTML, разбирает его в дерево элементов (DOM), для JavaScript-сайтов дополнительно выполняет скрипты и получает второе, финальное дерево. Дальше он извлекает текст, ссылки, заголовки, разметку. На каждом из этих шагов кривой код способен изменить результат.
- На разборе — незакрытый или неправильно вложенный тег выкидывает часть текста за пределы того контейнера, где он должен быть.
- На выполнении скриптов — дубли идентификаторов и синтаксические ошибки ломают виджет, который подгружал контент.
- На извлечении — ссылка внутри ссылки, текст в атрибутах, отсутствие alt лишают робота части сигналов.
- Мультиязычный сайт на WordPress: hreflang, поддомены и типичные ошибки
- Ошибки JavaScript: когда сломанный скрипт съедает заявки молча
Проверить, что видит робот, проще всего так: отключите в браузере JavaScript и CSS и посмотрите на голый документ. Всё, что исчезло или встало в неправильном порядке, — кандидат на разбор. Второй способ — сохранить страницу через curl или wget и прочитать её текстовым редактором. Третий — инструменты вебмастера: в Яндексе есть просмотр страницы глазами робота, в Google Search Console — проверка URL с отрисованным HTML и скриншотом.
Незакрытые и неправильно вложенные теги
Это единственная категория ошибок, которая гарантированно бьёт по продвижению. Механика простая. Браузер и робот пытаются починить документ, но чинят по своим правилам, а не по вашей задумке.
Классический пример — незакрытый div внутри тела статьи. Всё, что идёт после него, формально остаётся внутри этого блока. Если у блока стоит ограничение по высоте с обрезкой или он находится в свёрнутом состоянии, половина текста пропадёт из видимой части. Робот текст найдёт, но оценит его как скрытый, а посетитель просто не увидит.
<div class="card">
<p>Первый абзац</p>
<p>Второй абзац — он уже должен быть вне карточки</p>
<p>Третий абзац</p>
Второй частый случай — таблица, в которую попал текст в обход ячеек. По правилам восстановления браузер выбрасывает такой текст перед таблицей. Порядок содержимого меняется, смысловые блоки перемешиваются.
<table>
Заголовок раздела
<tr><td>Ячейка</td></tr>
</table>
Третий — блочный элемент внутри строчного там, где это запрещено, чаще всего div внутри p. Абзац принудительно закрывается перед блоком, и оформление рассыпается. На страницах WordPress это регулярно происходит после автоматической расстановки абзацев.
Как ловить: валидатор ищет по ключевым словам «Unclosed element», «End tag … seen, but there were open elements», «not allowed as child of element». Только эти три формулировки уже покрывают большинство действительно опасных случаев.
Несколько H1 на странице или полное отсутствие заголовка
Заголовок первого уровня — это не украшение, а объявление темы документа. Ситуаций с проблемами три.
- H1 отсутствует. Робот вынужден угадывать тему по title и первому абзацу. Сигнал слабеет. Особенно часто встречается на страницах категорий интернет-магазинов, где дизайнер убрал заголовок ради красоты.
- H1 несколько. Обычно причина техническая: в H1 завёрнут логотип в шапке, а второй H1 стоит над контентом. Формально спецификация HTML5 это разрешает внутри секционных элементов, но на практике я всегда свожу к одному — тема страницы должна быть одна.
- H1 не тот. Заголовок есть, но в нём стоит название компании или слово «Каталог» вместо запроса. Это уже не ошибка кода, а ошибка оптимизации, но чинится в том же месте.
- Мультиязычный сайт на WordPress: hreflang, поддомены и типичные ошибки
- Ошибки JavaScript: когда сломанный скрипт съедает заявки молча
Иерархия остальных заголовков важна меньше, но не безразлична. Прыжок с H2 сразу на H4, H3 без родительского H2, заголовки, использованные ради размера шрифта, — всё это мешает роботу построить оглавление документа и ухудшает работу скринридеров. Правило простое: уровни идут по порядку, ни один не пропускается вниз, наверх подниматься можно свободно.
Ссылка внутри ссылки и другие запрещённые вложения
Вложить a внутрь a нельзя. Браузер разорвёт конструкцию, и вместо одной ссылки получится две-три соседние, часть из которых будет вести не туда, куда вы рассчитывали. На карточках товаров это встречается постоянно: вся карточка обёрнута в ссылку, а внутри стоит отдельная ссылка на бренд или кнопка «В избранное».
Если нужны детали, смотрите «Создание сайта на чистом html коде».
<a href="/tovar/">
<h3>Название</h3>
<a href="/brand/">Бренд</a>
</a>
Результат в дереве документа: первая ссылка закрывается перед второй, текст после неё оказывается вне всех ссылок. Анкор размывается, часть карточки перестаёт кликаться. Правильное решение — не вкладывать, а разложить рядом и растянуть основную ссылку псевдоэлементом через CSS.
К той же категории относятся: кнопка внутри ссылки, форма внутри формы, интерактивный элемент внутри другого интерактивного элемента. Все они дают непредсказуемое дерево и ломают клики на мобильных.
Текст в атрибутах вместо содержимого
Отдельный жанр — когда разработчик кладёт видимый текст в атрибут, а на экран выводит его скриптом или через CSS. Выглядит это так:
<span class="price" data-value="14 900 руб."></span>
<div class="descr" title="Полное описание услуги..."></div>
Помогу с продвижением: вывод сайта в ТОП Яндекса — вывожу сайты в топ Яндекса белыми методами.
Содержимого у элемента нет — значит, в текстовом слое страницы этого текста тоже нет. Робот атрибуты data-* и title в качестве основного контента не индексирует. Если у вас цены, характеристики или описания живут в атрибутах, страница для поиска пустая, хотя на экране всё видно.
Сюда же — вывод текста через content в CSS. Псевдоэлементы не относятся к содержимому документа. Всё, что должно ранжироваться, обязано лежать текстовым узлом внутри тега.
Картинки: alt, размеры и прыгающая вёрстка
Атрибут alt решает три задачи: описывает изображение для поиска по картинкам, даёт дополнительный текстовый сигнал странице, обеспечивает доступность. Его отсутствие — не катастрофа для позиций, но упущенный трафик: поиск по картинкам приносит на инфосайтах от 3 до 15 процентов визитов.
Куда серьёзнее отсутствие размеров. Если у img нет width и height, браузер не знает, сколько места резервировать, и верстает страницу дважды: сначала без картинки, потом с ней. Содержимое прыгает вниз, пользователь промахивается по кнопке. Это напрямую портит метрику Cumulative Layout Shift, которая входит в Core Web Vitals и через них влияет на оценку страницы в Google.
<img src="/img/foto.jpg" alt="Монтаж вентиляции в цехе" width="1200" height="800" loading="lazy">
Атрибуты ставятся в пикселях без единиц измерения, а реальный размер задаётся стилями: max-width:100%; height:auto. Так браузер вычисляет пропорцию заранее и место резервирует корректно.
| Что с картинкой | Чем это грозит | Стоит ли чинить |
|---|---|---|
| Нет alt у содержательной картинки | Потеря трафика с поиска по картинкам | Да, массово скриптом |
| Нет alt у декоративной иконки | Ничего, если стоит alt=»» | Нет |
| Нет width и height | Скачки вёрстки, просадка CWV | Да, в первую очередь |
| alt длиной в абзац с перечислением ключей | Риск оценки как переспам | Да, сократить до фразы |
| Одинаковый alt на всех картинках страницы | Сигнал обесценивается | Да, но не срочно |
Формы: поля без подписей и отправка, которая не работает на телефоне
Форма заявки — это то место, где ошибка кода стоит не позиций, а денег. Поля без связанного label плохи вдвойне: скринридер не понимает, что вводить, а на мобильном промах по мелкому полю приводит к тому, что посетитель просто уходит. Связка делается через совпадение for и id.
<label for="tel">Телефон</label>
<input type="tel" id="tel" name="tel" autocomplete="tel" inputmode="tel">
Ошибки, из-за которых форма не отправляется именно на мобильном, встречаются реже, но находятся тяжелее. Мой список того, что проверяю в первую очередь:
- Кнопка внутри формы без атрибута type. По умолчанию у
buttonтип submit, и если на неё повешен обработчик без отмены действия по умолчанию, форма отправляется дважды или перезагружает страницу до отправки данных. - Вложенная форма. Форма поиска в шапке, внутри которой оказалась форма подписки, — внутренняя просто исчезает из дерева документа.
- Дубли id у полей. Скрипт валидации находит первое поле, вешает проверку на него, второе остаётся необработанным, и отправка блокируется без объяснения.
- Кнопка, перекрытая фиксированным элементом. На десктопе всё видно, на телефоне поверх кнопки ложится плашка cookie или виджет чата, и нажать её физически невозможно.
- Отсутствие атрибута name у поля. Данные из поля не уходят на сервер, заявка приходит пустой.
- Мультиязычный сайт на WordPress: hreflang, поддомены и типичные ошибки
- Ошибки JavaScript: когда сломанный скрипт съедает заявки молча
Проверять формы обязательно на реальном телефоне, а не в эмуляторе браузера: эмулятор не воспроизводит поведение экранной клавиатуры и перекрытия фиксированных блоков.
Таблицы вместо вёрстки и почему это до сих пор встречается
Табличная вёрстка живёт в двух местах: на старых сайтах, которые никто не переделывал с нулевых, и в письмах рассылок, откуда её иногда копируют на страницу. Проблема не в том, что это старомодно, а в трёх конкретных последствиях.
- Таблица не переносится по строкам. На экране шириной 360 пикселей страница либо уезжает горизонтально, либо масштабируется до нечитаемого размера. Мобильная версия фактически отсутствует.
- Порядок содержимого в коде жёстко привязан к сетке. Робот читает документ построчно и получает перемешанные куски: кусок меню, кусок текста, снова меню.
- Семантики нет. Тег
tableсообщает роботу «здесь табличные данные». Когда в таблицу завёрнута вся страница, этот сигнал ложный. - Мультиязычный сайт на WordPress: hreflang, поддомены и типичные ошибки
- Ошибки JavaScript: когда сломанный скрипт съедает заявки молча
Отдельно стоит различать вёрстку таблицами и настоящие таблицы данных. Настоящие нужны и полезны, их только надо оформлять правильно: thead, tbody, заголовки в th, обёртка с горизонтальной прокруткой для мобильных. Такая таблица хорошо читается роботом и часто попадает в расширенный сниппет.
Подробнее об этом — в статье «Аудит сайта на ошибки».

Дубли идентификаторов ломают скрипты
Атрибут id обязан быть уникальным в пределах документа. Когда одинаковый идентификатор встречается дважды, любой скрипт, обращающийся к нему, получает только первый элемент. Второй перестаёт работать молча — консоль ошибок чистая, а функциональность отсутствует.
Где это возникает чаще всего:
- Один и тот же виджет формы вставлен и в шапку, и в тело страницы, и в подвал.
- Слайдер или аккордеон продублирован в мобильной и десктопной версиях блока.
- Всплывающее окно скопировано в несколько шаблонов и подключается дважды.
- Мультиязычный сайт на WordPress: hreflang, поддомены и типичные ошибки
- Ошибки JavaScript: когда сломанный скрипт съедает заявки молча
Проверить наличие дублей можно прямо в консоли браузера одной строкой, без сторонних сервисов:
const ids = [...document.querySelectorAll('[id]')].map(e => e.id);
console.log(ids.filter((v, i) => ids.indexOf(v) !== i));
Пустой массив в ответе — дублей нет. Всё остальное надо разбирать: часть окажется безобидной, но каждый неработающий якорь, каждая непроверяемая форма и каждый не открывающийся аккордеон живут именно здесь. И это уже влияет на поведенческие показатели.
Мета-теги и служебные теги не на своём месте
Всё, что относится к описанию документа, обязано находиться внутри head. Это title, meta с описанием и robots, канонический адрес, hreflang, подключение стилей. Когда такие теги оказываются в теле страницы, поведение зависит от того, где именно они оказались.
Опасный случай — canonical и meta name="robots" в body. Google в этой ситуации канонический адрес игнорирует полностью, а директиву noindex, наоборот, иногда учитывает. Оба сценария плохи: в первом теряется управление дублями, во втором можно случайно выкинуть страницу из индекса.
Как теги попадают в body: чаще всего через плагин, который вставляет код в неправильный хук, или через содержимое, вставленное копированием из редактора. Второй источник — незакрытый тег в шапке, из-за которого браузер закрывает head раньше времени, и всё последующее формально считается телом документа.
| Тег не на месте | Что происходит | Приоритет |
|---|---|---|
| canonical в body | Игнорируется, дубли остаются без склейки | Высокий |
| meta robots в body | Может быть учтён, риск выпадения из индекса | Критический |
| title в body | Заголовок вкладки берётся из первого найденного | Высокий |
| Второй title в документе | Учитывается первый, второй отбрасывается | Средний |
| link на стили в body | Дополнительная перерисовка, замедление отрисовки | Низкий |
Микроразметка с ошибками хуже, чем её отсутствие
Структурированные данные — тот редкий случай, когда неправильно лучше вообще не делать. Логика такая: разметки нет — поиск просто не показывает расширенный сниппет, и вы остаётесь при обычном. Разметка есть и она врёт — это повод для ручных санкций за спам в структурированных данных, с потерей всех расширенных сниппетов по сайту разом.
Если нужна помощь по теме — заказать сайт.
Что считается враньём:
- Отзывы и рейтинг размечены, а на странице их нет или они не видны посетителю.
- Размечена цена, отличающаяся от той, что на странице.
- Товар помечен как «в наличии», хотя фактически его нет.
- Разметка организации с адресом, по которому компания не находится.
- Хлебные крошки размечены, но ведут не по той структуре, что реально на сайте.
- Мультиязычный сайт на WordPress: hreflang, поддомены и типичные ошибки
- Ошибки JavaScript: когда сломанный скрипт съедает заявки молча
Технические ошибки разметки менее опасны, но обесценивают работу: пропущено обязательное поле, неверный тип, JSON-LD с лишней запятой, из-за которой не разбирается весь блок. Проверяются они бесплатно: валидатор schema.org, тест расширенных результатов Google, валидатор микроразметки Яндекса. Последний важен отдельно — Яндекс поддерживает свой набор схем и может ругаться там, где Google молчит.
Что можно спокойно игнорировать
Теперь самое полезное — список того, из-за чего не надо тревожить программиста. Всё перечисленное я вижу в валидаторе на сайтах в топе десятками и не трогаю.
Тему разбирал отдельно: «Ошибки юзабилити сайта».
| Замечание валидатора | Откуда берётся | Влияние |
|---|---|---|
| Attribute ng-, v-, x-, wire- not allowed | Angular, Vue, Alpine, Livewire | Нет, фреймворк работает штатно |
| Attribute data-… not allowed on element | Кастомные атрибуты скриптов | Нет |
| Ошибки внутри iframe стороннего виджета | Карты, чаты, платёжные формы | Нет, чужой код вы не правите |
| Trailing slash on void elements | Старый шаблон в стиле XHTML | Нет |
| Атрибут type у script и style | Наследие HTML4 | Нет |
| Section lacks heading | Секции-обёртки без заголовка | Нет, если структура понятна |
| Предупреждения о кодировке и языке в письмах | Скопированный код рассылки | Нет |
| Обязательный alt у пикселя счётчика | Метрика, аналитика | Нет |
| Consider adding lang attribute | Отсутствие lang у html | Минимальное, но добавить легко |
Общий принцип: если замечание касается атрибута, который придумал фреймворк, или кода, который вы физически не контролируете, — пропускайте. Если замечание касается структуры документа — разбирайтесь.
Ошибка, влияние, приоритет: сводная таблица
| Ошибка | Как влияет на продвижение | Приоритет |
|---|---|---|
| Незакрытый или неверно вложенный тег в теле контента | Часть текста выпадает из видимой области или меняет порядок | Критический |
| meta robots или canonical в body | Потеря управления индексацией и склейкой дублей | Критический |
| Микроразметка, не соответствующая содержимому | Риск ручных санкций и потери сниппетов | Критический |
| Форма не отправляется на мобильном | Прямая потеря заявок | Критический |
| Отсутствие H1 | Ослабление главного текстового сигнала | Высокий |
| Ссылка внутри ссылки | Размытие анкоров, неработающие клики | Высокий |
| Текст только в атрибутах или в CSS content | Контент не индексируется вовсе | Высокий |
| Нет width и height у картинок | Скачки вёрстки, просадка Core Web Vitals | Высокий |
| Дубли id | Молча ломаются скрипты, формы и якоря | Средний |
| Несколько H1 | Размывание темы страницы | Средний |
| Разрывы в иерархии заголовков | Хуже строится структура документа | Средний |
| Табличная вёрстка макета | Отсутствие мобильной версии, перемешанный порядок текста | Средний |
| Отсутствие alt у содержательных картинок | Потеря трафика с поиска по картинкам | Низкий |
| Нестандартные атрибуты фреймворков | Не влияет | Не трогать |
| Ошибки внутри сторонних виджетов | Не влияет | Не трогать |
Чем проверять код
Один инструмент задачу не закрывает. Нужен набор, где каждый отвечает за свой слой.
| Инструмент | Что находит | Как часто использовать |
|---|---|---|
| Валидатор W3C | Синтаксис, вложенность, незакрытые теги | Точечно, для шаблонов каждого типа страниц |
| Валидатор структурированных данных Google и Яндекса | Ошибки микроразметки, несоответствие содержимому | После любой правки разметки |
| Screaming Frog или Netpeak Spider | Массово: дубли title, отсутствие H1, битые ссылки, картинки без alt | Раз в месяц по всему сайту |
| Просмотр глазами робота в Вебмастере | Что реально получает индексирующий робот | При подозрении на скрытый контент |
| Проверка URL в Search Console | Отрисованный HTML и скриншот после выполнения скриптов | Для сайтов на JavaScript |
| PageSpeed Insights | Скачки вёрстки, картинки без размеров, доступность | Раз в квартал и после редизайна |
| Консоль браузера | Дубли id, ошибки скриптов, неработающие обработчики | При разборе конкретной поломки |
| Реальный телефон | Формы, перекрытия, горизонтальная прокрутка | Перед каждым запуском изменений |
Важный нюанс по парсерам: проверяйте не всю базу URL подряд, а по одному представителю каждого шаблона. Главная, категория, карточка товара, статья, страница услуги, контакты. Ошибки живут в шаблонах, а не в отдельных страницах, и найдя одну — вы чините сразу тысячи адресов.
Порядок исправлений
Правило приоритизации простое: сначала то, что мешает роботу увидеть контент и посетителю совершить действие, потом то, что улучшает сигналы, и только в конце косметика.
| Шаг | Что делаем | Как понять, что готово |
|---|---|---|
| 1 | Служебные теги в head, снимаем случайные noindex, чиним canonical | Проверка URL в консолях показывает нужный канонический адрес |
| 2 | Незакрытые и неверно вложенные теги в основном шаблоне контента | Валидатор не выдаёт Unclosed element и not allowed as child |
| 3 | Формы: подписи, name, отправка на мобильном | Тестовая заявка пришла с реального телефона |
| 4 | Заголовки: один H1 на странице, ровная иерархия | Парсер по всему сайту не находит страниц с 0 или 2+ H1 |
| 5 | Микроразметка: убираем ложные данные, дополняем обязательные поля | Тест расширенных результатов без ошибок |
| 6 | Картинки: размеры, затем alt | CLS в PageSpeed ниже 0,1 |
| 7 | Дубли id, ссылки внутри ссылок | Консольная проверка возвращает пустой массив |
| 8 | Табличная вёрстка, устаревшие конструкции | Нет горизонтальной прокрутки на ширине 360 пикселей |
| 9 | Косметика валидатора | По остаточному принципу, если есть ресурс |
На практике первые пять шагов дают весь эффект, который вообще можно получить от работы с кодом. Дальше рост позиций обеспечивают уже контент, коммерческие факторы и ссылки, а не разметка.
Как не сломать сайт при массовых правках
Массовая правка кода — самый быстрый способ уронить сайт, который до этого нормально работал. У меня после нескольких неприятных случаев сложился жёсткий порядок, от которого я не отступаю.
- Полная копия перед стартом. База данных и файлы, выгруженные и проверенные на восстановление. Не «есть бэкап у хостера», а лежащий у вас архив, который вы умеете развернуть.
- Тестовая копия сайта. Все правки сначала на ней, с закрытием от индексации через авторизацию, а не через robots.txt.
- Один тип правок за один заход. Не «почистим весь HTML», а «сегодня закрываем теги в шаблоне статьи». Если что-то отвалится, вы знаете, из-за чего.
- Проверка после каждого шага. Три-пять представительных страниц, обязательно на телефоне, обязательно с проверкой формы.
- Массовые SQL-замены только по точному совпадению. Регулярные выражения по содержимому статей — прямой путь к тому, чтобы испортить тысячу страниц одной командой. Перед запуском обязательно выборка: сколько строк попадёт под замену и какие именно.
- Пауза между этапами. Три-четыре дня наблюдения за индексацией и трафиком после серьёзных структурных изменений, прежде чем катить следующие.
- Журнал изменений. Что, когда и зачем поменяли. Через месяц при разборе просадки этот список стоит дороже любой аналитики.
- Мультиязычный сайт на WordPress: hreflang, поддомены и типичные ошибки
- Ошибки JavaScript: когда сломанный скрипт съедает заявки молча
И ещё одно наблюдение из практики: чаще всего сайт ломается не от сложной правки, а от простой, сделанной сразу на боевом сервере «на минутку». Минутка растягивается на сутки простоя формы заявок.
Частые вопросы
Правда ли, что валидность кода — фактор ранжирования?
Нет. Ни Яндекс, ни Google не подтверждали этого, а проверка сайтов из топа показывает, что чистых по валидатору среди них почти нет. Значение имеет не соответствие спецификации, а то, правильно ли робот и браузер строят дерево документа.
У меня 400 ошибок в валидаторе. С чего начинать?
Отфильтруйте по типу сообщения. Сначала Unclosed element, End tag seen but there were open elements, not allowed as child of element, Duplicate ID. Обычно из четырёхсот замечаний в эти категории попадает от пяти до тридцати, и именно они содержат весь реальный вред.
Нужно ли ставить alt всем без исключения картинкам?
Содержательным — да, коротким описанием по сути изображения. Декоративным иконкам и служебным пикселям ставится пустой alt: это корректно и по спецификации, и с точки зрения доступности. Списывать в alt ключевые фразы не надо.
Стоит ли убирать микроразметку, если в ней ошибки?
Технические ошибки лучше исправить, а вот разметку, данные которой не соответствуют содержимому страницы, надо убирать немедленно. Ложные отзывы, рейтинги и цены в структурированных данных — основание для ручных санкций, а последствия там куда тяжелее, чем отсутствие расширенного сниппета.
Мой сайт на конструкторе, править код я не могу. Что делать?
Через встроенные средства почти всегда доступны заголовки, alt, подписи полей формы и содержимое текстовых блоков — то есть половина значимого списка. Остальное чинится только сменой платформы, и решать это стоит по расчёту: если сайт приносит заявки, переезд ради валидности не окупится.
Разбор сайта, у которого нет ни посещаемости, ни просмотров:
Коротко
- Валидность не входит в алгоритмы ранжирования, сайты в топе её не имеют, и гнаться за нулём замечаний бессмысленно.
- Реально вредят: незакрытые и неверно вложенные теги, служебные теги в body, отсутствие или множественность H1, ссылка в ссылке, текст в атрибутах, неработающая на мобильном форма.
- Ложная микроразметка опаснее её отсутствия — за несоответствие данных содержимому страницы выдают ручные санкции.
- Спокойно игнорируются атрибуты фреймворков, ошибки внутри сторонних виджетов и устаревшие мелочи вроде type у script.
- Чинить по приоритету: сначала индексация и отображение, потом сигналы, косметика — в последнюю очередь, и всегда на копии с проверкой после каждого шага.
- Мультиязычный сайт на WordPress: hreflang, поддомены и типичные ошибки
- Ошибки JavaScript: когда сломанный скрипт съедает заявки молча
Проверить техническое состояние вашего сайта помогу на SEO-консультации.
Увеличьте позиции и продажи вашего сайта
Профессиональное SEO-продвижение с гарантией результата. Выберите подходящую услугу:
Остались вопросы по продвижению?
Меня зовут Анатолий Кузнецов, я SEO-оптимизатор с 20-летним стажем. Разберу ваш сайт, отвечу на вопросы и подскажу, что улучшить для роста позиций в Яндексе и Google.
Связаться со мной →Комментарии
Сергей Плотников
Прогнал свой магазин через валидатор, получил 1200 ошибок и чуть не уволил разработчика. Отфильтровал по вашим четырём типам сообщений — осталось 14. Спасибо, что сэкономили мне скандал.
Марина Ковалёва
У нас на карточках товара как раз ссылка внутри ссылки, весь блок обёрнут, а внутри ссылка на производителя. Кликается через раз, теперь понятно почему.
Анатолий Кузнецов автор
Именно так это и проявляется: браузер разрывает конструкцию, и часть карточки остаётся вне кликабельной области. Решается без переделки дизайна — уберите внешнюю обёртку и оставьте одну ссылку на заголовке, растянув её на всю карточку через псевдоэлемент с absolute. Ссылка на производителя тогда просто поднимается по z-index выше. Клик станет предсказуемым, а анкор перестанет размываться.
Дмитрий Лапшин
Про размеры картинок отдельное спасибо. Проставил width и height на шаблоне статей, CLS упал с 0,31 до 0,04 за неделю. Ничего больше не менял.
Ольга Терентьева
Подскажите, у меня на сайте два H1: один в логотипе, второй над текстом. Это точно надо чинить или можно оставить как есть?
Анатолий Кузнецов автор
Чинить стоит, но не в авральном порядке. Логотип в H1 — это старая привычка вёрстки нулевых, и заголовок первого уровня там расходуется впустую на название компании. Замените тег логотипа на div или span, оформление не изменится, если стили привязаны к классу, а не к тегу. H1 над текстом оставьте, и в нём должен стоять основной запрос страницы, а не общее слово вроде «Услуги».
Артём Гусев
Скрипт для поиска дублей id в консоли работает отлично. Нашёл 9 штук, из них 3 сидели в формах обратной связи. Одна форма вообще не отправлялась месяца два, никто не замечал.
Наталья Бирюкова
Сайт на Тильде, код править нельзя. Из вашего списка получилось сделать только заголовки и alt. Остальное недоступно, но хоть что-то.
Владимир Стрельцов
Вопрос по микроразметке. У нас на сайте размечены отзывы, они реально есть, но выводятся скриптом после клика по вкладке. Это считается нарушением?
Анатолий Кузнецов автор
Пограничный случай, и трактовка зависит от того, есть ли отзывы в исходном коде страницы. Если содержимое вкладки присутствует в HTML и просто скрыто стилями до клика — нарушения нет, такой контент считается видимым для пользователя. Если же отзывы подгружаются запросом только после клика и в коде их нет, разметка описывает то, чего на странице не существует. Проверьте через сохранение страницы или просмотр глазами робота: если текст отзывов там виден, всё в порядке.
Екатерина Мальцева
Не соглашусь насчёт того, что валидность не важна. Чистый код проще поддерживать, и следующий разработчик скажет спасибо.
Анатолий Кузнецов автор
Тут мы не спорим, а говорим о разных вещах. Чистый код действительно дешевле в поддержке, и на новом проекте я всегда за то, чтобы писать сразу правильно. Речь в статье о другом: когда владелец готового сайта с ограниченным бюджетом решает, куда потратить двадцать часов программиста. В этой ситуации выравнивание отступов в валидаторе проигрывает починке формы и заголовков с огромным отрывом.
Роман Тищенко
Табличная вёрстка — привет из 2006. У клиента сайт производства до сих пор такой, на телефоне читать невозможно, а переделывать он не хочет, потому что «и так звонят».
Ирина Сафонова
Нашла у себя canonical в body, попал туда через плагин. Убрала, через три недели склеились дубли с параметрами сортировки. Мелочь, а работала против нас.
Павел Ершов
А как быть, если весь контент выводится через JavaScript? Валидатор смотрит исходник и видит пустой div. Как тогда вообще проверять код?
Анатолий Кузнецов автор
Валидатор в этом случае бесполезен, нужен отрисованный HTML. Возьмите его в консоли браузера через копирование outerHTML корневого элемента, сохраните в файл и уже этот файл загрузите в валидатор как документ. Параллельно посмотрите отрисованный код в проверке URL в Search Console — он покажет, что получил именно робот, а не ваш браузер с расширениями. Расхождение между этими двумя вариантами и есть главная проблема JavaScript-сайтов.
Юлия Романенко
Порядок исправлений забрала себе как чек-лист. До этого делали хаотично: то alt проставим, то отступы поправим, а форма на мобильном полгода не работала.
Благодарю вас за интересную и полезную информацию.
Спасибо и Вам за добрые слова!)
То что валидность html кода не влияет на позиции и ранжирование, пишут те кто понятия не имеют в принципах программирования и работы поисковых систем. Правильно все пишите. А тот кто не верит и слушает дилетантов пусть живет за ТОП50 выдачи. Удел вторых глотать чужую пыль!))
Спасибо Андрей за позитивный комментарий. Согласен! Но каждый на своей шкуре это должен испытать. По другому не сработает!))))