Разработка сайтов

Массовое изменение SEO у товаров Битрикс

Задача: добавить по определенным правилам CITYNAME в title и descr товара
Сложность: у некоторых товаров эти значения наследуются от раздела

Решение(неоптимизированный говнокод):

<? require($_SERVER["DOCUMENT_ROOT"] . "/bitrix/header.php");

CModule::IncludeModule("iblock");

use Bitrix\Iblock\InheritedProperty;

$IBLOCK_ID = 15;
$arFilter = array('IBLOCK_ID' => $IBLOCK_ID);
$arSelect = array("ID", "ACTIVE", "NAME");
$rsElements = CIBlockElement::GetList(array("SORT" => "ASC"), $arFilter, false, [/*'nTopCount'=>105*/], $arSelect);
$count = 0;
$count_all = 0;
while ($arElement = $rsElements->GetNext()) {
    echo '<br>';

    echo 'Товар №' . $arElement['ID'];
    $count_all++;

    // получаем шаблоны
    $ipropElementTemplates = new \Bitrix\Iblock\InheritedProperty\ElementTemplates($IBLOCK_ID, $arElement['ID']);
    $templates = $ipropElementTemplates->findTemplates();
    //pre($templates);
    // Если тайтл наследуется и берется из раздела и еще нет #CITYNAME#
    if ($templates['ELEMENT_META_TITLE']['INHERITED'] == 'Y' && $templates['ELEMENT_META_TITLE']['ENTITY_TYPE'] == 'S' && (strpos($templates['ELEMENT_META_TITLE']['TEMPLATE'], '#CITYNAME#') == false)) {
        $ipropSectionTemplates = new \Bitrix\Iblock\InheritedProperty\SectionTemplates($IBLOCK_ID, $templates['ELEMENT_META_TITLE']['ENTITY_ID']);
        $templatesSect = $ipropSectionTemplates->findTemplates();
        $title = str_replace(', цена', ' #CITYNAME#, цена', $templatesSect['ELEMENT_META_TITLE']['TEMPLATE']);
        if (strpos($title, '#CITYNAME#') == false) $title = str_replace('{=this.Name}', '{=this.Name} #CITYNAME#', $templatesSect['ELEMENT_META_TITLE']['TEMPLATE']);
        if (strpos($title, '#CITYNAME#') == false) {
            echo "ERROR";
            $error++;
            pre($title);
        } elseif (strpos($templatesSect['ELEMENT_META_TITLE']['TEMPLATE'], '#CITYNAME#') == false) {
            $newTemplatesSect = array('ELEMENT_META_TITLE' => $title);
            $ipropSectionTemplates->set($newTemplatesSect);

            echo '<br> Тайтл Сект Было:';
            pre($templatesSect['ELEMENT_META_TITLE']['TEMPLATE']);
            echo '<br>Должно стать:';
            pre($title);
            echo '<br>Стало:';
            pre($ipropSectionTemplates->findTemplates()['ELEMENT_META_TITLE']['TEMPLATE']);

        }
    }
    // Если тайтл не наследуется -> берется из элемента
    if ($templates['ELEMENT_META_TITLE']['INHERITED'] == 'N' && (strpos($templates['ELEMENT_META_TITLE']['TEMPLATE'], '#CITYNAME#') == false) ) {
        $title = str_replace(', цена', ' #CITYNAME#, цена', $templates['ELEMENT_META_TITLE']['TEMPLATE']);
        if (strpos($title, '#CITYNAME#') == false) $title = str_replace('{=this.Name}', '{=this.Name} #CITYNAME#', $templates['ELEMENT_META_TITLE']['TEMPLATE']);
        if (strpos($title, '#CITYNAME#') == false) {
            echo "ERROR";
            $error++;
            pre($title);
        }
        if (strpos($templates['ELEMENT_META_TITLE']['TEMPLATE'], '#CITYNAME#') == false) {
            $ipropElementTemplates3 = new \Bitrix\Iblock\InheritedProperty\ElementTemplates($IBLOCK_ID, $templates['ELEMENT_META_TITLE']['ENTITY_ID']);
            $templates = $ipropElementTemplates3->findTemplates();
            $newTemplates = array('ELEMENT_META_TITLE' => $title);
            $ipropElementTemplates3->set($newTemplates);
            echo '<br>Тайтл Элем Было:';
            pre($templates['ELEMENT_META_TITLE']['TEMPLATE']);
            echo '<br>Должно стать:';
            pre($title);
            echo '<br>Стало:';
            pre($ipropElementTemplates3->findTemplates()['ELEMENT_META_TITLE']['TEMPLATE']);

        }
    }


    // Если декср наследуется и берется из раздела и еще нет #CITYNAME#
    if ($templates['ELEMENT_META_DESCRIPTION']['INHERITED'] == 'Y' && $templates['ELEMENT_META_DESCRIPTION']['ENTITY_TYPE'] == 'S' ) {
        $ipropSectionTemplates1 = new \Bitrix\Iblock\InheritedProperty\SectionTemplates($IBLOCK_ID, $templates['ELEMENT_META_DESCRIPTION']['ENTITY_ID']);
        $templatesSect = $ipropSectionTemplates1->findTemplates();
        $title = str_replace('по цене', ' #CITYNAME#, по цене', $templatesSect['ELEMENT_META_DESCRIPTION']['TEMPLATE']);
        if (strpos($title, '#CITYNAME#') == false) $title = str_replace('{=this.Name}', '{=this.Name} #CITYNAME#', $templatesSect['ELEMENT_META_DESCRIPTION']['TEMPLATE']);
        if (strpos($title, '#CITYNAME#') == false) {
            echo "ERROR";
            $error++;
            pre($title);
        } elseif (strpos($templatesSect['ELEMENT_META_DESCRIPTION']['TEMPLATE'], '#CITYNAME#') == false) {
            $newTemplatesSect = array('ELEMENT_META_DESCRIPTION' => $title);
            $ipropSectionTemplates1->set($newTemplatesSect);
            echo '<br>Descr Sect Было:';
            pre($templatesSect['ELEMENT_META_DESCRIPTION']['TEMPLATE']);
            echo '<br>Должно стать:';
            pre($title);
            echo '<br>Стало:';
            pre($ipropSectionTemplates1->findTemplates()['ELEMENT_META_DESCRIPTION']['TEMPLATE']);


        }
    }

    // Если декср не наследуется -> берется из элемента

    if ($templates['ELEMENT_META_DESCRIPTION']['INHERITED'] == 'N') {
        $title = str_replace('по цене', ' #CITYNAME#, по цене', $templates['ELEMENT_META_DESCRIPTION']['TEMPLATE']);
        if (strpos($title, '#CITYNAME#') == false) $title = str_replace('{=this.Name}', '{=this.Name} #CITYNAME#', $templates['ELEMENT_META_DESCRIPTION']['TEMPLATE']);
        if (strpos($title, '#CITYNAME#') == false) {
            echo "ERROR";
            $error++;
            pre($title);
        }
        if (strpos($templates['ELEMENT_META_DESCRIPTION']['TEMPLATE'], '#CITYNAME#') == false) {
            $ipropElementTemplates2 = new \Bitrix\Iblock\InheritedProperty\ElementTemplates($IBLOCK_ID, $templates['ELEMENT_META_DESCRIPTION']['ENTITY_ID']);
            $templates = $ipropElementTemplates2->findTemplates();
            $newTemplates = array('ELEMENT_META_DESCRIPTION' => $title);
            $ipropElementTemplates2->set($newTemplates);
            echo '<br>Descr Element Было:';
            pre($templates['ELEMENT_META_DESCRIPTION']['TEMPLATE']);
            echo '<br>Должно стать:';
            pre($title);
            echo '<br>Стало:';
            pre($ipropElementTemplates2->findTemplates()['ELEMENT_META_DESCRIPTION']['TEMPLATE']);

        }
    }

}
echo '</br>Тайтлы свои:' . $inh_t;
echo '</br>Дескр свои:' . $inh_d;
echo '</br>С ошибкой:' . $count;
echo '</br>Из:' . $count_all;
echo '</br>UPD:' . $UPDD;
Подписка на блог Подпишись на новые материалы от US STUDIO и вы не пропустите интересные статьи от нашей компании