SEO-поля страниц
Модуль wlit.meta для 1С-Битрикс позволяет задавать SEO-поля для конкретного адреса страницы: Title, Description, Keywords, H1, Robots и Canonical URL. Настройки сохраняются отдельно для каждого сайта одной установки Битрикс и применяются автоматически при открытии публичной страницы.
Руководство описывает версию 1.0.0. Разработчик — White Label IT.
Назначение и возможности
Модуль подходит для отдельных посадочных страниц, разделов каталога, карточек товаров и служебных страниц, которым нужны собственные SEO-поля. Для настройки не требуется создавать инфоблок или менять код каждой страницы.
Доступны:
- независимое заполнение шести SEO-полей;
- привязка к сайту и пути страницы, в том числе с параметрами запроса;
- работа с кириллическими путями;
- включение и выключение записей;
- поиск по URL, Title и H1;
- массовое добавление через CSV.
Запись относится к одному URL. Шаблоны, маски и регулярные выражения в этом модуле не предусмотрены. Для разных адресов создаются отдельные записи.
Установка и первый запуск
Подготовка
Нужна работающая установка 1С-Битрикс с базой данных MySQL/MariaDB и хотя бы одним активным сайтом. Код использует возможности PHP 8 и функции mbstring; для совместного использования трёх модулей WL-IT используйте PHP 8.1 или новее. Установщик wlit.meta не выполняет отдельную проверку версии PHP.
Установка
- Разместите каталог модуля в
/bitrix/modules/wlit.meta/. - Установите WL-IT: SEO-поля страниц через административный раздел управления модулями/решениями Битрикс.
- Откройте Сервисы → WL-IT: SEO-поля страниц.
- Проверьте, что в списке сайтов доступен нужный сайт.
- Создайте первую запись и проверьте её на публичной странице.
Прямой адрес настроек:
/bitrix/admin/settings.php?lang=ru&mid=wlit.meta&mid_menu=1
При установке создаётся собственная таблица SEO-полей. Дополнительный компонент на публичных страницах размещать не нужно.
Права доступа
Используются групповые права Битрикс на модуль.
| Уровень | Возможности |
|---|---|
D — нет доступа |
Работа с административным интерфейсом недоступна |
R — просмотр |
Просмотр списка и карточек |
W — управление |
Добавление, изменение, удаление и импорт CSV |
Изменяющие действия выполняются с проверкой сессии Битрикс. Если сессия истекла, обновите страницу, при необходимости войдите повторно и повторите действие.
Права относятся к модулю в целом. Отдельного ограничения редактора одним сайтом внутри wlit.meta нет. Выбранный в записи сайт определяет, где применяются SEO-поля.
Интерфейс модуля
Вкладка «Страницы»
Показывает сайт, URL, активность, Title, H1, дату изменения и действия. Список отсортирован по дате изменения, затем по ID: новые изменения находятся сверху. На одной странице отображается 40 записей.
Для поиска выберите сайт или Все, введите часть URL, Title или H1 и нажмите Фильтровать. Поиск не охватывает Description, Keywords, Robots и Canonical.
Откройте карточку нажатием на строку, URL или кнопку Изменить. В карточке первая вкладка называется SEO-поля.
Вкладка «Импорт CSV»
Позволяет добавить несколько страниц из файла. Импорт доступен пользователям с правом управления.
Вкладки «Документация» и «О разработчике»
Содержат краткое руководство, ссылку на подробную документацию и сведения о White Label IT.
Создание и изменение записи
Добавление страницы
- На вкладке Страницы нажмите Добавить страницу.
- Выберите сайт.
- Введите URL страницы от корня сайта, например
/delivery/. - Оставьте Активно включённым, если изменения должны применяться сразу.
- Заполните нужные SEO-поля.
- Нажмите Сохранить.
- Откройте соответствующий URL и проверьте исходный HTML.
Для главной страницы укажите /. Для отдельного варианта с параметрами укажите, например, /catalog/?page=2.
Изменение записи
Откройте карточку, измените поля и сохраните. Изменение сайта или URL переносит действие записи на новое сочетание сайта и адреса. Одна и та же пара сайт + URL не может существовать дважды.
При ошибке проверки форма сохраняет введённые значения, в том числе выключенную активность. Исправьте причину ошибки и повторите сохранение.
Выключение и удаление
Чтобы временно остановить применение полей, снимите Активно и сохраните. Данные останутся в списке.
Для удаления нажмите Удалить в карточке или списке и подтвердите действие. Удаляется запись модуля с её SEO-полями. Сам файл страницы, элемент инфоблока и содержимое сайта не удаляются. Кнопка К списку возвращает к списку без сохранения внесённых правок.
Все поля и ограничения
Сайт, URL и активность
| Поле | Правило заполнения |
|---|---|
| Сайт | Обязателен; выбирается из активных сайтов Битрикс |
| URL страницы | Обязателен; путь начинается с /, домен не указывается; максимум 500 символов |
| Активность | Включена — запись участвует в применении полей; выключена — найденная запись не применяется |
В URL запрещены пробелы, управляющие символы, обратный слеш \, фрагмент # и адреса вида //example.ru/. Начальные и конечные пробелы удаляются при сохранении. Завершающий / внутри адреса сохраняется.
Title
Устанавливает свойство страницы title. Используется шаблоном для HTML-тега <title> и может учитываться поисковой системой при формировании заголовка результата. Максимум — 500 символов.
Пример: Доставка заказов по Москве — Компания.
Description
Устанавливает свойство description. Для вывода метатега шаблон сайта должен использовать штатный механизм вывода свойств Битрикс. Поле допускает текст; отдельного лимита символов в форме модуля нет, хранение ограничено типом TEXT базы данных.
Пример: Условия, сроки и стоимость доставки заказов по Москве и области.
Keywords
Устанавливает свойство keywords. Значения можно указать через запятую. Отдельного лимита символов в форме нет, используется поле TEXT базы данных.
Пример: доставка, условия доставки, Москва.
H1
Вызывает $APPLICATION->SetTitle(). Максимум — 500 символов. Модуль задаёт заголовок страницы Битрикс; размещение его в теге <h1> зависит от шаблона. Для вывода именно заголовка страницы шаблон может использовать $APPLICATION->ShowTitle(false).
Если шаблон печатает название элемента напрямую из $arResult, значение H1 из модуля может не появиться в этом месте.
Robots
Устанавливает свойство robots. Максимум — 100 символов. Примеры значений: index, follow и noindex, follow.
Модуль сохраняет введённую строку и не проверяет смысл директив. Настройка этого поля не изменяет файл robots.txt.
Canonical URL
Устанавливает свойство canonical и добавляет в <head> тег:
<link rel="canonical" href="https://example.ru/catalog/item/">
Максимум — 500 символов. Указывайте полный предпочтительный HTTP(S) адрес. В отличие от проверки пути страницы, модуль не выполняет отдельную проверку корректности canonical как URL: правильность адреса нужно проверить самостоятельно.
Если canonical уже выводится шаблоном или другим модулем, согласуйте настройку и проверьте итоговый HTML на наличие нескольких тегов.
Что означает пустое поле
Пустое поле не очищает значение, которое установил компонент, шаблон или другой код. Модуль пропускает такое поле. Например, можно задать только Description, сохранив Title и H1 из компонента.
Для возврата к исходному поведению очистите соответствующее поле и сохраните. Для остановки всех переопределений выключите запись, учитывая порядок поиска ниже.
Правила сопоставления URL
Порядок поиска
Для текущего SITE_ID модуль проверяет варианты в следующем порядке:
- Путь с исходной строкой запроса:
/catalog/item/?page=2. - Декодированный путь с той же строкой запроса, если путь содержит percent-encoding.
- Исходный путь без параметров:
/catalog/item/. - Декодированный путь без параметров, если он отличается.
- Путь, полученный через
$APPLICATION->GetCurPage(false).
Используется первая найденная запись. Поля нескольких записей не объединяются.
Параметры запроса
Запись /catalog/item/?page=2 имеет приоритет перед /catalog/item/ для такого запроса. Если отдельной записи с параметрами нет, может примениться запись на путь без параметров.
Порядок параметров сохраняется: /page/?a=1&b=2 и /page/?b=2&a=1 — разные строки. Параметры не сортируются и не удаляются автоматически. Значения query string не декодируются при построении дополнительного варианта URL.
Неактивная запись как исключение
Если первая найденная запись выключена, обработчик завершает работу. Например:
| Запись | Активность | Запрос | Результат |
|---|---|---|---|
/catalog/ |
Включена | /catalog/?view=list |
Применятся поля /catalog/, если отдельной записи нет |
/catalog/?view=list |
Выключена | /catalog/?view=list |
Поля из /catalog/ не применятся |
Удаление отдельной выключенной записи вернёт возможность поиска по пути без параметров.
Кириллица и различающиеся адреса
Для запроса /%D1%82%D0%B5%D1%81%D1%82/ модуль дополнительно проверяет /тест/. Если существуют оба варианта записи, исходная закодированная строка проверяется раньше.
Завершающий слеш имеет значение: /delivery и /delivery/ не нормализуются в один путь. Код передаёт строки без приведения регистра; сравнение URL в базе зависит также от её collation. Используйте фактическую строку запроса и не рассчитывайте на разные SEO-настройки для адресов, отличающихся только регистром.
Импорт CSV
Формат файла
Используйте UTF-8. Поддерживается BOM. Колонки идут строго в таком порядке:
| № | Колонка | Пример |
|---|---|---|
| 1 | Сайт | s1 |
| 2 | URL | /delivery/ |
| 3 | Активность | Y |
| 4 | Title | Доставка — Компания |
| 5 | Description | Сроки и условия доставки |
| 6 | Keywords | доставка, Москва |
| 7 | H1 | Доставка |
| 8 | Robots | index, follow |
| 9 | Canonical URL | https://example.ru/delivery/ |
Сайт;URL;Активность;Title;Description;Keywords;H1;Robots;Canonical URL
s1;/delivery/;Y;Доставка — Компания;Сроки и условия доставки;;Доставка;index, follow;https://example.ru/delivery/
s1;/contacts/;Y;Контакты — Компания;Адрес и телефон компании;;Контакты;;
s2;/delivery/;N;Delivery — Company;;;;;
Последовательность колонок важна: заголовок не используется для их перестановки.
Разделитель, заголовок и значения
Разделитель ; или , выбирается по количеству этих символов в первой строке. При равенстве используется ;. Для предсказуемого определения оставляйте строку заголовка и используйте ;.
Первая строка пропускается, если её первая ячейка равна Сайт, site или site_id, без учёта регистра. Минимально нужны две колонки; недостающие поля считаются пустыми. Если активность отсутствует, запись импортируется выключенной.
Значения Y, 1, ДА, YES включают активность; остальные выключают. Сайт должен существовать среди активных сайтов. Пустой сайт не означает «все сайты» и будет пропущен.
Если значение содержит разделитель, перенос строки или двойную кавычку, заключите его в двойные кавычки; внутреннюю кавычку удвойте:
s1;/about/;Y;"О компании «Пример»";"Производство; продажа; доставка";;;;
Порядок импорта
- Откройте Импорт CSV.
- Выберите файл.
- Нажмите Импортировать.
- Проверьте сообщение с количеством добавленных и пропущенных записей.
- Найдите новые записи и проверьте несколько страниц сайта.
Импорт добавляет записи. Совпадающая пара сайт + URL пропускается, даже если существующая запись выключена. Неверный URL, неизвестный сайт и строка с недостаточным количеством колонок также учитываются как пропущенные. Построчный протокол причин в интерфейсе не предоставляется.
Импорт выполняется последовательно и не является общей транзакцией: при прерывании уже добавленные записи могут остаться в базе. Повторная загрузка пропустит существующие сочетания сайта и URL.
Практические сценарии
Посадочная страница с собственными Title и H1
Создайте запись s1 + /services/development/, задайте Title Разработка сайтов на Битрикс — Компания, H1 Разработка сайтов на 1С-Битрикс и Description. Остальные поля оставьте пустыми. Проверьте отдельно <title>, метатег description и видимый заголовок.
Отдельное описание второй страницы каталога
Создайте запись /catalog/?page=2 с нужным Title. Укажите фактическое имя параметра вашего компонента: если используется PAGEN_1=2, запись должна содержать /catalog/?PAGEN_1=2.
Canonical для URL с меткой
Создайте запись на путь /catalog/item/ с canonical https://example.ru/catalog/item/. При отсутствии более специфической записи этот canonical применяется и к /catalog/item/?utm_source=mail через поиск по пути без параметров.
Исключение из общего переопределения
Для /catalog/ задайте SEO-поля. Создайте выключенную запись /catalog/?preview=1: запрос этого варианта не получит SEO-поля общей записи /catalog/.
Разные настройки на двух сайтах
Создайте две записи с одинаковым путём /contacts/ и разными сайтами s1 и s2. Заполните значения для каждого сайта отдельно. Настройки определяются по SITE_ID, а не только по домену в браузере.
Массовое добавление после SEO-аудита
Подготовьте таблицу с девятью колонками, сохраните CSV в UTF-8 и загрузите. Существующие записи изменяйте в карточках: повторный импорт их не перезаписывает.
Проверка результата
- Откройте фактический адрес, включая параметры.
- Посмотрите исходный код ответа страницы.
- Найдите
<title>,name="description",name="keywords",name="robots"иrel="canonical"для заполненных полей. - Сравните значения с записью.
- Проверьте видимый H1.
- Убедитесь, что canonical не дублируется.
- Проверьте соседний URL и второй сайт, если используется многосайтовость.
После изменений при необходимости очистите композитный кеш, кеш готовых страниц и CDN. Если готовый HTML отдаётся без выполнения PHP, обработчик модуля не сможет внести новое значение в этот ответ.
Диагностика
| Симптом | Что проверить |
|---|---|
| «Нет доступа» | Уровень прав группы на wlit.meta |
| Нет сайтов в форме | Наличие активных сайтов Битрикс |
| «Укажите сайт и URL страницы…» | Выбор сайта и начало пути с / |
| Ошибка URL | Длину, пробелы, #, обратный слеш и отсутствие домена |
| Ошибка длинного поля | Title/H1/Canonical до 500 символов, Robots до 100 |
| Ошибка при добавлении существующего URL | Уже существующую пару сайт + URL |
| Изменения не видны | Активность, текущий SITE_ID, более специфическую запись и кеш |
| H1 не изменился | Способ вывода заголовка в шаблоне |
| Метатег отсутствует | Штатный вывод свойств и <head> в шаблоне |
| Два canonical | Вывод canonical в других модулях и шаблоне |
| CSV добавил меньше строк | Дубликаты, неизвестные сайты, неверные URL и порядок колонок |
| «Недостаточно прав или истекла сессия» | Право W, вход в систему и свежую страницу формы |
Если значения задаются другим обработчиком позднее, результат зависит от порядка выполнения этого кода. Для диагностики разработчик должен проверить обработчики события OnEpilog и шаблон страницы.
Частые вопросы
Можно ли настроить все страницы раздела одной записью?
Нет. /catalog/ — запись для этого пути и его вариантов с параметрами по описанному порядку поиска. Дочерние адреса /catalog/item/ требуют своих записей.
Можно ли оставить заполненным только одно поле?
Да. Каждое непустое поле применяется независимо.
Можно ли пустым полем удалить существующий метатег?
Нет. Пустое поле пропускается. Очистку значения, заданного компонентом или шаблоном, нужно выполнять в источнике этого значения.
Есть ли экспорт CSV?
В текущем интерфейсе предусмотрен только импорт. Для резервного копирования используйте резервную копию базы данных Битрикс.
Почему запись без параметров срабатывает для URL с параметрами?
После поиска полного пути со строкой запроса модуль проверяет путь без параметров. Отдельная запись с параметрами имеет приоритет, в том числе если она выключена.
Можно ли вводить полный URL в поле страницы?
Нет. Вводите /path/. Полный URL обычно нужен в поле Canonical URL.
Нужно ли вставлять компонент модуля в шаблон?
Нет. Применение выполняется обработчиком Битрикс автоматически.
Изменяются ли SEO-поля элемента инфоблока?
Нет. Модуль хранит свою запись и задаёт свойства текущей публичной страницы во время запроса.
Обновление, удаление и хранение данных
Данные находятся в таблице b_wlit_meta_page. Уникальность обеспечивается сочетанием сайта и SHA-256 полного URL. Это позволяет различать длинные URL с одинаковым началом.
При первом открытии после обновления проверяется структура таблицы и при необходимости выполняется миграция. Перед обновлением сохраните резервную копию файлов модуля и базы данных.
При удалении модуля его таблица с SEO-полями сохраняется. Повторная установка может использовать сохранённые записи. Удаление отдельной записи из списка не имеет встроенной отмены; восстановление выполняется из резервной копии.
Информация для разработчиков
Точка применения
Публичные свойства устанавливает Wlit\Meta\PageMeta::apply() на событии main:OnEpilog. Административный раздел пропускается. Для применения нужны SITE_ID, объект $APPLICATION и корректный путь запроса.