Ручная индексация статических страниц для поиска API 1С-Битрикс


Автоматическая индексация страниц для поиска в CMS 1С-Битрикс устанавливает некоторые требования к индексируемым страницам, в частности наличие функции SetTitle в начале кода, если страница отличается от стандартного шаблона ее можно проиндексировать вручную, использую следующий код (его можно запустить из самописного скрипта, либо воспользовавшись инструментом «Командная PHP-строка» в панели битрикса):

<?php
if (\Bitrix\Main\Loader::includeModule("search")) { 
    // Укажите папку, которую нужно принудительно проиндексировать 
    $targetDir = "/catalog/";  

    $siteId = "s1"; // ID вашего сайта (обычно s1) 
    $fullPath = $_SERVER["DOCUMENT_ROOT"] . $targetDir; 

    if (is_dir($fullPath)) { 
        $dir = new DirectoryIterator($fullPath); 
        $count = 0; 
        foreach ($dir as $fileinfo) { 
            // Индексируем только PHP и HTML файлы, игнорируем служебные 
            if (!$fileinfo->isDot() && $fileinfo->isFile() && in_array($fileinfo->getExtension(), ['php', 'html', 'htm'])) { 

                $fileName = $fileinfo->getFilename(); 

                if (strpos($fileName, '.') === 0 || $fileName == '.access.php') continue; 

                $itemPath = $targetDir . $fileName;
                $fileContent = file_get_contents($fileinfo->getPathname()); 

                // 1. Извлекаем заголовок из вашей переменной $title 
                $title = "Без названия"; 
                if (preg_match('/\$title\s*=\s*[\'"](.*?)[\'"]\s*;/', $fileContent, $matches)) { 
                    $title = trim($matches[1]); 
                } 

                // 2. Очищаем текст от PHP и HTML тегов для поискового робота 
                $bodyText = strip_tags($fileContent); 
                $bodyText = preg_replace('/<\?[\s\S]*?\?>/', '', $bodyText); // Удаляем PHP код 
                $bodyText = trim(preg_replace('/\s+/', ' ', $bodyText));    // Убираем лишние пробелы 

                // 3. Напрямую записываем в поисковую базу b_search_content 
                CSearch::Index( 
                    "main",       // Модуль статики 
                    $itemPath,    // Уникальный ID (путь к файлу) 
                    array( 
                        "DATE_CHANGE" => date("d.m.Y H:i:s", $fileinfo->getMTime()), 
                        "TITLE" => $title, 
                        "BODY" => $bodyText, 
                        "URL" => $itemPath, 
                        "SITE_ID" => array($siteId), 
                        "PERMISSIONS" => array(1, 2), // Важно: принудительно даем доступ Администраторам(1) и Гостям(2) 
                    ), 
                    true // Перезаписать старый индекс, если он был 
                ); 
                echo "Проиндексирован файл: <b>" . $itemPath . "</b> с заголовком: <i>\"" . $title . "\"</i><br>"; 
                $count++; 
            } 
        } 
        echo "<br><b>Всего успешно добавлено файлов в поиск: " . $count . "</b>"; 
    } else { 
        echo "Папка не найдена"; 
    } 
} else { 
    echo "Модуль поиска не установлен"; 
}