有効な商品がないカテゴリを非表示にします


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.