Как создать динамические мета-теги для инфоблока в разделе SEO в Битрикс, используя код в его настройках?

Здравствуйте. <br/> У меня есть сайт-магазин, в котором отсутствует модуль Каталог. <br/> В свойствах инфоблока я обнаружила числовой код PRICE_MOD, который отвечает за вывод определённого значения. <br/> Я пытаюсь динамически сформировать мета-тэг Title, используя этот код, и пробовала различные варианты: <br/> {=this.PRICE_MOD}, {{PRICE_MOD}}, #PROPERTY_PRICE_MOD_VALUE#, #PROPERTY_PRICE_MOD.PROPERTY_VALUE#. <br/> Также применяла подход через init.php. <br/> <pre><code class="php">&lt;?php
	AddEventHandler('main', 'OnEpilog', function() {
    global $APPLICATION;
    
    if (CModule::IncludeModule('iblock') &amp;&amp; $_SERVER['SCRIPT_NAME'] == '/catalog/index.php') {
        $elementId = (int)$_GET['ID'];
        $element = CIBlockElement::GetByID($elementId)-&gt;GetNextElement();
        
        if ($element) {
            $props = $element-&gt;GetProperties();
            $priceMod = $props['PRICE_MOD']['VALUE'];
            
            if ($priceMod) {
                $APPLICATION-&gt;SetPageProperty('title', 
                    $element-&gt;GetFields()['NAME'] . ' — ' . $priceMod . ' руб.');
            }
        }
    }
});
?&gt;</code></pre> <br/> <br/> Однако ни один из этих вариантов не работает, либо вместо кода отображаются три точки. <br/> Можете подсказать, как правильно вывести этот код в мета-тэги?
  • 16 апреля 2025 г. 12:46
Ответы на вопрос 2
Для динамической установки мета-тегов в Битрикс, особенно в случае, когда у вас нет модуля "Каталог", важно правильно использовать API Битрикса и правильно обрабатывать запросы. Описание вашего подхода с использованием события `OnEpilog` выглядит корректным, но нужно учитывать некоторые нюансы.

**Динамическая установка мета-тегов:**

1. Убедитесь, что у вас есть доступ к свойству `PRICE_MOD` через `GetProperties`. Проверьте, что оно действительно возвращает значение, так как может быть, что данное свойство пустое или имеет другую конфигурацию.

2. Проверьте правильность URL в условии: `$_SERVER['SCRIPT_NAME'] == '/catalog/index.php'`. Убедитесь, что вы находитесь на нужной странице.

Вот пример кода для установки мета-тега `title` в файле `init.php` вашего шаблона:

```php
<?php
AddEventHandler('main', 'OnEpilog', function() {
    global $APPLICATION;

    // Необходимо убедиться, что это элемент инфоблока
    if (CModule::IncludeModule('iblock') && isset($_GET['ID'])) {
        $elementId = (int)$_GET['ID'];
        $element = CIBlockElement::GetByID($elementId)->GetNextElement();

        if ($element) {
            // Получаем свойства элемента
            $props = $element->GetProperties();
            $priceMod = $props['PRICE_MOD']['VALUE']; // Предположим, что значение в данном свойстве — это то, что мы хотим

            // Получаем имя элемента
            $elementName = $element->GetFields()['NAME'];

            // Формируем заголовок
            $title = $elementName . ' — ' . $priceMod . ' руб.';
            $APPLICATION->SetPageProperty('title', $title);
        }
    }
});
?>
```

**Проверки и отладка:**

1. **Проверьте значение свойства PRICE_MOD:** Вы можете временно вывести его значение, для этого:

```php
file_put_contents($_SERVER['DOCUMENT_ROOT'].'/price_debug.txt', print_r($priceMod, true));
```
Эта строка создаст файл `price_debug.txt` в корне сайта и выведет туда значение переменной `$priceMod`. Сделайте это для проверки, действительно ли значение приходит.

2. **Проверьте, что имя элемента корректное:** Также можно вывести имя элемента, чтобы удостовериться, что самого элемента с данным ID на самом деле нет.

3. **Кеширование:** Поскольку Битрикс использует систему кеширования, возможно, что изменения не видны сразу. Убедитесь, что вы очищаете кеш после внесения изменений.

4. **Проверка на наличие ошибок:** Используйте `error_reporting(E_ALL);` и `ini_set('display_errors', 1);` для отображения ошибок в PHP на время отладки.

Помните также о том, что мета-теги могут не изменяться на странице, если редиректы или настройки кеша мешают их обновлению.
Код какой-то ужасный. Его что, ИИ писал? 
Вам надо поменять тайтл на детальной странице товара.
Значит надо найти шаблон детальной страницы товара, добавить (если нужно) туда файл component_epilog.php с таким содержимым:
<?php
use Bitrix\Main\EventManager;

/**
 * @var array $arParams
 * @var array $arResult
 */

Bitrix\Main\Loader::includeModule('iblock'); // уверен, что эта строчка не нужна, даже если сработал кэш

$priceMod = $arResult["PROPERTIES"]['PRICE_MOD']['VALUE'];
if ( $priceMod ) {
    $title = "{$arResult['NAME']} — $priceMod руб.";
    $eventManager = EventManager::getInstance();
    $eventManager->addEventHandler('main', 'OnEpilog', function() use ($title){
        global $APPLICATION;
        $APPLICATION->SetPageProperty('title', $title);
    }, false, 1000);
}
Похожие вопросы