활성 제품이없는 카테고리 숨기기


22

활성 제품이없는 카테고리를 숨길 수있는 방법이 있습니까? 또는 활성 제품 재고 가있는 범주 만 표시하는 것이 좋습니다 .


문제는 이것이 좋은 아이디어인지의 여부입니다. 사용자가 메뉴를 변경하면 혼란스러워합니다.
MiMo

답변:


11

가장 쉬운 방법은 Mage_Catalog_Block_Navigation블록을 다시 작성하는 것입니다 .

=> 메소드 _renderCategoryMenuItemHtml()에서 루프를 교체하려는 경우

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

=> 이것으로 :

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

=> 및 마찬가지로 메소드 renderCategoriesMenuHtml()에서 코드를 바꿉니다.

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

=> 이것으로 :

    foreach ($this->getStoreCategories() as $child) {
        if ($child->getIsActive() && $this->_hasProducts($child->entity_id)) {
            $activeCategories[] = $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;
}

이 방법은 카탈로그 / 범주 모델을 사용하여 각 범주를 개별적으로 확인합니다. 따라서 범주가 많은 경우 성능 문제가 발생하지 않도록 코드를 다시 작성해야 할 수 있습니다. 우리가 운영하는 작은 상점에서는 이것이 잘 작동합니다.


로컬 폴더에 놓을 수있는 확장명으로이 상자를 넣을 수 있습니까? 향후 Magento 업데이트에서 코드를 덮어 쓰는 것에 대해 걱정했습니다.
MagentoMac

10

빈 범주를 숨기는 기본 제공 기능은 없습니다 (그러나 관리 영역-> 카탈로그-> 범주 관리에서 각 범주에 대해 활성 = 아니오)를 수동으로 선택할 수 있습니다)

다음은 Josh Prattski의 블로그에 실린 훌륭한 게시물에 대한 링크입니다. 여기 에서이 목적을위한 확장 방법을 단계별로 살펴 보았습니다 .


이것은 좋아 보이지만 어떤 이유로 든 우리 가게에서 작동하지 않습니다 ... 어떻게 디버깅하는 아이디어가 있습니까? 오류 메시지가 표시되지 않습니다. 티에 대한 지시를 따랐지만 프론트 엔드에는 변화가 없었습니다. 이미 컴파일러를 비활성화 한 다음 다시 활성화하고 캐시 등을 지 웠습니다.
MagentoMac

4

카탈로그 탐색에서 숨기려면 템플리트에 if 조건을 추가하여 해당 카테고리의 제품 양을 확인할 수 있습니다.


4

아마도 이것도 도움이 될 것입니다.

웹숍의 백엔드로 이동하십시오.

그런 다음에서 Catalog > Category > Manage Category카테고리를 선택하고 Display settings탭을 선택 하십시오.

라벨 Display Mode

Show static block only.


4

최상위 메뉴에서 빈 범주를 숨기려면 다음을 수행하십시오.

app/code/core/Mage/Catalog/Block폴더로 이동하여 복사하십시오 Navigation.php.

Navigation.php로컬 패키지를 재정의 하십시오. 여 Navigation.php 패키지의이 파일에 다음 코드를 붙여 넣습니다 :

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

그 파일의 어디에?
MarkE

3

나를 위해 일한 것은 템플릿 카테고리 트리를 만들고 카테고리 트리를 렌더링하는 조건 함수를 구현하는 것입니다.

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

다음 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/에서 찾을 수 있습니다.


2

빈 범주를 숨기려고 한 것은 Mage_Catalog_Model_Resource_Category_Tree load()기능 을 다시 작성하는 것입니다. 아래와 같이 카테고리 컬렉션으로 제품 컬렉션에 가입했습니다.

    $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()));

$arrNodes = $this->_conn->fetchAll($select);이 줄 앞에이 코드를 추가하십시오 .

그리고이 코드를이 조건으로 감싸십시오.이 클래스는 프론트 엔드 및 백엔드 모델에서도 호출됩니다.

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

실제 활성 제품 수를 포함하는 추가 product_count 필드를 추가했습니다.

타사 모듈을 사용하여 최상위 메뉴에 범주를 표시하고 메뉴가 렌더링 될 때 제품 수를 기준으로 조건을 설정했습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.