与 Alans 的回答非常相似,可能循环少了一点:
$rootCategory = Mage::getModel('catalog/category')
->load(Mage::app()->getStore()->getRootCategoryId());
$sameStoreCategories = Mage::getResourceModel('catalog/category_collection')
->addIdFilter($product->getCategoryIds())
->addFieldToFilter('path', array('like' => $rootCategory->getPath() . '/%'))
->getItems();
var_dump(array_keys($sameStoreCategories));
这将始终有效。丑陋的事情是您仍然需要加载类别。
如果启用了平面类别表,则可以使用以下变体:
$sameStoreCategories = Mage::getResourceModel('catalog/category_flat_collection')
->addIdFilter($product->getCategoryIds())
->getItems();
var_dump(array_keys($sameStoreCategories));
为什么它有效?因为平面表是按商店索引的,而每个平面表只包含与该商店组根类别相关联的类别实体记录。
因此,即使您按与产品关联的所有类别 ID 进行过滤,该集合也将仅包含当前商店中存在的类别。