アランの答えにかなり似ていますが、ループが少し少ないかもしれません:
$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 でフィルタリングしている場合でも、コレクションには現在のストアに存在するカテゴリのみが含まれます。