Aquí hay un método que usé hace un tiempo:
// Products array
$productArray = array(
// Simple product
array(
'product_id' => 1,
'qty' => 1
),
// Configurable product
array(
'product_id' => 4,
'qty' => 1,
'options' => array(
'color' => 'Red'
)
)
);
// Prepare cart products
$cartProducts = array();
foreach ($productArray as $params) {
if (isset($params['product_id'])) {
// Load product
$product = Mage::getModel('catalog/product')->load($params['product_id']);
if ($product->getId()) {
// If product is configurable and the param options were specified
if ($product->getTypeId() == "configurable" && isset($params['options'])) {
// Get configurable options
$productAttributeOptions = $product->getTypeInstance(true)
->getConfigurableAttributesAsArray($product);
foreach ($productAttributeOptions as $productAttribute) {
$attributeCode = $productAttribute['attribute_code'];
if (isset($params['options'][$attributeCode])) {
$optionValue = $params['options'][$attributeCode];
foreach ($productAttribute['values'] as $attribute) {
if ($optionValue == $attribute['store_label']) {
$params['super_attribute'] = array(
$productAttribute['attribute_id'] => $attribute['value_index']
);
}
}
}
}
}
unset($params['options']);
$cartProducts[] = array(
'product' => $product,
'params' => $params
);
}
}
}
// Add to cart
$cart = Mage::getModel("checkout/cart");
if (!empty($cartProducts)) {
try{
foreach ($cartProducts as $cartProduct) {
$cart->addProduct($cartProduct['product'], $cartProduct['params']);
}
Mage::getSingleton('customer/session')->setCartWasUpdated(true);
$cart->save();
} catch(Exception $e) {
Mage::log($e->getMessage());
}
}
Es bastante sencillo y probado en este momento para estar funcionando.
He incluido 2 productos $productArray
, uno simple y otro configurable . Obviamente, podría agregar más y si el configurable tenía 2 opciones como tamaño y color , simplemente podría agregar el adicional en la matriz de opciones.