Virtuemart - скрываем пустые категории
При работе с интернет-магазином на базе Virtuemart после импорта из csv возможно появление пустых категорий, которые virtuemart не скрывает автоматически. Т.е. отображаются категории, в которых нет ни одного опубликованного товара (или вообще ни одного товара) - при заходе в такую категорию, естественно, “ощущается пустота”.
Зачем нам отображение пустых категорий? В общем-то, если только для поисковиков.. чтоб наведывались. Однако для покупателей гораздо удобнее, если пустые категории не показываются.
В настройках Virtuemart (ни в глобальной конфигурации, ни в настройках категорий) пункта-галочки “скрывать пустые категории” (или отображать) я не нашел. Может плохо искал?
Как настроить virtuemart чтобы он не показывал пустые категории?
Ничего более простого, как “опубликовывать только категории с товаром” я не придумал. Итак, проходим по категориям “снизу”, начиная с товаров, и .. опубликовываем их. Предварительно все категории распубликовываем. Если в магазине имеются умышленно скрытые категории (своеобразный склад временно неиспользуемых товаров), их можно просто добавить в исключения
Ближе к практике:
CREATE TEMPORARY TABLE `jos_tmp_category` (
`category_id` int(11) NOT NULL,
`lvl` int (2) not null,
PRIMARY KEY (`category_id`)
);
insert into `jos_tmp_category`
select distinct c.category_id, 1
FROM jos_vm_category c
INNER JOIN jos_vm_product_category_xref pc ON c.category_id = pc.category_id
INNER JOIN jos_vm_product p ON pc.product_id = p.product_id
WHERE p.product_publish = 'Y';
replace into `jos_tmp_category`
select distinct cc.category_parent_id, 2
FROM jos_vm_category_xref cc
inner join `jos_tmp_category` t
on t.category_id = cc.category_child_id and t.lvl=1;
replace into `jos_tmp_category`
select distinct cc.category_parent_id, 3
FROM jos_vm_category_xref cc
inner join `jos_tmp_category` t
on t.category_id = cc.category_child_id and t.lvl=2;
– …
– пока количество “затронутых” рядов перестанет изменяться
update jos_vm_category set category_publish='N';
update jos_vm_category set category_publish='Y'
where category_id in (select `category_id` from jos_tmp_category);
После таких запросов к базе virtuemart не будет отображать пустые категории (а если точнее, то пустые категории станут скрытыми). В универсальный хак-мод все это не переросло, а вот после “зашивания” в simple csv import сайт стал “скрывать категории” сразу после обновления товаров.
Метки: cms, joomla, virtuemart
При выполнении этого запроса в пхп май админ вылитает ошибка
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘INSERT INTO `jos_tmp_category`
SELECT DISTINCT c.category_id
, 1′ at line 7
можете подсказать что нужно сделать чтобы выполнялся запрос?
Сергей, если не ошибаюсь, phpmyadmin между запросами временную таблицу не сохраняет. Возможно, ошибка из-за попытки вставить строки в несуществующую таблицу?
Всё просто: не надо создавать временную таблицу.
Делаем так
DROP TABLE IF EXISTS `jos_tmp_category`;
CREATE TABLE `jos_tmp_category` (
`category_id` int(11) NOT NULL,
`lvl` int (2) not null,
PRIMARY KEY (`category_id`)
);
ну и далее аналогично как в статье
Просто префикс для таблиц не у всех jos, поэтому и ругается