Решение нашел здесь.
Варианты предлагались разные, но этот рабочий и наиболее изящный. Редактируется класс ps_session.php, ищите функцию getShopItemid(). Вот так она должна выглядеть после редакции:
function getShopItemid() {Логика проста, если Itemid установлено (а при переходе в другую категорию оно передается), то функция не меняет его на сессионную переменную и оставляет как есть, что нам и нужно.
if( empty( $_REQUEST['shopItemid'] )) {
$db = new ps_DB;
$db->query( "SELECT id FROM #__menu WHERE link='index.php?option=com_virtuemart' AND published=1");
if( $db->next_record() ) {
$_REQUEST['shopItemid'] = $db->f("id");
}
else {
if( !empty( $_REQUEST['Itemid'] )) {
$_REQUEST['shopItemid'] = intval( $_REQUEST['Itemid'] );
}
else {
$_REQUEST['shopItemid'] = 1;
}
}
// ЗДЕСЬ СОБСТНО ДОПОЛНЕНИЯ
} else {
return intval($_REQUEST['Itemid']);
}
// КОНЕЦ ДОПОЛНЕНИЯ
return intval($_REQUEST['shopItemid']);
}