Исключать категорию при отображении коллекции продуктов


Я показываю самые популярные товары и хочу иметь возможность исключить некоторые товары из показа.

Я подумал, что лучшим способом было бы исключить категорию, и когда я хочу исключить продукт, я могу поместить его в категорию исключения.

Мне нужно, чтобы это работало, даже если продукт относится к другой категории.

Я показываю самые популярные продукты с этим:

$storeId2 = Mage::app()->getStore()->getId();
    $products2 = Mage::getResourceModel('reports/product_collection')
        ->addOrderedQty()
        ->addAttributeToSelect('*')
        ->addAttributeToSelect(array('name', 'price', 'small_image'))
        ->setStoreId($storeId2)
        ->addStoreFilter($storeId2)
        ->setOrder('ordered_qty', 'desc'); 

Mage::getSingleton('catalog/product_status')->addVisibleFilterToCollection($products2);         
Mage::getSingleton('catalog/product_visibility')->addVisibleInCatalogFilterToCollection($products2);

$x = 1;
    foreach($products2 as $prod2){
        $inventory2 = Mage::getModel('cataloginventory/stock_item')->loadByProduct($prod2);
        $actual_stock3 = (int)$inventory2->getQty();

    if ($actual_stock3<1){
    echo $prod2->getName() . ' - ' . $actual_stock3 . ' - ' . number_format($prod2->getData('ordered_qty'), 0) . '</br>';   
    if ($x++ == 10) break;  
    }
    }

Как мне исключить все продукты, скажем, в категории 151, даже если продукт находится в другой категории?

Author: Fabian Schmengler, 2016-07-27

1 answers

Вы можете присоединиться к таблице catalog_category_product, чтобы сопоставить товары в вашей "категории исключения", а затем отфильтровать свою коллекцию, чтобы возвращать только товары с без совпадений в объединенной таблице:

Это должно сработать, учитывая категорию "исключить" как $excludeId:

$products2->joinTable(
    ['exclude_category' => 'catalog/category_product'],
    'product_id=entity_id',
    ['category_id'],
    ['category_id' => $excludeId],
    'left'
);
$products2->getSelect()->where(new Zend_Db_Expr('exclude_category.category_id IS NULL'));

Обновление

Я вижу, вы уже присоединяетесь к индексу категории с помощью addVisibleInCatalogFilterToCollection(), что приводит к дублированию столбца "category_id". Я обновил код, чтобы использовать псевдоним для объединенной таблицы, exclude_category.

 7
Author: Fabian Schmengler, 2016-07-27 09:51:54