Ocultar categorías sin productos activos

22

¿Hay alguna forma de ocultar categorías que no tienen productos activos? O, mejor aún, solo muestre categorías que tengan productos y existencias activos .

BenV
fuente
La pregunta es si esta es una buena idea. Los usuarios se confunden cuando cambian el menú.
MiMo

Respuestas:

11

La forma más fácil de hacer esto es reescribir solo el Mage_Catalog_Block_Navigationbloque:

=> En el método _renderCategoryMenuItemHtml()que desea reemplazar el bucle

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

=> con esto:

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

=> y de manera similar en el método renderCategoriesMenuHtml()reemplaza el código

 foreach ($this->getStoreCategories() as $child) {
        if ($child->getIsActive()) {
            $activeCategories[] = $child;
        }
    }

=> con esto:

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

=> Finalmente agregue el método que estábamos usando en nuestro código:

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;
}

Tenga en cuenta que el método verifica cada categoría individualmente utilizando el modelo de catálogo / categoría. Por lo tanto, si tiene muchas categorías, es posible que desee volver a escribir el código para no tener problemas de rendimiento. En una tienda más pequeña que estamos ejecutando, esto funciona bien.

mpaepper
fuente
¿Es posible encajonar esto en una extensión que se puede colocar en la carpeta local? Preocupado por la sobrescritura del código en futuras actualizaciones de Magento.
MagentoMac
10

No hay una función integrada para ocultar categorías vacías (pero puede seleccionar manualmente Está activo = No para cada categoría en el área de administración-> catálogo-> administrar categorías)

Aquí hay un enlace en una gran publicación del blog de Josh Prattski , donde escribió un tutorial paso a paso sobre cómo hacer una extensión para este propósito.

Sergei Guk
fuente
Esto se ve bien, pero por alguna razón no funciona en nuestra tienda ... ¿alguna idea de cómo depurar? No recibo ningún mensaje de error. Seguí las instrucciones hasta el tee, pero no hubo cambios en la interfaz. Ya deshabilité, luego volví a habilitar el compilador y
borré el
4

Si solo desea ocultarlos en la navegación del catálogo, puede agregar una condición if en la plantilla para verificar la cantidad de productos en esa categoría.

Tobias
fuente
4

Quizás esto también ayude.

Vaya al backend de su tienda web.

Luego Catalog > Category > Manage Category, elija su categoría y seleccione la Display settingspestaña.

La etiqueta Display Modese puede establecer en

Show static block only.

Julian
fuente
4

Para ocultar una categoría vacía del menú superior, haga lo siguiente:

Ir a la app/code/core/Mage/Catalog/Blockcarpeta y copiar Navigation.php.

Anular Navigation.phpen su paquete local. Abra Navigation.php su paquete y pegue el siguiente código en este archivo:

if ($category->getIsActive()) {
    $cat = Mage::getModel('catalog/category')->load($category->getId());
    $products = Mage::getResourceModel('catalog/product_collection')->addCategoryFilter($cat);

    Mage::getSingleton('catalog/product_status')->addVisibleFilterToCollection($products);
    Mage::getSingleton('catalog/product_visibility')->addVisibleInCatalogFilterToCollection($products);
    Mage::getSingleton('cataloginventory/stock')->addInStockFilterToCollection($products);

    if (count($products) == 0) {
        return;
    }
}
Henry Roger
fuente
¿Dónde en ese archivo?
MarkE
3

Lo que funcionó para mí es crear un árbol de categorías de plantillas e implementar una función de condición que represente el árbol de categorías:

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

    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;
}
Torrence Blanche
fuente
2

Puede ejecutar el siguiente sql para deshabilitar todas las categorías sin productos.

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

Puede encontrar más detalles aquí http://quicktips.ru/all/hide-all-categories-without-products-and-show-categories-with-pr/

Denis Óbukhov
fuente
2

lo que hice para ocultar categorías vacías es reescribir la Mage_Catalog_Model_Resource_Category_Tree load()función. Tengo que unir la colección de productos con la colección de categorías como a continuación.

    $collection = Mage::getResourceModel('catalog/product_collection');
    Mage::getSingleton('cataloginventory/stock')->addInStockFilterToCollection($collection);
    Mage::getSingleton('catalog/product_visibility')->addVisibleInCatalogFilterToCollection($collection);

 $collection->getSelect()->join(
        array('product_category' => Mage::getSingleton('core/resource')->getTableName('catalog/category_product_index')),
        'product_category.product_id = e.entity_id',
        array('')
    );
    $collection->getSelect()->where('product_category.category_id = '.$this->_table.'.entity_id');
    $select->columns(array('product_count' => $collection->getSelectCountSql()));

agregue este código antes de $arrNodes = $this->_conn->fetchAll($select);esta línea.

Y envuelva este código con esta condición, esta clase llamada desde el modelo de interfaz y backend también

  if(!Mage::getSingleton('admin/session')->isLoggedIn())

Agregué un campo extra product_count que contiene el recuento real de productos activos.

Estoy usando un módulo de terceros para mostrar la categoría en el menú superior y puse la condición según el recuento de productos cuando se muestra el menú.

Mufaddal
fuente