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 сайт стал “скрывать категории” сразу после обновления товаров.

Метки: , ,

Автор будет признателен, если Вы поделитесь ссылкой на статью, которая Вам помогла:
BB-код (для вставки на форум)

html-код (для вставки в ЖЖ, WP, blogger и на страницы сайта)

ссылка (для отправки по почте)

Комментарии (4) к записи “Virtuemart - скрываем пустые категории”

  1. Сергей сообщает :

    При выполнении этого запроса в пхп май админ вылитает ошибка
    #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
    можете подсказать что нужно сделать чтобы выполнялся запрос?

  2. levik сообщает :

    Сергей, если не ошибаюсь, phpmyadmin между запросами временную таблицу не сохраняет. Возможно, ошибка из-за попытки вставить строки в несуществующую таблицу?

  3. Wooorker сообщает :

    Всё просто: не надо создавать временную таблицу.
    Делаем так
    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`)
    );

    ну и далее аналогично как в статье

  4. ertert сообщает :

    Просто префикс для таблиц не у всех jos, поэтому и ругается

Добавить комментарий