Реальный кейс: разработка набора PHP-скриптов для работы с товарными остаткамиПроблема: есть CSV, а сайта нет
Представьте ситуацию: у заказчика есть огромный CSV-файл с товарными остатками запчастей. Десятки тысяч строк. Артикулы, названия, цены, наличие, марки автомобилей. Всё это добро лежит в файле, обновляется раз в месяц, но сайта, который мог бы это показать миру — нет.
А если сайт и есть — он либо не работает, либо поисковый трафик к нему давно сошел на нет.
Задача: быстро (и желательно бесплатно) превратить этот CSV в рабочий инструмент — сайт, который:
- Отображает товары в удобной карточной сетке
- Позволяет фильтровать по бренду, артикулу, названию
- Имеет человеко-понятные URL
- Умеет сортировать товары
- Генерирует sitemap.xml для поисковых роботов
- Экспортирует товары в YML для Яндекс.Маркета
- Создает RSS-ленты по каждому бренду
- Содержит микроразметку JSON-LD для нейросетей
Архитектурный подход: модульные скрипты над CSV
Вместо полноценной CMS мы создали набор PHP-скриптов, работающих напрямую с CSV. Никакой базы данных, никаких сложных зависимостей. Просто:
data/sklad.csv — исходный файл остатков
filters.php — главная страница каталога
rss.php — генерация RSS по брендам
sitemap.php — генерация карты сайта
yml.php — экспорт в Яндекс.Маркет
send.php — обработка заказов в Telegram
templates/card.html — шаблон карточки товара
.htaccess — ЧПУ-адреса
Весь код — на чистом PHP без фреймворков. Размещается в подпапке существующего сайта и не конфликтует с основной системой.
Основные скрипты и их возможности
1. Основной каталог — filters.php
Это сердце системы. Скрипт читает CSV, фильтрует по параметрам из URL, пагинирует и выводит карточки товаров.
Что умеет:- Фильтрация по артикулу, названию, марке авто
- Сортировка по цене, названию, наличию
- Пагинация (16 товаров на страницу)
- Генерация динамических SEO-метатегов
- JSON-LD разметка для каждого товара
- Форма заказа с отправкой в Telegram
Особенность: скрипт сам строит URL для фильтров:
?filterBrand=IVECO&filterArticle=123, а через
.htaccess можно сделать красивые адреса вида
/brand/IVECO и
/part/123.
2. Карта сайта — sitemap.php
Поисковики любят карты сайта. Наш генератор создает валидный XML:
- Главная страница каталога
- Страницы каждого бренда
- Страницы топ-2000 артикулов
- Приоритеты и частота обновления
Что важно: sitemap автоматически подключается к основной карте сайта заказчика через специальный скрипт-аппендер.
3. YML для Яндекс.Маркета — yml.php
Экспорт в формате Яндекс.Маркета — это выход на новую аудиторию. Скрипт генерирует YML с:
- Информацией о магазине
- Категориями (бренды авто)
- Товарами (артикул, цена, наличие, описание)
- Условиями доставки
Достаточно отдать ссылку на
yml.php менеджеру маркетплейса.
4. RSS-ленты по брендам — rss.php
Здесь интереснее. Скрипт создает отдельную RSS-ленту для каждой марки автомобиля:
rss.php?filterBrand=IVECO&limit=20&sort=price&order=desc
Параметры:- filterBrand — марка авто (обязательный)
- limit — число товаров (1–100, по умолч. 10)
- sort — поле сортировки (price, article, name, stock)
- order — направление (asc, desc)
RSS-ленты можно отдавать в агрегаторы, и
спользовать для email-рассылок или подключать в мессенджеры.
5. Микроразметка JSON-LD
В эпоху нейросетевого поиска обычных HTML-тегов мало. Мы добавили в каждый товар и на всю страницу структурированные данные Schema.org:
Для товара:json
{
"@type": "Product",
"name": "Кольцо уплотнительное",
"sku": "000.230",
"brand": "IVECO",
"offers": {
"price": 160,
"priceCurrency": "RUB",
"availability": "https://schema.org/InStock"
}
}
Для страницы:json
{
"@type": "ItemList",
"numberOfItems": 128,
"itemListElement": [...]
}
Для навигации:json
{
"@type": "BreadcrumbList",
"itemListElement": [...]
}
Это позволяет нейросетевым алгоритмам (Google SGE, Yandex GPT, Perplexity AI, ChatGPT search) правильно интерпретировать содержимое страницы и использовать его в ответах.
Почему классическое SEO больше не работает
Откровенно: в этой нише поисковый трафик практически отсутствует. Клиенты не забивают в поиск «запчасть артикул 58923». Они идут на маркетплейсы, в телеграм-каналы или просто звонят.
Но это не значит, что сайт не нужен.
Сегодня роль сайта меняется:
- Сайт как API — структурированные данные забирают нейросети, маркетплейсы, ценовые агрегаторы
- Сайт как паспорт товара — клиент получает ссылку на карточку в мессенджере и видит все характеристики
- Сайт как RSS-источник — подписчики получают обновления ассортимента автоматически
- Сайт как YML-экспортер — один файл для загрузки в Яндекс.Маркет
Поэтому мы оптимизируем не под «позиции в выдаче», которых нет, а под машинную обработку данных.
Роль нейросетей и структурированных данных
Современный поиск — это уже не десять синих ссылок. Это:
- Google SGE — генеративные ответы на основе контента сайтов
- Yandex GPT — нейросеть, встроенная в поиск
- Perplexity AI, ChatGPT Search — поисковые AI-агенты
- Telegram-боты с интеграцией товарных каталогов
Все эти системы парсят сайты. Но парсят они не «красивый дизайн», а
структурированные данные. JSON-LD для них — родной язык.
Если на странице товара есть JSON-LD с артикулом, ценой, наличием и брендом — нейросеть с вероятностью 90% использует эту информацию в своем ответе. Если нет — товар просто исчезает из видимости.
Вывод: в эпоху нулевого поискового трафика бороться за классическое SEO бессмысленно. Оптимизация должна идти под нейросетевые алгоритмы, тематические классификаторы (Яндекс.Маркет, Price.ru) и системы сбора структурированных данных по типу прайс-листов.
Технические детали реализации
Работа с CSV
CSV приходит от заказчика в «кривой» кодировке (UTF-8 с BOM), с разделителем «;». Первая строка — заголовки. Скрипт чистит BOM, нормализует кодировку и приводит данные к единому виду.
php
$header = array[i]map(function($key) {
return trim(preg[/i]replace('/^\x{FEFF}|\x{200B}/u', '', $key));
}, $header);
Фильтрация на сервере
Фильтры из URL применяются при чтении CSV — это экономит память и ускоряет работу.
php
$filteredParts = array[i]filter($parts, function($part) use ($filterArticle, $filterBrand) {
return (empty($filterArticle) || stripos($part['Артикул'], $filterArticle) !== false)
&& (empty($filterBrand) || $part['Марка автомобиля'] === $filterBrand);
});
Пагинация
После фильтрации массив слайсится:
php
$offset = ($page - 1) [i] 16;
$pagedParts = array[/i]slice($filteredParts, $offset, 16);
ЧПУ через .htaccess
Добавляем правила для красивых адресов:
RewriteRule ^part/([A-Za-z0-9[i]-]+)$ /plugins/tcse/parts/filters.php?filterArticle=$1 [L,QSA]
RewriteRule ^brand/([A-Za-z0-9[/i]-]+)$ /plugins/tcse/parts/filters.php?filterBrand=$1 [L,QSA]
Теперь по ссылке
/brand/IVECO открывается страница всех запчастей IVECO.
Быстрый старт: что нужно для развертывания
- Положить CSV в папку /data/ с именем sklad.csv
- Загрузить скрипты в /plugins/tcse/parts/
- Настроить .htaccess (правила выше)
- Добавить Telegram-бота в send.php
- Запустить один раз sitemap.php?update_main=yes
Всё. Сайт готов к работе.
Кому подходит этот подход
- Владельцам CSV с товарами, у которых нет сайта
- Тем, у кого сайт есть, но на классическом SEO нет бюджета
- Компаниям, чьи клиенты общаются в мессенджерах
- Поставщикам, которым нужен YML для маркетплейсов
- Разработчикам, которым нужно быстро сделать «прослойку» над CSV для интеграций
Итог: философия работы с данными в 2026 году
Сегодня сайт — это не столько «витрина для клиента», сколько
интерфейс к данным для машин. JSON-LD, RSS, YML, sitemap стали важнее, чем дизайн и юзабилити.
Нейросети уже сейчас потребляют структурированный контент. Маркетплейсы тянут YML. RSS-ридеры и Telegram-боты парсят ленты. CSV с остатками — это не «сырые данные», а готовый контент, просто лежащий не в том формате.
Наша задача — помочь этому контенту заговорить на языке, понятном новому поколению поисковых систем.
Хотите разработку под свои задачи?
Пишите нам по адресу
mail@tcse-cms.com
💬 Комментарии
В связи с новыми требованиями законодательства РФ (ФЗ-152, ФЗ «О рекламе») и ужесточением контроля со стороны РКН, мы отключили систему комментариев на сайте.
🔒 Важно Теперь мы не собираем и не храним ваши персональные данные — даже если очень захотим.
💡 Хотите обсудить материал?
Присоединяйтесь к нашему Telegram-каналу:
https://t.me/tcsecmsНажмите кнопку ниже — и вы сразу попадёте в чат с комментариями