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 .


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.


¿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.


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.


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.


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

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

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/


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ú.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.