\ Mage_ConfigurableSwatches_Model_Resource_Catalog_Product_Attribute_Super_Collection :: _ loadOptionLabelsを次のようにオーバーライドするモジュールを作成しました。
protected function _loadOptionLabels()
{
if ($this->count()) {
$attributeIds = array();
$productId = false;
$filterLabels = false;
foreach ($this->_items as $item) {
$attributeIds[] = $item->getAttributeId();
$id = $item->getProductId();
$productId[$id] = $id;
}
if (is_array($productId) && $attributeIds) {
$filterLabels = true;
}
if ($filterLabels) {
$productIntTable = 'catalog_product_entity_int';
$select = $this->getConnection()->select()
->from(array('l' => $this->getTable('catalog/product_super_link')), array('i.value'))
->join(
array('i' => Mage::getSingleton('core/resource')->getTableName($productIntTable)),
'i.entity_id = l.product_id'
)
->where('l.parent_id IN (?)', array_keys($productId))
->where('i.attribute_id IN (?)', $attributeIds);
$optionIdsToSelect = $this->getConnection()->fetchCol($select);
}
$select = $this->getConnection()->select()
->from(
array('attr' => $this->getTable('catalog/product_super_attribute')),
array(
'product_super_attribute_id' => 'attr.product_super_attribute_id',
)
)
->join(
array('opt' => $this->getTable('eav/attribute_option')),
'opt.attribute_id = attr.attribute_id',
array(
'attribute_id' => 'opt.attribute_id',
'option_id' => 'opt.option_id',
)
)
->join(
array('lab' => $this->getTable('eav/attribute_option_value')),
'lab.option_id = opt.option_id',
array(
'label' => 'lab.value',
'store_id' => 'lab.store_id',
)
)
->where('attr.product_super_attribute_id IN (?)', array_keys($this->_items));
if ($filterLabels) {
$select->where('opt.option_id IN (?)', $optionIdsToSelect);
}
$result = $this->getConnection()->fetchAll($select);
Mage::getSingleton('core/resource_iterator')->walk(
$select,
array(function($args){
$data = $args['row'];
$item = $this->getItemById($data['product_super_attribute_id']);
if (!is_array($labels = $item->getOptionLabels())) {
$labels = array();
}
$labels[$data['option_id']][$data['store_id']] = $data['label'];
$item->setOptionLabels($labels);
})
);
}
return $this;
}
クエリをフィルター処理し、foreachをイテレーターに置き換えました。
今では、製品あたりのレコード数が24.40から23.000になりました。:)
また、このモジュールは、製品リストに何も表示する設定がない場合に、製品リストに不要な呼び出しを行います。たぶん、configswatches / general / product_list_attributeにロードする属性があるかどうかを確認するには、Mage_ConfigurableSwatches_Model_Observer :: productListCollectionLoadAfterの書き換えが必要です。