Você pode gravar um observador catalog_product_collection_load_after
e adicionar produtos à coleção carregada se a coleção for a coleção de produtos relacionados :
use Mage_Catalog_Model_Product as Product;
use Mage_Catalog_Model_Product_Link as RelatedProduct;
use Mage_Catalog_Model_Resource_Product_Link_Product_Collection as RelatedProductCollection;
class IntegerNet_AutoRelated_Model_Observer
{
/**
* @see event catalog_product_collection_load_after
* @param Varien_Event_Observer $observer
* @throws Mage_Core_Exception
*/
public function addToRelatedCollection(Varien_Event_Observer $observer)
{
$collection = $observer->getCollection();
if ($collection instanceof RelatedProductCollection
&& $collection->getLinkModel()->getLinkTypeId() === RelatedProduct::LINK_TYPE_RELATED
) {
$this->addItems($collection);
}
}
protected function addItems(RelatedProductCollection $collection)
{
/** @var Mage_Catalog_Model_Resource_Product_Collection $productsToAdd */
$productsToAdd = Mage::getResourceModel('catalog/product_collection');
$productsToAdd
->addStoreFilter()
->addIdFilter(array_diff([1,5,7,3], [$collection->getProduct()->getId()], $collection->getAllIds()))
->setVisibility(Mage::getSingleton('catalog/product_visibility')->getVisibleInCatalogIds());
->addMinimalPrice()
->addFinalPrice()
->addTaxPercents()
->setPageSize($numberOfItems)
->addAttributeToSelect(Mage::getSingleton('catalog/config')->getProductAttributes())
->addUrlRewrite();
foreach ($productsToAdd as $product) {
$collection->addItem($product);
}
}
}
Algumas partes que eu gostaria de destacar:
->addIdFilter(array_diff([1,5,7,3], [$collection->getProduct()->getId()], $collection->getAllIds()))
Isso carrega os produtos, [1,5,7,3]
mas exclui o próprio produto e os produtos que já estão definidos manualmente como produtos relacionados. Caso contrário, obteríamos um erro devido a duplicatas na coleção. Você provavelmente deseja mover esses IDs codificados para uma configuração.
->addMinimalPrice()
->addFinalPrice()
->addTaxPercents()
->addAttributeToSelect(Mage::getSingleton('catalog/config')->getProductAttributes())
->addUrlRewrite();
Isso prepara a coleção de produtos para carregar os dados necessários para exibir preços, o link do produto e quaisquer atributos configurados como "usados na lista de produtos", mas não mais.
Esta é uma solução muito semelhante à do meu módulo AutoUpsell descrito em Obter lista de produtos por ID de categoria em view.phtml , copiei a maior parte do código de lá com pequenas modificações.
Crie um novo arquivo
\app\code\local\Mage\Catalog\Block\Product\List\Related.php
e procure o método e substitua pelo código abaixo:fonte
$ids = array_merge([1,3,5,7], $product->getRelatedProductCollection()->getAllIds());
seguido por uma única carga com #addIdFilter($ids)
foreach ($this->_itemCollection
, duas consultas para IDs:array_merge($productscoll1->getAllIds(), $productscoll2->getAllIds());
, segunda carga:$this->_itemCollection->load();
. Com a minha sugestão acima, você iria reduzir pela metade que para uma consulta ID e uma carga coleção