¿Cómo funciona el orden de los productos en las subcategorías?
Pregunta
Al agregar un producto a una categoría, se puede especificar un valor de orden de clasificación.
Imágenes ahora tenemos una categoría "P" establecida en "Anchor" y varias categorías "C1" y "C2" que son niños de "P".
¿Cómo se define el orden de esos productos, que solo están en las subcategorías, pero se muestran al abrir la categoría principal?
Solución
Echa un vistazo a Mage_Catalog_Model_Resource_Category_Indexer_Product::_refreshAnchorRelations
Especialmente estas líneas:
$position = 'MIN('.
$adapter->getCheckSql(
'cp.category_id = ce.entity_id',
'cp.position',
'(cc.position + 1) * ('.$adapter->quoteIdentifier('cc.level').' + 1) * 10000 + cp.position'
)
.')';
cc
y ce
son lo mismo catalog_category_entity
mesa y cp
es catalog_category_product
mesa.
Un producto puede estar en más de una categorías de niños, por lo que la posición del producto es un mínimo entre múltiples valores.
Entonces, básicamente, la posición del producto en la categoría principal es el mínimo entre las posiciones en relación con cada categorías de la tabla catalog_category_product
Siguiendo esta fórmula:
(child category position + 1) * (child category level + 1) * 10000 + ( product position in catalog_category_product + 1)
EDITAR
Conclusión: los productos en una categoría con una posición más alta en el árbol se mostrarán antes de los siguientes.
Otros consejos
Como sugirieron Marius y Andreas, tienes que reescribir el Mage_Catalog_Model_Resource_Category_Indexer_Product
clase para cambiar el emprendimiento de _refreshAnchorRelations
y reindexAll
.
Para _refreshAnchorRelations
Tienes por defecto
'(cc.position + 1) * ('.$adapter->quoteIdentifier('cc.level').' + 1) * 10000 + cp.position'
Cambiarlo para
'cp.position + 10000'
Para reindexAll
Tienes por defecto
'('.$idxAdapter->quoteIdentifier('ce.position').' + 1) * '
.'('.$idxAdapter->quoteIdentifier('ce.level').' + 1 * 10000)'
.' + '.$idxAdapter->quoteIdentifier('cp.position')
Cambiarlo para
'('.$idxAdapter->quoteIdentifier('cp.position').' + 10000)'
Por lo tanto, solo tomará la posición mínima del producto. Yo he añadido + 10000
Porque algunos de nuestros clientes entran en una posición negativa.