Пусть артикулы выведенных товаров хранятся в массиве с названием $PrintedSku (к примеру). Это наверняка будет какой-нибудь глобально доступный массив. И наверняка можно под него приспособить массив $pam, но я не сильно секу в областях видимости массивов и переменных в php. Надо экспериментировать.
Всё приведённое касается файла helper.php.
В функции HtmlProdLines ($ProdList, $a, &$pam, $url) (строка 238) после строки foreach ($ProdList as $result) добавить проверку на то, есть ли в массиве артикул текущего товара $result->product_sku на весь блок.
Проверять можно ещё какой-нибудь функцией (для удобства восприятия). В функции расположить цикл пробега по массиву $PrintedSku и сравнению с текущим sku. Если такого товара нет в массиве, то добавить его в массив и возвратить TRUE, если же есть, то мы его уже выводили, в массив добавлять ничего не требуется и функция должна возвратить FALSE.
И ещё важный момент, который пригодится в дальнейшем: если ни один товар в результате проверок не будет выведен в этой категории, то функция HtmlProdLines должна будет возвратить пустую строчку.
Это всё про товары.
Теперь про категории. Я тут глянул - небольшая загвоздка в том, что сначала выводится название категории, а только потом мы проверяем, нужно ли выводить товар здесь.
В экстремальном случае мы получим категорию без товаров. Поэтому категорию (строку с её названием, точнее) пока не выводим, а пишем во временную переменную.
Вот в этой строке нужно загонять строку с названием категории в какую-нибудь другую временную переменную, а не в $html:
сейчас: (197) if ( $pam ['parameters']['showlines'] !== '2') $html .= HtmlCatalogLine ($Child, $level, &$pam, $way);
станет: (197) if ( $pam ['parameters']['showlines'] !== '2') $catline = HtmlCatalogLine ($Child, $level, &$pam, $way);
Потом идёт рекурсивный вызов, на выходе из которого мы получаем некий фрагмент строки $html. Вот здесь и понадобится пустое значение от HtmlProdLines.
сейчас так: (203) $html .= Recurse($Child, $level, $url, &$pam, $way);
станет: (203) $possible = Recurse($Child, $level, $url, &$pam, $way);
(204) if ($possible) $html .= $catline.$possible;
Всё это, конечно, набросочно и многое нужно состыковывать.
Вот как-то так.
Проверить некогда - делов много. Но метод даю.
Сначала разберись с выводом товаров, а потом, как наладится - начинай убирать "пустые" категории.