Одним из преимуществ интернет-магазинов на 1С Битрикс на мой взгляд является наличие не так давно доведённого до ума «умного фильтра». Дело в том что теперь фильтр получил возможность выдавать результаты по вполне симпатичным ЧПУ адресам. А это в свою очередь даёт большие возможности по улучшению SEO магазина, большому охвату НЧ запросов, созданию «посадочных страниц» прямо в структуре каталога и многое другое. Давайте по подробнее рассмотрим все эти плюшки.
ЧПУ в умном фильтре 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 разместить следующий код:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
//Получаем 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 и вставляем следующий код:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
//Получаем быстрые ссылки текущего раздела $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 паттернов по которым можно страницы закрывать от сканирования.
- Шаблоны для страниц фильтров — хорошо бы использовать шаблоны для генерации мета-данных, заголовков и текстов.
- На некоторых сайтах встречаются страницы полученные фильтрами без товаров. Это тоже косяк.
Подведём итоги
В результате проделанной работы мы получили инструмент позволяющий нам расширить семантику сайта до необъятных размеров, при этом всё аккуратно впишется в функционал сайта, страницы результатов фильтра будут более информативны. Что в конечном счёте приведёт к увеличению поискового трафика и конверсии (что собственно и нужно любому интернет-магазину).
Спасибо за статью, но вот несколько вопросов, как говориться чтобы допилить до идеала:
1) как из чпу убрать «is» нахрен он там не нужен, просто оставить «-»
2) как быть с ответами сервера, нужна 404 ошибка, если все подряд пихать в урл, то сервак все равно отдает ответ 200
3) И возможно к выдаче фильтра добавить хлебных крошек?
Ну смотрите,
1) «is» к сожалению безболезненно убрать нельзя. Уже стучался в тех.поддержку по этому поводу, там нужно залезать в ядро и что-то там перепиливать, а делать это не очень хочется. Собственно для SEO «is» не помеха.
2) По поводу 404-й там всё ок, просто включите в настройках комплексного компонента опцию 404-й ошибки. Всё подряд в url пихать не получиться.
3) Хлебные крошки добавить можно в том же catalog.section создать файл component_еpilog.php и через CMain::AddChainItem() добавить всё что угодно.
1 и 3-й пункты это скорее для эстетики. Вся суть плюшки описанной в статье создать по средствам умного фильтра большое количество страниц (результатов фильтра) на которые будт приходить пользователи по низкочастотным конверсионным запросам (аля «купить телевизор определённой модели, диагонали и серого цвета»).
Я сейчас просто пилю портал, так сказать для себя)) хочу чтобы все чинно благородно было) И меня как сеошника раздражает очень 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 тысяч рублей )) А тут все бесплатно и работает ни чуть не хуже. И самое главное можно все допилить под себя ))
Вопрос. Если изменять xml_id у свойства, тогда обмен 1с с битриксом будет создавать новое свойство. как с этим быть ?
Вообще чтобы в 1С ке мнемонический код свойства (XML_ID если хотите) был осмысленным, а не «asf32sdvas34234kj34jnj343» -какая-нибудь хэш строка, можно забить товар со свойствами на сайт, поставит в 1С модуль обмена от 1С Битрикс залить с товары с сайта в 1С а потом настраивать обмен с сайтом (из 1С на сайт) иначе никак (на сколько я знаю). В 1С-ке XML_ID свойств править нельзя, она сама их там как-то создаёт.
вот код который для умного фильтра, он подставляет кирилицу. правда это костыль, который будет слетать при обновлении фильтра.
$url_id = CUtil::translit(toLower($enum[«VALUE»]), «ru»);
и еще , отключайте в фильтре «ACTIVE_DATE»=>»Y», «ACTIVE»=>»Y»,
так как это очень грузит запрос, лучше руками удалить не нужные елементы, чем каждый раз это будет делать запрос.
Спасибо за статью!!
Не совсем понял, как «сохраните его идентификатор в константу 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 мин! Спасибо, спасибо!
Спасибо за описание реплизации. Никак не могу вывести сео-текст и фастлинки, все уже перепроверил по 100 раз, в чем могут быть загвоздки?
Проверьте переменные, часто в шаблонах они называются одинаково, вашу переменную фильтра что-то могло переопределить, попробуйте создать отдельную страницу и GetList-ом получить список фастлинков, часто случается досадная опечатка и потом возишься с этим по несколько часов.
Добрый день!
Спасибо за отличную статью!
Подскажите, пожалуйста, можно ли как то вывести под своим 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/)?
Можно, на маркетплейс есть готовое решение с демкой, я его ещё не ковырял, поэтому по коду точно сказать не могу как это делается. Там на событиях пролога как-то это делается. Как разберусь, напишу статью ))
Спасибо за решение!
Подскажите, каким образом можно добавить урлы из инфоблока с СЕО данными в 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 он будет получать список свежих урлов фильтра.
Добрый день.
Код отличный и заработал с пол оборота. Но вопрос — можно ли сделать так, что бы он требовал не полного совпадения PAGE_URL и адреса страницы а частичного. Например если PAGE_URL будет «tovar», то title, description и прочее применятся к адресам вроде /catalog/tovar/ или /catalog/tovar/model/?
Или это будет уже совсем другая история?
Думаю так можно будет легко словить баг при котором одним страницам будут проставлены несоответствующие мета-данные. Да, это другая история )
Этим кодом у меня не отображаётся h1 вообще.
А как вы h1 выводите в шаблоне?
Здравствуйте! Мучаюсь уже несколько дней. Поставщик предоставил сайт со своими доработками. Не могу найти правильный section.php… добавил код по адресу: /bitrix/components/forest/section.php
Инфоблок имеет идентификатор 15 — прямо в коде указал этот идентификатор. Код срабатывает на всех страницах, а не только на нужной.
Вы можете найти нужный файл шаблона через интерфейс эрмитаж, нужно выбрать пункт «Редактировать шаблон компонента» в режиме правки
Добрый день, можете пожалуйста подробнее пояснить как реализовать, не получается…. а именно застрял на пункте вставки кода после вызова компонента catalog.section
IncludeComponent(
«bitrix:catalog.section»,
$template,
Array(…..)); ?>
Но ничего не отображает…
Напишите на почту, если вопрос актуальны ещё
Добрый день.
как правильно выводить 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) просто затирает своими значениями. Пользовался этим функционалом совсем недавно на свежей версии ядра, всё должно работать.
разместил код после данного блока:
$intSectionID = $APPLICATION->IncludeComponent(
«bitrix:catalog.section»,
«.default», array(
«IBLOCK_TYPE» => $arParams[«IBLOCK_TYPE»],
«IBLOCK_ID» => $arParams[«IBLOCK_ID»],
«ELEMENT_SORT_FIELD» => $arParams[«ELEMENT_SORT_FIELD»],
«ELEMENT_SORT_ORDER» => $arParams[«ELEMENT_SORT_ORDER»],
«ELEMENT_SORT_FIELD2» => $arParams[«ELEMENT_SORT_FIELD2»],
«ELEMENT_SORT_ORDER2» => $arParams[«ELEMENT_SORT_ORDER2»],
«PROPERTY_CODE» => (isset($arParams[«LIST_PROPERTY_CODE»]) ? $arParams[«LIST_PROPERTY_CODE»] : []),
«PROPERTY_CODE_MOBILE» => $arParams[«LIST_PROPERTY_CODE_MOBILE»],
«META_KEYWORDS» => $arParams[«LIST_META_KEYWORDS»],
«META_DESCRIPTION» => $arParams[«LIST_META_DESCRIPTION»],
«BROWSER_TITLE» => $arParams[«LIST_BROWSER_TITLE»],
«SET_LAST_MODIFIED» => $arParams[«SET_LAST_MODIFIED»],
«INCLUDE_SUBSECTIONS» => $arParams[«INCLUDE_SUBSECTIONS»],
«BASKET_URL» => $arParams[«BASKET_URL»],
«ACTION_VARIABLE» => $arParams[«ACTION_VARIABLE»],
«PRODUCT_ID_VARIABLE» => $arParams[«PRODUCT_ID_VARIABLE»],
«SECTION_ID_VARIABLE» => $arParams[«SECTION_ID_VARIABLE»],
«PRODUCT_QUANTITY_VARIABLE» => $arParams[«PRODUCT_QUANTITY_VARIABLE»],
«PRODUCT_PROPS_VARIABLE» => $arParams[«PRODUCT_PROPS_VARIABLE»],
«FILTER_NAME» => $arParams[«FILTER_NAME»],
«CACHE_TYPE» => $arParams[«CACHE_TYPE»],
«CACHE_TIME» => $arParams[«CACHE_TIME»],
«CACHE_FILTER» => $arParams[«CACHE_FILTER»],
«CACHE_GROUPS» => $arParams[«CACHE_GROUPS»],
«SET_TITLE» => $arParams[«SET_TITLE»],
«MESSAGE_404» => $arParams[«~MESSAGE_404»],
«SET_STATUS_404» => $arParams[«SET_STATUS_404»],
«SHOW_404» => $arParams[«SHOW_404»],
«FILE_404» => $arParams[«FILE_404»],
«DISPLAY_COMPARE» => $arParams[«USE_COMPARE»],
«PAGE_ELEMENT_COUNT» => $arParams[«PAGE_ELEMENT_COUNT»],
«LINE_ELEMENT_COUNT» => $arParams[«LINE_ELEMENT_COUNT»],
«PRICE_CODE» => $arParams[«~PRICE_CODE»],
«USE_PRICE_COUNT» => $arParams[«USE_PRICE_COUNT»],
«SHOW_PRICE_COUNT» => $arParams[«SHOW_PRICE_COUNT»],
«PRICE_VAT_INCLUDE» => $arParams[«PRICE_VAT_INCLUDE»],
«USE_PRODUCT_QUANTITY» => $arParams[‘USE_PRODUCT_QUANTITY’],
«ADD_PROPERTIES_TO_BASKET» => (isset($arParams[«ADD_PROPERTIES_TO_BASKET»]) ? $arParams[«ADD_PROPERTIES_TO_BASKET»] : »),
«PARTIAL_PRODUCT_PROPERTIES» => (isset($arParams[«PARTIAL_PRODUCT_PROPERTIES»]) ? $arParams[«PARTIAL_PRODUCT_PROPERTIES»] : »),
«PRODUCT_PROPERTIES» => (isset($arParams[«PRODUCT_PROPERTIES»]) ? $arParams[«PRODUCT_PROPERTIES»] : []),
«DISPLAY_TOP_PAGER» => $arParams[«DISPLAY_TOP_PAGER»],
«DISPLAY_BOTTOM_PAGER» => $arParams[«DISPLAY_BOTTOM_PAGER»],
«PAGER_TITLE» => $arParams[«PAGER_TITLE»],
«PAGER_SHOW_ALWAYS» => $arParams[«PAGER_SHOW_ALWAYS»],
«PAGER_TEMPLATE» => $arParams[«PAGER_TEMPLATE»],
«PAGER_DESC_NUMBERING» => $arParams[«PAGER_DESC_NUMBERING»],
«PAGER_DESC_NUMBERING_CACHE_TIME» => $arParams[«PAGER_DESC_NUMBERING_CACHE_TIME»],
«PAGER_SHOW_ALL» => $arParams[«PAGER_SHOW_ALL»],
«PAGER_BASE_LINK_ENABLE» => $arParams[«PAGER_BASE_LINK_ENABLE»],
«PAGER_BASE_LINK» => $arParams[«PAGER_BASE_LINK»],
«PAGER_PARAMS_NAME» => $arParams[«PAGER_PARAMS_NAME»],
«LAZY_LOAD» => $arParams[«LAZY_LOAD»],
«MESS_BTN_LAZY_LOAD» => $arParams[«~MESS_BTN_LAZY_LOAD»],
«LOAD_ON_SCROLL» => $arParams[«LOAD_ON_SCROLL»],
«OFFERS_CART_PROPERTIES» => (isset($arParams[«OFFERS_CART_PROPERTIES»]) ? $arParams[«OFFERS_CART_PROPERTIES»] : []),
«OFFERS_FIELD_CODE» => $arParams[«LIST_OFFERS_FIELD_CODE»],
«OFFERS_PROPERTY_CODE» => (isset($arParams[«LIST_OFFERS_PROPERTY_CODE»]) ? $arParams[«LIST_OFFERS_PROPERTY_CODE»] : []),
«OFFERS_SORT_FIELD» => $arParams[«OFFERS_SORT_FIELD»],
«OFFERS_SORT_ORDER» => $arParams[«OFFERS_SORT_ORDER»],
«OFFERS_SORT_FIELD2» => $arParams[«OFFERS_SORT_FIELD2»],
«OFFERS_SORT_ORDER2» => $arParams[«OFFERS_SORT_ORDER2»],
«OFFERS_LIMIT» => (isset($arParams[«LIST_OFFERS_LIMIT»]) ? $arParams[«LIST_OFFERS_LIMIT»] : 0),
«SECTION_ID» => $arResult[«VARIABLES»][«SECTION_ID»],
«SECTION_CODE» => $arResult[«VARIABLES»][«SECTION_CODE»],
«SECTION_URL» => $arResult[«FOLDER»].$arResult[«URL_TEMPLATES»][«section»],
«DETAIL_URL» => $arResult[«FOLDER»].$arResult[«URL_TEMPLATES»][«element»],
«USE_MAIN_ELEMENT_SECTION» => $arParams[«USE_MAIN_ELEMENT_SECTION»],
‘CONVERT_CURRENCY’ => $arParams[‘CONVERT_CURRENCY’],
‘CURRENCY_ID’ => $arParams[‘CURRENCY_ID’],
‘HIDE_NOT_AVAILABLE’ => $arParams[«HIDE_NOT_AVAILABLE»],
‘HIDE_NOT_AVAILABLE_OFFERS’ => $arParams[«HIDE_NOT_AVAILABLE_OFFERS»],
‘LABEL_PROP’ => $arParams[‘LABEL_PROP’],
‘LABEL_PROP_MOBILE’ => $arParams[‘LABEL_PROP_MOBILE’],
‘LABEL_PROP_POSITION’ => $arParams[‘LABEL_PROP_POSITION’],
‘ADD_PICT_PROP’ => $arParams[‘ADD_PICT_PROP’],
‘PRODUCT_DISPLAY_MODE’ => $arParams[‘PRODUCT_DISPLAY_MODE’],
‘PRODUCT_BLOCKS_ORDER’ => $arParams[‘LIST_PRODUCT_BLOCKS_ORDER’],
‘PRODUCT_ROW_VARIANTS’ => $arParams[‘LIST_PRODUCT_ROW_VARIANTS’],
‘ENLARGE_PRODUCT’ => $arParams[‘LIST_ENLARGE_PRODUCT’],
‘ENLARGE_PROP’ => isset($arParams[‘LIST_ENLARGE_PROP’]) ? $arParams[‘LIST_ENLARGE_PROP’] : »,
‘SHOW_SLIDER’ => $arParams[‘LIST_SHOW_SLIDER’],
‘SLIDER_INTERVAL’ => isset($arParams[‘LIST_SLIDER_INTERVAL’]) ? $arParams[‘LIST_SLIDER_INTERVAL’] : »,
‘SLIDER_PROGRESS’ => isset($arParams[‘LIST_SLIDER_PROGRESS’]) ? $arParams[‘LIST_SLIDER_PROGRESS’] : »,
‘OFFER_ADD_PICT_PROP’ => $arParams[‘OFFER_ADD_PICT_PROP’],
‘OFFER_TREE_PROPS’ => (isset($arParams[‘OFFER_TREE_PROPS’]) ? $arParams[‘OFFER_TREE_PROPS’] : []),
‘PRODUCT_SUBSCRIPTION’ => $arParams[‘PRODUCT_SUBSCRIPTION’],
‘SHOW_DISCOUNT_PERCENT’ => $arParams[‘SHOW_DISCOUNT_PERCENT’],
‘DISCOUNT_PERCENT_POSITION’ => $arParams[‘DISCOUNT_PERCENT_POSITION’],
‘SHOW_OLD_PRICE’ => $arParams[‘SHOW_OLD_PRICE’],
‘SHOW_MAX_QUANTITY’ => $arParams[‘SHOW_MAX_QUANTITY’],
‘MESS_SHOW_MAX_QUANTITY’ => (isset($arParams[‘~MESS_SHOW_MAX_QUANTITY’]) ? $arParams[‘~MESS_SHOW_MAX_QUANTITY’] : »),
‘RELATIVE_QUANTITY_FACTOR’ => (isset($arParams[‘RELATIVE_QUANTITY_FACTOR’]) ? $arParams[‘RELATIVE_QUANTITY_FACTOR’] : »),
‘MESS_RELATIVE_QUANTITY_MANY’ => (isset($arParams[‘~MESS_RELATIVE_QUANTITY_MANY’]) ? $arParams[‘~MESS_RELATIVE_QUANTITY_MANY’] : »),
‘MESS_RELATIVE_QUANTITY_FEW’ => (isset($arParams[‘~MESS_RELATIVE_QUANTITY_FEW’]) ? $arParams[‘~MESS_RELATIVE_QUANTITY_FEW’] : »),
‘MESS_BTN_BUY’ => (isset($arParams[‘~MESS_BTN_BUY’]) ? $arParams[‘~MESS_BTN_BUY’] : »),
‘MESS_BTN_ADD_TO_BASKET’ => (isset($arParams[‘~MESS_BTN_ADD_TO_BASKET’]) ? $arParams[‘~MESS_BTN_ADD_TO_BASKET’] : »),
‘MESS_BTN_SUBSCRIBE’ => (isset($arParams[‘~MESS_BTN_SUBSCRIBE’]) ? $arParams[‘~MESS_BTN_SUBSCRIBE’] : »),
‘MESS_BTN_DETAIL’ => (isset($arParams[‘~MESS_BTN_DETAIL’]) ? $arParams[‘~MESS_BTN_DETAIL’] : »),
‘MESS_NOT_AVAILABLE’ => (isset($arParams[‘~MESS_NOT_AVAILABLE’]) ? $arParams[‘~MESS_NOT_AVAILABLE’] : »),
‘MESS_BTN_COMPARE’ => (isset($arParams[‘~MESS_BTN_COMPARE’]) ? $arParams[‘~MESS_BTN_COMPARE’] : »),
‘USE_ENHANCED_ECOMMERCE’ => (isset($arParams[‘USE_ENHANCED_ECOMMERCE’]) ? $arParams[‘USE_ENHANCED_ECOMMERCE’] : »),
‘DATA_LAYER_NAME’ => (isset($arParams[‘DATA_LAYER_NAME’]) ? $arParams[‘DATA_LAYER_NAME’] : »),
‘BRAND_PROPERTY’ => (isset($arParams[‘BRAND_PROPERTY’]) ? $arParams[‘BRAND_PROPERTY’] : »),
‘TEMPLATE_THEME’ => (isset($arParams[‘TEMPLATE_THEME’]) ? $arParams[‘TEMPLATE_THEME’] : »),
«ADD_SECTIONS_CHAIN» => «N»,
‘ADD_TO_BASKET_ACTION’ => $basketAction,
‘SHOW_CLOSE_POPUP’ => isset($arParams[‘COMMON_SHOW_CLOSE_POPUP’]) ? $arParams[‘COMMON_SHOW_CLOSE_POPUP’] : »,
‘COMPARE_PATH’ => $arResult[‘FOLDER’].$arResult[‘URL_TEMPLATES’][‘compare’],
‘COMPARE_NAME’ => $arParams[‘COMPARE_NAME’],
‘USE_COMPARE_LIST’ => ‘Y’,
‘BACKGROUND_IMAGE’ => (isset($arParams[‘SECTION_BACKGROUND_IMAGE’]) ? $arParams[‘SECTION_BACKGROUND_IMAGE’] : »),
‘COMPATIBLE_MODE’ => (isset($arParams[‘COMPATIBLE_MODE’]) ? $arParams[‘COMPATIBLE_MODE’] : »),
‘DISABLE_INIT_JS_IN_COMPONENT’ => (isset($arParams[‘DISABLE_INIT_JS_IN_COMPONENT’]) ? $arParams[‘DISABLE_INIT_JS_IN_COMPONENT’] : »)
),
$component
);
$GLOBALS[‘CATALOG_CURRENT_SECTION_ID’] = $intSectionID;
Но непонятно ничего…
когда вставляю код:
//Получаем 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 не прописываются
Если есть какие то намеки, намектните)
Спасибо за такой развёрнутый комментарий! )