Для начала вам нужно найти category.php, который размещен по адресу: administrator/components/com_virtuemart/models/

Дальше открываем его для редактирования, например в блокноте. Ищем строку: class VirtueMartModelCategory extends VmModel {
Эта строка должна быть почти с самого верху файла. Вам нужно вставить в этот класс функцию, которая вернет нам массив подкатегорий. Копируем следующее и вставляем после «{»:

    function GetTreeCatArray(&$categories, $parent_id = 0) {
            $db = JFactory::getDBO();
            $query = 'SELECT `category_child_id` FROM `#__virtuemart_category_categories` WHERE `category_parent_id`="'.$parent_id.'"';
            $db->setQuery($query);
            $db->query();
         
            if (empty($categories) && ($parent_id != 0))
              array_push($categories, $parent_id);
     
            $rows = $db->loadRowList();
            if (empty($rows))    {
                return;
            } else {
                foreach($rows as $row) {
                 array_push($categories, $row[0]);
                    $this->GetTreeCatArray($categories, $row[0]);
                }
            }
        }

 

Но это еще не всё, теперь Вам нужно вывести все продукты из подкатегории. Для этого в той папке, в которой вы уже искали файл категории (/administrator/components/com_virtuemart/models/) нужно найти другой файл product.php. Открыть его для редактирования и найти строку:

$where[] = ' `pc`.`virtuemart_category_id` = ' . $virtuemart_category_id;

 

Закомментируйте её или удалите. И добавьте вместо неё:

    $categories = array();
    VmModel::getModel('category')->GetTreeCatArray($categories, $virtuemart_category_id);
    $where[] = ' `pc`.`virtuemart_category_id` in (\'' . implode('\',\'',$categories).'\')';

 

Сохраните все изменения и перейдите в категорию, которая содержит категории, которые содержат продукты, и вы увидите, что товары таки выводятся из всех вложенных категорий.

 

Вот тут описано, как это сделать правильно, чтобы хак не затерся при обновлении.

 

В Virtuemart 3.0.14 это уже практически сделанно разработчиками, только почему то не до конца )))

файл /administrator/components/com_virtuemart/models/product.php

			$joinCategory = TRUE;
			if(true){
				$where[] = ' `pc`.`virtuemart_category_id` = ' . $virtuemart_category_id;
			} else {
				/*GJC add subcat products*/
				$catmodel = VmModel::getModel ('category');
				$childcats = $catmodel->getChildCategoryList(1, $virtuemart_category_id,null, null, true);
				$cats = $virtuemart_category_id;
				foreach($childcats as $childcat){
					$cats .= ','.$childcat->virtuemart_category_id;
				}
				$joinCategory = TRUE;
				$where[] = ' `pc`.`virtuemart_category_id` IN ('.$cats.') ';
			}

 

В этой конструкции надо true заменить на false и будет вам счастье.