ЧПУ в умном фильтре 1С Битрикс
Кто не знает что такое ЧПУ — это «человеко понятные url» т.е когда вы заходите на сайт в раздел Каталог / Телевизоры и видите в в адресной строке не /?s=1&ss=15 а читаемый латиницей адрес /katalog/televizori/ это удобно, и поисковые системы относятся лучше к таким адресам.
Настройка инфоблока
И так как же настраивается ЧПУ режим умного фильтра. В первую очередь настраиваем URL страниц в параметрах информационного блока, в админке вкладка Контент / Типы инфоблоков / Каталог / Одежда (в вашем случае название типа и инфоблока могут отличаться). На первой вкладке «Инфоблок» настраиваем слудющие поля:
где
- #SITE_DIR# — константа битрикса, обозначает папку сайта;
- /catalog/ — директория в корне сайта, где будет размещён комплексный компонент каталога;
- #SECTION_CODE# — переменная куда будет подставлен символьный код раздела (обычно это транслитерированное название раздела);
- #ELEMENT_CODE# — тоже символьный код транслитерированный из названия элемента.
Чтобы #SECTION_CODE# и #ELEMENT_CODE# формировались автоматически при создании разделов и элементов не забудьте на вкладках «Поля» и «Поля разделов» установить для поля «Символьный код» такие параметры:
т.е. мы делаем поле
- обязательным (первая галочка);
- проверяем на уникальность (чтобы не получилось что один URL имеют разные страницы);
- транслитерировать из названия при добавлении (чтобы не вводить код вручную).
Настройка свойств инфоблока
Теперь нужно подготовить свойства инфоблока по которым мы будем фильтровать каталог, в качестве демки я взял демо-магазин одежды 1С битрикс, который устанавливается из коробки, а потому предлагаю использовать свойства одежды, например цвет и фасон. Не смотря на то что свойство цвет есть в демо-каталоге, я предлагаю его немного перенастроить.
Дело в том что при составлении ЧПУ адреса страницы с результатом фильтрации по определённому свойству, компонент собирает этот URL из кода свойства и внешнего кода выбранного значения свойства.
Для того чтобы нам было легче читать URL предлагаю коды свойств и их значений задавать в формате транслита, например свойство «цвет», имеет код «cvet», значение свойства цвет «красный» имеет код «krasniy» и т.д. В начале прописываем код свойства
А затем коды значений свойства цвет, колонка «Внешний код» в диалоге редактирования свойства инфоблока.
После смены внешнего кода значений свойств необходимо переопределять их у торговых предложений, т.к. в БД в параметрах торговых предложений сохранено старое значение внешнего кода и новые они (торговые предложения) автоматически не увидят. Поэтому если затеялись творить такое на большом каталоге, обязательно создавайте резервные копии и скриптом переопределяйте значений свойств занося текущие значения в промежуточные таблицы БД.
То же самое проделываем с вновь созданным свойством «фасон», для простоты я использовал тип свойства «Список». Код свойства «fason» и несколько значений «Футляр -> futlar» и «Сарафан -> sarafan». Кстати код значений свойства фасон при выбранном типе свойства «Список», прописывается в колонке «XML_ID»
Не забудьте задать нескольким торговым предложениям каталога свойство «Фасон», чтобы оно отобразилось в умном фильтре. Свойства инфоблока настроили, переходим к настройкам компонента bitrix:catalog.
Настройка компонента
Переходим в каталог товаров, включаем режим правки и заходим в параметры компонента. В параметрах компонента bitrix:catalog на вкладке «Управление адресами страниц» ищем поле «Url раздела для умного фильтра» — это и есть шаблон ЧПУ адресов с результатами фильтрации. Для сокращения я обычно убираю последнюю часть /apply/ оставляя такую строку #SECTION_CODE#/filter/#SMART_FILTER_PATH#/ где
- #SECTION_CODE# — код раздела в котором осуществляется фильтрация;
- #SMART_FILTER_PATH# — путь собранный из кодов свойств и их значений составленный по определённому алгоритму.
- /filter/ — что-то вроде директивы позволяющей системе правильно идентифицировать и интерпретировать запрашиваемый адрес (т.е. понять открыть определённый раздел или выполнить фильтрацию текущего)
Сохраняем настройки компонента. Теперь при фильтрации например по свойству «Цвет» = «Красный» — получаем такой URL /catalog/dresses/filter/cvet-is-krasniy/ а если дополнительно отфильтровать каталог по фасону получим URL /catalog/dresses/filter/cvet-is-krasniy/fason-is-futlar/. Если вы всё сделали правильно у вас должны получаться такие ЧПУ URL фильтра. Переходим к самому интересному, настраиваем seo для полученных страниц.
SEO для страниц результатов фильтра битрикс
В первую очередь давайте определимся, что мы будем менять для таких вот страниц как /catalog/dresses/filter/cvet-is-krasniy/ (т.е. каталог / плать/ цвет — красный). На мой взгляд минимальный набор для корректировки это title — страницы, meta-keywords, meta-description, заголовок h1 и дополнительный текст (назовём его SEO-текст) на странице видимый пользователю, описывающий данный раздел в трёх — четырёх предложениях.
Где все эти данные хранить? Есть два варианта, в инфоблоке и в HL-инфоблоке, т.к. мне привычнее первый, реализуем именно его. И так ещё раз что нам нужно хранить в элементах инфоблока:
- заголовок страницы (title)
- ключевые слова (meta-keywords)
- описание страницы (meta-description)
- заголовок (h1)
- SEO — текст (текст для посетителя)
- URL страницы на которой все эти данные нужно изменить / вывести
Создадим инфоблок с соответствующими полями.
Для удобства дальнейшей работы с инфоблоком сохраните его идентификатор в константу IBLOCK_SEO в файл /bitrix/php_interface/init.php это позволит подставлять в код функции осмысленное значение IBLOCK_SEO а не просто число, что в последствии повысит качество и восприятие кода.
Поле URL страницы делаем обязательным т.к. по нему будет определяться к какой странице применить заданные свойства. В результате получаются вот такие элементы:
Теперь необходимо в файле шаблона section.php комплексного компонента каталога после вызова компонента catalog.section разместить следующий код:
//Получаем SEO параметры текущей страницы
$currentPageUrl = $APPLICATION->GetCurPage();
$currentPageSeo = array();
$arSelect = Array("ID", "PROPERTY_TITLE", "PROPERTY_META_KEYWORDS", "PROPERTY_META_DESCRIPTION", "PROPERTY_HEADER", "PROPERTY_SEO_TEXT");
$arFilter = Array("IBLOCK_ID"=>IBLOCK_SEO, "ACTIVE_DATE"=>"Y", "ACTIVE"=>"Y", "PROPERTY_PAGE_URL"=>$currentPageUrl);
$res = CIBlockElement::GetList(Array(), $arFilter, false, false, $arSelect);
while($ob = $res->GetNextElement()){
$arFields = $ob->GetFields();
$currentPageSeo = array(
"TITLE" => $arFields["PROPERTY_TITLE_VALUE"],
"KEYWORDS" => $arFields["PROPERTY_META_KEYWORDS_VALUE"],
"DESCRIPTION" => $arFields["PROPERTY_META_DESCRIPTION_VALUE"],
"HEADER" => $arFields["PROPERTY_HEADER_VALUE"],
"SEO_TEXT" => $arFields["PROPERTY_SEO_TEXT_VALUE"]["TEXT"],
);
}
//Устанавливаем полученные параметры
if($currentPageSeo["TITLE"]){
$APPLICATION->SetPageProperty("title", $currentPageSeo["TITLE"]);
}
if($currentPageSeo["KEYWORDS"]){
$APPLICATION->SetPageProperty("keywords", $currentPageSeo["KEYWORDS"]);
}
if($currentPageSeo["DESCRIPTION"]){
$APPLICATION->SetPageProperty("description", strip_tags($currentPageSeo["DESCRIPTION"]["TEXT"]));
}
if($currentPageSeo["HEADER"]){
$APPLICATION->SetTitle($currentPageSeo["HEADER"]);
}
if($currentPageSeo["SEO_TEXT"]){
$arResult["SEO_TEXT"] = htmlspecialcharsBack($currentPageSeo["SEO_TEXT"]);
}
Что мы делаем в данном скрипте, первым делом получаем параметры текущей страницы (переменная $curPage) фильтра. Если таковые имеются сохраняем их в массив $arSeo, а дальше дополнительно проверяя каждое конкретное значение устанавливаем соответствующее свойство страницы.
Блок с SEO-текстом можно красиво оформить и вывести под списком товаров попавших в выборку. Что же нам дал такой механизм? Теперь мы можем «выжать» семантическое ядро сайта по максимуму и фактически для каждой страницы задать уникальный title, keywords, description и т.д. Создава для каждого низкочастотного запроса например «Красное шёлкове платье, фасон сарафан, размера L» — отдельную страницу с уникальным URL и заголовками (страницу результатов фильтра) на которй представить пользователю ассортимент моделей товаров удовлетворяющих его запросу. А это в свою очередь улучшение поведенческих факторов и повышение конверсии, т.к. посетитель сайта сразу получает страницу именно с тем товаром что он искал.
Давайте создадим несколько элементов для примера. Через SEO инфоблок я создал описание для страницы с фильтром по синему цвету и по цвету + фасону. Получилось следующее:
теперь отфильтровав раздел платья по свойству цвет (цвет = синий) я получаю такой результат:
Отлично! Теперь можно гибко настроить каталог товаров по большому списку низкочастотных конверсионных запросов. Осталось сделать пару настроек чтобы эти страницы лучше проиндексировались.
Скармливаем ссылки поисковому роботу
Во всей этой истории есть один нюанс, поисковый робот сам никак не увидит ссылки на страницы фильтра для которых мы настроили SEO. Как же нам их вывести? Для удобства управления и красоты предлагаю следующее решение. Для разделов каталога добавляем множественное свойство типа «Привязка к элементам инфоблока» и указываем наш SEO-инфоблок. С помощью этой привязки мы сможем выводить в нужных нам разделах блок ссылок-фильтров.
Для создания такой связи, перейдите к редактирванию любого раздела каталога в админке, на вкладке «Доп. поля» есть ссылка «Добавить пользовательское свойство» и настройте привязку к SEO-инфоблоку:
Не забываем отметить галочку «Множественное», т.к. потом сделать созданное пользовательское поле множественным не получится, придётся пересоздавать. А нам нужно именно множественное свойство.
Своё свойство я назвал «Быстрые ссылки», а код поля задал как UF_SEO_ITEMS. Теперь давайте установим несколько связей для теста. В своём SEO-инфоблоке я создал несколько элементов описывающих различные страницы фильтра, они все относятся к разделу «Платья». Переходим редактированию раздела платья, вкладка «Доп. поля» и в свойстве «Быстрые ссылки» выбираем те элементы SEO-инфоблока которые относятся к этому разделу, у меня таких два «Платья синего цвета» и «Синие платья футляр».
Теперь нужно вывести их посетителю сайта. Идём в компонент каталога, ищем там компонент catalog.section, у меня это папка /bitrix/templates/#шаблон_сайта#/components/bitrix/catalog/#имя_шаблона_компонента#/bitrix/catalog.section/.default/ нас интересует файл result_modifier.php и вставляем следующий код:
//Получаем быстрые ссылки текущего раздела
$seoItems = array();
$arSectionSelect = array("ID", "UF_SEO_ITEMS");
$arSectionFilter = array("IBLOCK_ID"=>$arParams["IBLOCK_ID"], "ID"=>$arResult["ID"]);
$dbSectionList = CIBlockSection::GetList(array(), $arSectionFilter, false, $arSectionSelect);
while($arSection = $dbSectionList->GetNext()){
$seoItems = $arSection["UF_SEO_ITEMS"];
}
//Получаем Анкро и URL быстрых ссылок раздела
$fastUrlsList = array();
$arSelect = Array("ID", "NAME", "PROPERTY_PAGE_URL");
$arFilter = Array("IBLOCK_ID"=>IBLOCK_SEO, "ACTIVE"=>"Y", "ID"=>$seoItems);
$res = CIBlockElement::GetList(array("SORT"=>"ASC"), $arFilter, false, false, $arSelect);
while($ob = $res->GetNextElement()){
$arFields = $ob->GetFields();
$fastUrlsList[] = array(
"NAME" => $arFields["NAME"],
"URL" => $arFields["PROPERTY_PAGE_URL_VALUE"],
);
}
//Сохраняем результат в кеш компонента
if($fastUrlsList){
$arResult["FAST_URL_LIST"] = $fastUrlsList;
$this->__component->setResultCacheKeys(array("FAST_URL_LIST"));
}
В результате получаем вот такой блок с ссылками на страницы фильтра, но что же они нам дают?
Во-первых их будет видеть робот проходя по странице раздела, во-вторых это улучшение юзабилити. Теперь клиент переходя в раздел платья будет видеть блок быстрых ссылок-фильтров (напр. Вечерние платья, Платья больших размеров, Платья для выпускного и т.д.) перейдя по которым он попадёт на страницу с товарами категории отфильтрованную по определённому набору параметров (размер, цвет, фасон, тип, назначение и т.д.) что избавит его от необходимости самому использовать фильтр.
В третьих мы разбавляем анкор-лист документа низкочастотниками (НЧ), что позволяет более широко охватить тематику раздела (в данном случае раздела платья).
Комментарий от SEO специалиста Вадима Кабаева
Знаю что программисты обычно не очень жалуют сеошников, но так как именно сеошникам в дальнейшем пользоваться данным модулем вставлю свои 3 копейки.
Сразу для понимания
В гугле закрывать от индексации нужно через meta тег robots со значением noindex. Либо noindex добавлять в HTTP-заголовок X-Robots-Tag. Работает для Яндекса и Гугла. Robots.txt не решает вопрос закрытия от индексации для Гугла. Сканирование и индексация это два разных процесса.
Теперь по работе фильтра
Возможно данная реализация часть из ниже написанного решает, но всё равно напишу.
- При выборе двух и более значений внутри одного свойства, такие страницы не должны индексироваться. /cvet-sinii-or-white/fason-futlar/
- Нужно строго соблюдать последовательность в URL, что бы не плодить дубли (/cvet-sinii/fason-futlar/ и /fason-futlar/cvet-sinii/ дубли)
- Часто нужны правила перемножения. Внутри раздела может быть 10 свойств (цвет, материал, фасон, сезон, бренд, размер и т.д.). Если мы начнём генерить страницы перемножением всё на всё, мы можем получить страницы пустышки (без поискового спроса) «Платье синее из шерсти футляр летнее Бренд 42 размера…»
Такие страницы нужны не на всех сайтах, а в некоторых случаях могут даже навредить. - Краулинговый бюджет. На каждый сайт ПС выделяют лимит по кол-ву страниц для обхода в сутки, так как мощности ПС не бесконечны. Создавая страницы без спроса мы можем расходовать наш краулинговый бюджет не эффективно. Поэтому нам нужно составлять список таких страниц и закрывать их в Robots.txt. Идеально наличие в URL паттернов по которым можно страницы закрывать от сканирования.
- Шаблоны для страниц фильтров — хорошо бы использовать шаблоны для генерации мета-данных, заголовков и текстов.
- На некоторых сайтах встречаются страницы полученные фильтрами без товаров. Это тоже косяк.
Подведём итоги
В результате проделанной работы мы получили инструмент позволяющий нам расширить семантику сайта до необъятных размеров, при этом всё аккуратно впишется в функционал сайта, страницы результатов фильтра будут более информативны. Что в конечном счёте приведёт к увеличению поискового трафика и конверсии (что собственно и нужно любому интернет-магазину).
Научите, пожалуйста, как в robots.txt закрыть для индексации такие страницы: https://site.ru/catalog/aksessuary/podsumki-i-patrontashi/filter/clear/apply/ но, чтобы при этом были разрешены, например, такие: https://site.ru/ritual-graf/filter/type_photo-is-angely/apply/ Спасибо.
По идеи так: Disallow: */filter/clear/apply/ Т.е. любой адрес на сайте оканчивающийся строкой /filter/clear/apply/ (на сколько помню страница сброса фильтра). На самом деле если вы URL нигде не оставили на подобную страницу, поисковик на неё внимание особого не обратит. Или у вас прям проиндексированы и находятся в поиске такие страницы?
Вы говорите: Нужно строго соблюдать последовательность в URL, что бы не плодить дубли (/cvet-sinii/fason-futlar/ и /fason-futlar/cvet-sinii/ дубли) А как соблюдать последовательность, если движок генерирует молча. И что делать с таким дублями. Как им прописать запрет для индексирования. Спасибо.
Это комментарий SEO-специалиста Вадима Кабаева, он описал этот пункт как общее правило, выше он пишет "...Возможно данная реализация часть из ниже написанного решает, но всё равно напишу....". Да, умный фильтр в 1С Битрикс не создаёт такие дубли. Последовательность частей URL созданных на основе свойств инфоблока, будет зависеть от значения сортировки свойства в настройках инфоблока. Например если свойство цвет имеет сортировку 100, а фасон 200, то они так и будут представлены в URL умного фильтра /cvet-is-sinii/fason-is-futlar/ . От себя могу добавить, что не стоит мешать категории каталога со свойствами фильтра. Например если у вас есть раздел "Телевизоры LG" то в фильтре нельзя делать фильтрацию по бренду LG. Иначе мы получим дубль, т.е. страницу раздела LG и страницу с результатом фильтра по бренду LG.
Как прописать запрет для индексации таким страницам /cvet-sinii-or-white/fason-futlar/ (в адресе которых есть "or". Я не программист. Спасибо.
Ответил ниже про шаблоны в robots.txt
Подскажите, пожалуйста, как закрыть для индекс страницы такого типа /tags-is-aktsionnye-or-semeynye/apply/ что надо прописать в роботсе (я не программист). Спасибо.
В файле robots.txt добавьте Disallow: /tags-is-aktsionnye-or-semeynye/apply/ Если у вас группа таких страниц в которых часть адреса например после -or- меняется и вам нужно закрыть их все используйте символ * , он значает "любой символ, любое количество раз". Т.е. правило Disallow: /tags-is-aktsionnye-or-*/apply/ скроет все урлы которые начинаются с /tags-is-aktsionnye-or- и заканчиваются /apply/ . Обязательно проверяйте правильность настройки robots.txt инструментами Яндекс.Вебмастера https://webmaster.yandex.ru/tools/robotstxt/
Хорошо, спасибо большое за оперативные ответы и помощь )
Да, все советы помогли в итоге теперь все работает , спасибо большое , только есть пару загвоздок. В ссылке при результате цены чпу выходит такого рода price-тыры-пыры-from-2500-to-123123 . На одном сайте нашел инструкцию по изменению файла класса , но оно не помогает https://g-rain-design.ru/blog/posts/use-catalog-smart-filter/ (удалите если нельзя ссылки приводить). Статья старая довольно 2018 год и какие то изменения и мею место быть. Просто поменять код не могу в типах цен. Если задаю другой код , допустим вместо Розничная ставлю roznichnaya то ползунок цены вобще пропадает и не выводится в каталоге ? выбрать цену нельзя. В компоненте catalog в настройках цен и фильтра добавлял ену с новым кодом и результат тот же. Такое ощущение вывод цены строго привязан к захардкоженному коду , но не могу найти где .И тут же вопрос можно ли как то цену в урле убрать в последние ряды ? т.е сейчас идет price/cvet/razmer , а хочется cvet/razmer/price .Спасибо
Вообще смена кода цены в настройках типов цен в админке должна помогать. Т.е. поменяли код, пересоздали фасетный индекс, сбросили кеш, всё должно быть ок (возможно в настройках компонента каталога нужно перевыбрать тип цены). По поводу смены порядка /price/ в конце урла после свойств тут надо костылить, а именно переписать class.php компонента catalog.smart.filter методы convertUrlToCheck(), makeSmartUrl() и другие. Для SEO это роли никакой не сыграет, я бы не стал заморачиваться.
Вобще все это делал , по логике и правда должно работать, + перевыбирал цену в настройках каталога , но не отрисовывается в умном фильтре данное поле после смены кода. Ну да ладно, это наверное все таки не к этой теме вопрос и не совсем уместно будет , в любом случае большое спасибо )
Доброго времени суток. Создал инфоблок СЕО.Создал ему нужные свойства . В section.php после указанного блока вставляю вышеприведенный код по получению сео параметров. В итоге $arFields возвращает айдишники элементов инфоблока , без их свойств и только через arProps получается до них достучаться , и то это уже не по инструкции выходит Возвращаемые значения Array ( [ID] => 34223 [~ID] => 34223 ) Array ( [ID] => 34346 [~ID] => 34346 )
Попробуйте изменить место хранения свойств на отдельную таблицу (по умолчанию свойства хранятся в общей таблице), ещё раз убедитесь в правильности написания мнемонических кодов свойств (в инфоблоке код указывается без префикса PROPERTY_, т.е. просто META_KEYWORDS, иногда делают такую ошибку).
Да , я с этим разобрался , теперь столкнулся с тем , что во первых сами мета теги не меняются а странице , если они уже заданы, как бы ShowPageProperty показывает нужные значение , а в теге head как были базово прописанные так и остаются.Это первое.Что во вторых . У меня в инфоблоке два элемента для двух результатов фильтрации , и как я понял всегда у меня устанавливаются свойства из последнего элемента , для всех опять таки страниц
Вложенность комментариев закончилась, отвечу тут на последний. Раз у вас меняются заголовки на всех страницах, значит у вас не корректно отрабатывает условие. Я в коде сравниваю текущий адрес $APPLICATION->GetCurPage() т.е. от корня сайт, без домена и протокола, например /catalog/televizori/filter/color-is-red/ . Проверьте что вы сравниваете, выведете переменные через var_dump() посмотрите что в них. То, что вы убрали /filter/ на это не повлияет. Убранный /filter/ может в некоторых случаях сделать невозможным разбору текущего урла, т.е. битрикс просто не поймёт что это за адрес, просто раздел, страница фильтра или ещё что-то и иногда может выдать ошибку типа "Элемент не найден" или "Раздел не найден".
Тут может быть ситуация, когда вы пытаетесь задать свойства страницы до того как будет вызван компонент списка товаров, т.к. он сам устанавливает title, description и т.д. Методы SetPageProperty() и SetTitle() должны строго вызываться после catalog.section. Ещё возможно у вас не правильно сделан header.php шаблона. Вместо $APPLICATION->ShowHead(); вызывается что-то ещё. А может у вас решение от Аспро, где есть тонна кастомных компонентов которые работают по какой-то своей логики и они перебивают вам установку свойств страницы. Надо тестировать.
Да , так работает , но меняет на всех страниц . Может ссылку надо в определенном формате прописывать ? Я всю целиком прописываю https//.... , хотя и от каталога вроде тоже не особо работает. И еще в настройках умного фильтра убрал в шаблоне ссылки /filter - может это как то повлиять ?
Этим кодом у меня не отображаётся h1 вообще.
А как вы h1 выводите в шаблоне?
Спасибо за такой развёрнутый комментарий! )
Здравствуйте! Мучаюсь уже несколько дней. Поставщик предоставил сайт со своими доработками. Не могу найти правильный section.php... добавил код по адресу: /bitrix/components/forest/section.php Инфоблок имеет идентификатор 15 - прямо в коде указал этот идентификатор. Код срабатывает на всех страницах, а не только на нужной.
Вы можете найти нужный файл шаблона через интерфейс эрмитаж, нужно выбрать пункт "Редактировать шаблон компонента" в режиме правки
Это решение только с виду хорошее. На большом каталоге может оказаться западнёй. SEO'шник радуется. Вводит данные и всё отображается. Но потом вспоминает что надо бы эти 1000 записей что он внёс руками занести в sitemap.xml. Для этого находится решение. Просто в символьный код каждому элементу инфоблока нужно прописать относительную ссылку, потом указать в [Маркетинг]->[Настройка sitemap] брать этот инфоблок для генерации sitemap (вариант с sitemap_filter.php, который здесь описан, не потребуется если редакция Стандарт и выше). Вроде бы тоже работает. Но потом оказывается, что 1С меняет этот каталог несколько раз в день. И эти SEO-урлы сегодня есть, а завтра 404. И такой sitemap.xml будет содержать эти руками вбитые ссылки приводящие на 404. Нужно будет опять какой-то обработчик лепить чтобы после каждого обновления запускался. В общем, очень высока вероятность, что эта длинная дорога по наполнению SEO-инфоблока приведёт в тупик в плане валидного sitemap ну или как минимум к какому-то обработчику на каждое обновление. Чем больше каталог тем хуже ситуация.
На самом деле не так сложно из компонента умного фильтра выдернуть функционал который проверяет URL на 404 и/или на наличие товаров по данному урлу. Он срабатывает каждый раз когда пользователь выбирает свойства в фильтре, а компонент выводит tooltip с количеством найденных по фильтру товаров. По поводу 1С которая меняет каталог несколько раз в день, никогда такого не встречал, меняется максимум остатки, цены на некоторый товар, более того чтобы SEO не ломалось эти товары не деактивируются (отпадает проблема с 404-й). А вместо кнопки купить выводится что-то вроде "под заказа" или "узнать о поступлении" и т.д. за редким исключением когда товар вообще выводится из оборота, он может быть деактивирован и тогда ссылка на страницу фильтра станет не актуальной. Подобные этому решения не раз обкатывались на крупных интернет-магазинах и никогда ни я ни мои коллеги не сталкивались с теми проблемами о которых вы говорите.
Не совсем понимаю ваш ответ. Суть моего комментария только в невалидных ссылках итогового sitemap.xml, который генерируется на основе SEO-инфоблока (+ может ещё какие-то источники). Как работает каталог не важно. Работает и ладно. SEO-инфоблок никак не связан ни с каталогом ни с другими страницами SEO-данные которых он может менять. SEO-инфоблок существует сам по себе и в нём URL-адреса задаются текстом. В нём нет обратной связи с каталогом или другими страницами сайта. И суть в том что в sitemap.xml будут висеть записи на несуществующие страницы, которые стали таковыми после обновления каталога. Не важно руками обновили каталог или через 1С, раз в день или раз в месяц. В каталоге элемент стал неактивным, а адрес по которому этот элемент (или даже раздел) стал 404. А в вашем SEO-инфоблоке запись так и осталась висеть. Её руками оттуда никто не убрал. И из SEO-инфоблока она благополучно попадает в sitemap.xml. Робот Яндекса или Google или др. читает этот sitemap.xml и попадает на страницу с 404. Это ошибка. Только об этой ошибке я хотел предупредить.
Я хотел сказать что связь между SEO инфоблоком и каталогом не так сложно сделать. Возможно я добавлю это в статью (или сделаю в отдельной) позже. Спасибо за ваш комментарий и идею для развития темы!
Добрый день. как правильно выводить Header? у меня он на любой странице один и тот же выводится. пробую вот так: ShowTitle($currentPageSeo["HEADER"]);?>
$APPLICATION->ShowTitle(false) это для h1 в шаблоне сайта, а вот чтобы он вывел нужное значение для страницы фильтра, вот так $APPLICATION->SetTitle($currentPageSeo["HEADER"]); т.е. значение из SetTitle() подставится в то место где у вас выводится ShowTitle(false)
Добрый день. Вроде все сделал по инструкции, но почему то заголовок H1 выводится на всех страницах каталога.
Добрый день. А как сделать, что бы и страницы пагинации для фильтра оставались с тем же тайтлом +page2, и так же с заголовком и тп
Или я что то неправильно делаю; Или на сегодняшний день несколько раз ядро менялось, другой алгоритм; Или что то упустил... Но не работает. Заголовок меняется у всех категорий, даже без фильтра description и keywords не меняется. что я сделал: 1. Создал инфоблок со свойствами: title, meta-keywords, meta-description, h1, SEO — текст, URL страницы. Назначил символьный код соответственно: TITLE, KEYWORDS, DESCRIPTION, HEADER, SEO_TEXT, PROPERTY_PAGE_URL 2. Создал элемент, заполнил поля и поле URL страницы написал https://мойсайт.ру/sprav/346/filter/gorod-is-zelenograd/ 3. в файле section_vertical.php разместил код перед $intSectionID = $APPLICATION->IncludeComponent( "bitrix:catalog.section", ".default", array(....
А вы получаете текущую страницу по "PROPERTY_PAGE_URL"=>$currentPageUrl ? Проверяете есть ли результат а потом только вызываете $APPLICATION->SetPageProperty() и $APPLICATION->SetTitle() ? Если заголовки меняются везде, значит проверка условия некорректно работает. Если не меняется description и keywords, надо смотреть как они задаются в шаблоне, возможно там что-то отличное от $APPLICATION->ShowHead() либо вы вызываете этот функционал ДО того как отработает компонент списка товаров и он (компонент catalog.section) просто затирает своими значениями. Пользовался этим функционалом совсем недавно на свежей версии ядра, всё должно работать.
ДАЙ БОГ тебе здоровья добрый человек. Ни то что бы я не знал как это всё сделать, но всегда что то да упустишь при настройки фильтра, и сегодня я кое что , как всегда забыл, и вот она статья моей мечты, где все по полочкам и по порядку ... СПАСИБО !!!
когда вставляю код: //Получаем SEO параметры текущей страницы $currentPageUrl = $APPLICATION->GetCurPage(); $currentPageSeo = array(); $arSelect = Array("ID", "PROPERTY_TITLE", "PROPERTY_META_KEYWORDS", "PROPERTY_META_DESCRIPTION", "PROPERTY_HEADER", "PROPERTY_SEO_TEXT"); $arFilter = Array("IBLOCK_ID"=>IBLOCK_SEO, "ACTIVE_DATE"=>"Y", "ACTIVE"=>"Y", "PROPERTY_PAGE_URL"=>$currentPageUrl); $res = CIBlockElement::GetList(Array(), $arFilter, false, false, $arSelect); while($ob = $res->GetNextElement()){ $arFields = $ob->GetFields(); $currentPageSeo = array( "TITLE" => $arFields["PROPERTY_TITLE_VALUE"], "KEYWORDS" => $arFields["PROPERTY_META_KEYWORDS_VALUE"], "DESCRIPTION" => $arFields["PROPERTY_META_DESCRIPTION_VALUE"], "HEADER" => $arFields["PROPERTY_HEADER_VALUE"], "SEO_TEXT" => $arFields["PROPERTY_SEO_TEXT_VALUE"]["TEXT"], ); print_r($arFields);?>$currentPageUrl не срабатывает, может в этом дело? и не пойму почему не срабатывает...
Разобрался, у меня Символьный код был у URL страницы "PROPERTY_PAGE_URL" а нужно было "PAGE_URL" Сейчас буду копать почему description и keywords не прописываются Если есть какие то намеки, намектните)
Добрый день, можете пожалуйста подробнее пояснить как реализовать, не получается.... а именно застрял на пункте вставки кода после вызова компонента catalog.section IncludeComponent( "bitrix:catalog.section", $template, Array(.....)); ?> Но ничего не отображает...
Напишите на почту, если вопрос актуальны ещё
Спасибо за подробный разбор! Сохранил. Попозже попробую воспроизвести на нужном сайте.
Спасибо за описание реплизации. Никак не могу вывести сео-текст и фастлинки, все уже перепроверил по 100 раз, в чем могут быть загвоздки?
Проверьте переменные, часто в шаблонах они называются одинаково, вашу переменную фильтра что-то могло переопределить, попробуйте создать отдельную страницу и GetList-ом получить список фастлинков, часто случается досадная опечатка и потом возишься с этим по несколько часов.
Спасибо за решение! Подскажите, каким образом можно добавить урлы из инфоблока с СЕО данными в sitemap.xml. Пробовал урлы для прописывать не в свойство а в поле "символьный код". Но тогда после генерации файла sitemap.xml слеши в символьном коде заменяются на html сущности и получается урл вида https://site.ru/%2Fcatalog%2Fsection%2Ffilter%2Fcolor-is-red%2F/
Пишите php скрипт sitemap_filter.php в .htaccess пишите правило RewriteRule ^sitemap_filter.xml$ sitemap_filter.php [L], чтобы при обращении к ваш_сайт/sitemap_filter.xml запускался файл sitemap_filter.php, добавляете информацию о sitemap_filter.xml в robots.txt (убедитесь в яндекс вебмастере что новый robots.txt загружен). Далее в sitemap_filter.php подключаете пролог битрикса и обычным CIBlockElement::GetList() достаёте ссылки фильтра с анкорами из SEO инфоблока, формируете в php xml карту сайта (ссылки фильтра) перед выводом отдаёте заголовки header("content-type: text/xml;"); всё. Каждый раз при обращении робота к sitemap_filter.xml он будет получать список свежих урлов фильтра.
Я сейчас просто пилю портал, так сказать для себя)) хочу чтобы все чинно благородно было) И меня как сеошника раздражает очень is, меня всегда удивляли такие закидоны, вот нафига там от баллды вставлятьэтот предлог, проще и эстетичней былобы "-"
Я думаю что «is» служит для разбора URL по какой-то регулярке, чтобы компонент каталога понял что от него хотят, а вот простое тире может встретится в мнемоническом коде мвойства и ввести компонент в заблуждение ))
Просто Битрикс заявлен как конструктор на котором можно собрать все что угодно., и вот я проектирую сайт у которого все УРЛы транслитом и тут опа появляется is, не к селу ни к городу. Меня и так раздражает что нужно указывать в УРЛ filterпо которому ничего не откроется. Короче нужно завязывать с перфекционизмом))
Здравствуйте! Подскажите пожалуйста: 1. При создании инфо блока что указывать в: А) URL страницы информационного блока: Б) URL страницы раздела: В) URL страницы детального просмотра: 2. Какой код указывать каждому свойству, подскажите пожалуйста. 3. Теперь необходимо в файле шаблона section.php комплексного компонента каталога после вызова компонента catalog.section разместить следующий код - тут не понял, можно по подробнее куда его. 4. /bitrix/php_interface/init.php - у меня нет такого файла Буду благодарен за ответ!
1) При создании инфоблока А,Б и В указывать не надо, вы ведь не собираетесь выводить его содержимое в публичную часить. 2) Смотрите по программному коду в статье, если в GetList() написано PROPERTY_TITLE (PROPERTY_TITLE_VALUE) значит код самого свойства будет TITLE, т.к. PROPERTY_ и _VALUE - это служебные конструкции (см. документацию https://dev.1c-bitrix.ru/api_help/iblock/classes/ciblockelement/getlist.php) 3) попробую написать дополнение к статье, более подробно раскрывающее этот момент 4) /bitrix/php_interface/init.php - создаёте сами если нет (доки: http://dev.1c-bitrix.ru/learning/course/?COURSE_ID=43&LESSON_ID=2916)
Добрый день. Подскажите, пожалуйста, как найти аналог файла section.php, где вызывается catalog.section? Файла именно с таким названиям как ни ищу, не могу найти. Заранее спасибо за ответ.
В некоторых решениях есть файлы section_horizontal.php или section_vertica.php которые подключаются в зависимости от визуальных настроек каталога. Так же некоторые программисты меняют поведение комплексного компонента, добавляя туда свои файлы и правила их вызова. Но стандартно в комплексном компоненте каталога, в файле sections.php - список разделов, section.php - список товаров и element.php - товар. Я бы посоветовал вот что: 1. убедитесь что шаблон вашего каталога (комплексного компонента каталога) скопирован в текущий шаблон сайта, т.е. лежит в папке /bitrix/templates/имя_шаблона_сайта/components/bitrix/catalog/ 2. запустите поиск по файлам кода вызова компонента catalog.section, ограничив область поиска папкой /bitrix/templates/. Если у вас сайт на основе готового решения с marketplace то catalog.section может вызываться где угодно, уже попадались такие сайты.
Подскажите, какой Тип данных указывать при добавлении пользовательского свойства?
Не совсем понятно, если вы про пользовательское свойство для быстрых ссылок раздела то "Привязка элементов к инф.блокам" (на скриншоте это кстати есть =) )
разобрался с полями. Все настроил и заработало. Только одна проблема, почему то decription рубит до первой буквы: все остальные поля выводит нормально. Должно быть
хотя print_r($currentPageSeo); description выводит правильно
$APPLICATION->SetPageProperty("description", strip_tags($currentPageSeo["DESCRIPTION"]["TEXT"])); заменил на $APPLICATION->SetPageProperty("description", strip_tags($currentPageSeo["DESCRIPTION"])); и все заработало.
и кстати, вы пишите что робот не видит умные ссылки , все он видит. Я бы рекомендовал закрыть в robots.txt права на индексирование ссылки умного фильтра и открывать только те, что вы сделали. Тогда индексироваться будут только те что вам нужны, а не 1000 ссылок с одинаковым контентом.
И кстати, забыл, автору большое спасибо. На маркет плейсе подобный модуль стоит 15 тысяч рублей )) А тут все бесплатно и работает ни чуть не хуже. И самое главное можно все допилить под себя ))
Добрый день. Код отличный и заработал с пол оборота. Но вопрос - можно ли сделать так, что бы он требовал не полного совпадения PAGE_URL и адреса страницы а частичного. Например если PAGE_URL будет "tovar", то title, description и прочее применятся к адресам вроде /catalog/tovar/ или /catalog/tovar/model/? Или это будет уже совсем другая история?
Думаю так можно будет легко словить баг при котором одним страницам будут проставлены несоответствующие мета-данные. Да, это другая история )
Вопрос. Если изменять xml_id у свойства, тогда обмен 1с с битриксом будет создавать новое свойство. как с этим быть ?
Вообще чтобы в 1С ке мнемонический код свойства (XML_ID если хотите) был осмысленным, а не "asf32sdvas34234kj34jnj343" -какая-нибудь хэш строка, можно забить товар со свойствами на сайт, поставит в 1С модуль обмена от 1С Битрикс залить с товары с сайта в 1С а потом настраивать обмен с сайтом (из 1С на сайт) иначе никак (на сколько я знаю). В 1С-ке XML_ID свойств править нельзя, она сама их там как-то создаёт.
Спасибо за статью!!
Не совсем понял, как "сохраните его идентификатор в константу IBLOCK_SEO в файл /bitrix/php_interface/init.php " - подскажите, пожалуйста код, сейчас подставил просто id инфоблока. Работает все, кроме вывода на страницу сео текста и быстрых ссылок.
Сергей используйте функцию php define() ля сохранения константы.
Никак не пойму как вывести на страницу категории seo-текст. Не подскажите как это сделать - в каком файле, какой код вставить?
Файл section.php в шаблоне комплексного компоненте каталога. Т.е. в начале копируете шаблон (если он ещё не скопирован), затем идёте в папку с шаблоном компонента /bitrix/templates/...ваш_шаблон.../components/bitrix/catalog/...название_шаблона_компонента_catalog.../section.php в нём ищите вызов компонента catalog.section и после вставляйте код из статьи http://joxi.ru/v29Q16GT3OMbl2 . P.S. все пути я описал для стандартного комплексного компонента, в некоторых готовых решениях разработчики отклоняются от общих требований и делают как им заблагорассудится, в таком случае надо искать.
Вот на этом этапе загвоздка . Статья полезная , уже видел 2 рерайта на нее, но там даже менее понятно написано. Куда именно этот кусок кода вставлять и как? Нашел файл, куда только не пытался вставить, ничего не помогло. Содержание файла init.php: 15 номер инфоблока, коды в ИБ вроде верно задал (скрин их тоже было бы круто в статье привести)
В статье приведены адреса файлов в которые нужно вставить тот или иной код. Если вы говорите про подмену заголовков и описания, то код вставляется после вызова компонента catalog.section в файле section.php. Если речь идёт о быстрых ссылка, то до вызова компонента, в том же файле. Если не разберётесь, напишите на почту с примером кода.
Подскажите, при создании инфоблока, где вы взяли поле: URL страницы, ведь вместо него "символьный код" участвует в генерации урла, если делать свойство элемента, то каким образом обозначить, что бы участвовал в построении урла.
Александр поле "URL страницы" создаётся в свойствах инфоблока, символьный код в этом инфоблоке ( это SEO инфоблок ) не играет никакой роли.
Благодарю за информацию. Подскажите, а если не заполнять все данные SEO инфоблока ( где мы указали URL с данными фильтра) - мы сможем вытащить URL с фильтрами другим способом? Мне надо просто собрать все URL с фильтрами.
Ну конечно. Вы их для sitemap.xml наверняка хотите собрать? Обычным CIBlockElement::GetList();
Я может туплю по страшному, но вот уже пару дней не могу сделать так, чтобы содержимое фильтров не индексировалось в поисковиках. Подскажите плиз.
А зачем вам закрывать их? Вся суть как раз в том, чтобы привести пользователя по узкому НЧ запросу на страницу сайта где он увидит не всё подряд из каталога а только те товары которые ищет. Можете в htaccess добавить правило и закрыть страницы с фильтром одним разом.
Я признаюсь, мало, что понимаю в этом, мне вроде как закрывать то ничего не нужно, хотел только вписать noindex в начале блока фильтра, да вот найти его даже не могу...
Огрооооменое спасибо за статью. Думал сейчас пол дня убью на это, а потратил всего 30 мин! Спасибо, спасибо!
Огромное спасибо за ценную информацию! Было бы интересно прочитать о такой реализации на HL блоках. Благодаря таким людям, как Вы, всегда узнаешь много нового! Огромная просьба также описывать конечный вывод в шаблоне. С выводом текста просто: А вот с выводом быстрых ссылок не уверен, что вывел правильным способом, хотя работает: $fastLink):?>
Рад что статья вам помогла. Я планирую её переработать в ближайшее время, в комментариях посетители оставили несколько ценных вопросов.
Добрый день! Спасибо за отличную статью! Подскажите, пожалуйста, можно ли как то вывести под своим URL (например /catalog/lustry-50-cm/) страницу с результатом фильтра (например /catalog/lyustry/filter/vysota-from-50-to-50/apply/)? Сделать, так сказать, "ЧПУ над ЧПУ". Подробнее: Нужный URL псевдо-категории: /catalog/lustry-50-cm/ URL умного фильтра: /catalog/lyustry/filter/vysota-from-50-to-50/apply/ Как можно вывести по нужному URL (/catalog/lustry-50-cm/) страницу с результатом фильтра (/catalog/lyustry/filter/vysota-from-50-to-50/apply/)?
Можно, на маркетплейс есть готовое решение с демкой, я его ещё не ковырял, поэтому по коду точно сказать не могу как это делается. Там на событиях пролога как-то это делается. Как разберусь, напишу статью ))
вот код который для умного фильтра, он подставляет кирилицу. правда это костыль, который будет слетать при обновлении фильтра. $url_id = CUtil::translit(toLower($enum["VALUE"]), "ru"); и еще , отключайте в фильтре "ACTIVE_DATE"=>"Y", "ACTIVE"=>"Y", так как это очень грузит запрос, лучше руками удалить не нужные елементы, чем каждый раз это будет делать запрос.
Спасибо за статью, но вот несколько вопросов, как говориться чтобы допилить до идеала: 1) как из чпу убрать "is" нахрен он там не нужен, просто оставить "-" 2) как быть с ответами сервера, нужна 404 ошибка, если все подряд пихать в урл, то сервак все равно отдает ответ 200 3) И возможно к выдаче фильтра добавить хлебных крошек?
Ну смотрите, 1) «is» к сожалению безболезненно убрать нельзя. Уже стучался в тех.поддержку по этому поводу, там нужно залезать в ядро и что-то там перепиливать, а делать это не очень хочется. Собственно для SEO «is» не помеха. 2) По поводу 404-й там всё ок, просто включите в настройках комплексного компонента опцию 404-й ошибки. Всё подряд в url пихать не получиться. 3) Хлебные крошки добавить можно в том же catalog.section создать файл component_еpilog.php и через CMain::AddChainItem() добавить всё что угодно. 1 и 3-й пункты это скорее для эстетики. Вся суть плюшки описанной в статье создать по средствам умного фильтра большое количество страниц (результатов фильтра) на которые будт приходить пользователи по низкочастотным конверсионным запросам (аля «купить телевизор определённой модели, диагонали и серого цвета»).