Реальный кейс: разработка набора PHP-скриптов для работы с товарными остатками
Представьте ситуацию: у заказчика есть огромный CSV-файл с товарными остатками запчастей. Десятки тысяч строк. Артикулы, названия, цены, наличие, марки автомобилей. Всё это добро лежит в файле, обновляется раз в месяц, но сайта, который мог бы это показать миру — нет.
А если сайт и есть — он либо не работает, либо поисковый трафик к нему давно сошел на нет.
Задача: быстро (и желательно бесплатно) превратить этот CSV в рабочий инструмент — сайт, который:
Вместо полноценной CMS мы создали набор PHP-скриптов, работающих напрямую с CSV. Никакой базы данных, никаких сложных зависимостей. Просто:
`
data/sklad.csv — исходный файл остатков
filters.php — главная страница каталога
rss.php — генерация RSS по брендам
sitemap.php — генерация карты сайта
yml.php — экспорт в Яндекс.Маркет
send.php — обработка заказов в Telegram
templates/card.html — шаблон карточки товара
.htaccess — ЧПУ-адреса
`
Весь код — на чистом PHP без фреймворков. Размещается в подпапке существующего сайта и не конфликтует с основной системой.
Это сердце системы. Скрипт читает CSV, фильтрует по параметрам из URL, пагинирует и выводит карточки товаров.
Что умеет:
Особенность: скрипт сам строит URL для фильтров: ?filterBrand=IVECO&filterArticle=123, а через .htaccess можно сделать красивые адреса вида /brand/IVECO и /part/123.
Поисковики любят карты сайта. Наш генератор создает валидный XML:
Что важно: sitemap автоматически подключается к основной карте сайта заказчика через специальный скрипт-аппендер.
Экспорт в формате Яндекс.Маркета — это выход на новую аудиторию. Скрипт генерирует YML с:
Достаточно отдать ссылку на yml.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-рассылок или подключать в мессенджеры.
В эпоху нейросетевого поиска обычных 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) правильно интерпретировать содержимое страницы и использовать его в ответах.
Откровенно: в этой нише поисковый трафик практически отсутствует. Клиенты не забивают в поиск «запчасть артикул 58923». Они идут на маркетплейсы, в телеграм-каналы или просто звонят.
Но это не значит, что сайт не нужен.
Сегодня роль сайта меняется:
Поэтому мы оптимизируем не под «позиции в выдаче», которых нет, а под машинную обработку данных.
Современный поиск — это уже не десять синих ссылок. Это:
Все эти системы парсят сайты. Но парсят они не «красивый дизайн», а структурированные данные. JSON-LD для них — родной язык.
Если на странице товара есть JSON-LD с артикулом, ценой, наличием и брендом — нейросеть с вероятностью 90% использует эту информацию в своем ответе. Если нет — товар просто исчезает из видимости.
Вывод: в эпоху нулевого поискового трафика бороться за классическое SEO бессмысленно. Оптимизация должна идти под нейросетевые алгоритмы, тематические классификаторы (Яндекс.Маркет, Price.ru) и системы сбора структурированных данных по типу прайс-листов.
CSV приходит от заказчика в «кривой» кодировке (UTF-8 с BOM), с разделителем «;». Первая строка — заголовки. Скрипт чистит BOM, нормализует кодировку и приводит данные к единому виду.
`php
$header = array_map(function($key) {
return trim(preg_replace('/^\x{FEFF}|\x{200B}/u', '', $key));
}, $header);
`
Фильтры из URL применяются при чтении CSV — это экономит память и ускоряет работу.
`php
$filteredParts = array_filter($parts, function($part) use ($filterArticle, $filterBrand) {
return (empty($filterArticle) || stripos($part['Артикул'], $filterArticle) !== false)
&& (empty($filterBrand) || $part['Марка автомобиля'] === $filterBrand);
});
`
После фильтрации массив слайсится:
`php
$offset = ($page - 1) * 16;
$pagedParts = array_slice($filteredParts, $offset, 16);
`
Добавляем правила для красивых адресов:
`
RewriteRule ^part/([A-Za-z0-9_-]+)$ /plugins/tcse/parts/filters.php?filterArticle=$1 [L,QSA]
RewriteRule ^brand/([A-Za-z0-9_-]+)$ /plugins/tcse/parts/filters.php?filterBrand=$1 [L,QSA]
`
Теперь по ссылке /brand/IVECO открывается страница всех запчастей IVECO.
/data/ с именем sklad.csv/plugins/tcse/parts/send.phpsitemap.php?update_main=yesВсё. Сайт готов к работе.
Сегодня сайт — это не столько «витрина для клиента», сколько интерфейс к данным для машин. JSON-LD, RSS, YML, sitemap стали важнее, чем дизайн и юзабилити.
Нейросети уже сейчас потребляют структурированный контент. Маркетплейсы тянут YML. RSS-ридеры и Telegram-боты парсят ленты. CSV с остатками — это не «сырые данные», а готовый контент, просто лежащий не в том формате.
Наша задача — помочь этому контенту заговорить на языке, понятном новому поколению поисковых систем.