Magento - 如何隐藏没有产品的类别和子类别

时间:2014-04-23 10:02:45

标签: php magento navigation magento-1.7 categories

我试图隐藏前端的所有类别和子类别,而没有活跃的产品,但我不想使用管理后端手动执行此操作。我想只在顶级导航中显示那些产品数量大于零的类别。我已尝试过以下链接中给出的先前解决方案:

https://magento.stackexchange.com/a/80/6099

&安培; Josh Prattski的博客文章,

http://prattski.com/2011/10/06/magento-module-hide-empty-categories/

没有一个解决方案对我有用,我无法知道我做错了什么。任何帮助将非常感激。

4 个答案:

答案 0 :(得分:2)

您可以执行以下sql来禁用没有产品的所有类别。

UPDATE `catalog_category_entity_int` AS `status`
INNER JOIN `eav_attribute` AS `attr` ON `attr`.`attribute_code` = 'is_active'
AND `attr`.`entity_type_id` = 3
AND `status`.`attribute_id` = `attr`.`attribute_id`
SET `status`.`value` = IF((SELECT COUNT(`index`.`product_id`)
    FROM `catalog_category_product_index` AS `index`
    WHERE `index`.`category_id` = `status`.`entity_id` GROUP BY `index`.`category_id`) > 0, 1, 0)
WHERE `status`.`store_id` = 0

您可以在此处找到更多详细信息http://quicktips.ru/all/hide-all-categories-without-products-and-show-categories-with-pr/

答案 1 :(得分:0)

最好的方法是创建自己的模板类别树,并为呈现类别树的函数实现条件:

foreach ($children as $child) {
    if ($child->getIsActive() && $this->_hasProducts($child->entity_id)) {
        $activeChildren[] = $child;
    }
}

功能有产品:

    protected function _hasProducts($category_id) {
    $products = Mage::getModel('catalog/category')->load($category_id)
        ->getProductCollection()
        ->addAttributeToSelect('entity_id')
        ->addAttributeToFilter('status', 1)
        ->addAttributeToFilter('visibility', 4);
    return ( $products->count() > 0 )  ? true : false;
}

答案 2 :(得分:0)

要从“顶层”菜单隐藏空类别,请执行以下操作:

转到var values = JSON.parse(localStorage.getItem("store_owner_ad_contacts")); values.forEach(values, function(item, i) { // you get object like this {id: "100033"} // so to access id do like normal object if (item.id === '100033') { // do something } }); 文件夹,在本地包中复制app/code/core/Mage/Catalog/Block和覆盖Navigation.php

打开您的软件包Navigation.php并将以下代码粘贴到此文件中:

Navigation.php

答案 3 :(得分:0)

我应该以以下内容开头所有这些内容,适用于magento 2.3,可能是2.x及更高版本...目前我正在研究2.3 ...

我仍在努力处理存储库和工厂,以上所有或我可以找到的关于此的代码均未使用存储库或工厂,即使在magento 2.3中,这似乎仍然是一个问题,所以我所做的只是如果您有多个商店,则可能需要在mysql中的两行中进行修改...首先,禁用所有类别,然后启用具有任何产品的任何类别,要比另一种方法容易得多,因此禁用一行mysql shell或phpmyadmin前端树中的所有类别...

update catalog_category_entity_int set catalog_category_entity_int.value = 0 where catalog_category_entity_int.store_id = 0 and catalog_category_entity_int.attribute_id = (select attribute_id from  eav_attribute where attribute_code = 'include_in_menu') or catalog_category_entity_int.attribute_id = (select attribute_id from  eav_attribute where attribute_code = 'is_active');

然后将其激活,并在菜单中包括所有库存产品的类别

update catalog_category_entity_int left join catalog_category_product on catalog_category_product.category_id = catalog_category_entity_int.entity_id left join cataloginventory_stock_item on cataloginventory_stock_item.product_id = catalog_category_product.product_id set catalog_category_entity_int.value = 1 where catalog_category_entity_int.store_id = 0 and cataloginventory_stock_item.qty > 0 and catalog_category_entity_int.attribute_id = (select attribute_id from  eav_attribute where attribute_code = 'include_in_menu') or cataloginventory_stock_item.qty > 0 and catalog_category_entity_int.attribute_id = (select attribute_id from  eav_attribute where attribute_code = 'is_active');

某处的扩展名尚未针对较新的magento更新,有人在https://magento.stackexchange.com/questions/36/hide-categories-with-no-active-products

处遇到了与此stackexchange有关的问题

两行很简单,甚至可以做成一个过程。

这绝不是最终的解决方案,但应该把工作做好,直到将这种东西内置到内核中为止……不必为这种简单的事情编写扩展代码... < / p>