Magento: asignando productos a todos los websites

Magento logo¡Hola de nuevo! Cada loco con su tema, así que yo sigo escudriñando cada día más las entrañas de Magento. Mientras voy compartiendo mis pequeños pinitos en el tema. Ahora traigo un pequeño HOWTO, un pequeño tutorial para recorrer los websites, stores y store views que tengamos en nuestro Magento.

Dentro de un Magento podemos tener varios sitios web, cada uno con su nombre de dominio. A su vez, dentro de cada website podemos tener varias tiendas, con su catálogo raíz de productos. Y a su vez también podemos tener dentro de cada tienda sus vistas de tienda, que normalmente se usan para traducir dichas tiendas.

Es decir, dentro de un mismo Magento, con un mismo panel de control, podemos tener varios dominios con distintos productos, distintas plantillas, distintas configuraciones, etcétera. Es algo que nunca había visto en ningún CMS y llevarlo hasta el extremo de que cada website, store o store view puede tener muchas de sus configuraciones independientes. Lo que quiero decir es que Magento es muy flexible lo mires por donde lo mires. Poder tener todos los productos, las ventas, centralizado en un mismo panel de control es muy práctico.

Ahora bien, ¿qué pasa si tienes un sitio web con miles de productos y decides añadir un segundo sitio web con otro dominio con los mismos productos? Das de alta el website, una store, y comienzas creando una vista de tienda para el primer idioma, en este segundo website. Entonces si quieres que todos los productos se vean en este segundo website puedes entrar manualmente a los miles de productos y uno a uno los asignas al segundo website.

No es muy práctico, así que mejor que un programador recorra todos los productos con un sencillo script y los asigne a todos los websites.

Recorriendo los websites

Vamos con el código:

<?php 

require_once __DIR__.'/app/Mage.php';

// a veces hace falta instanciar la app..
Mage::app();

$nline = "\n"; 

// obtenemos los websites
$websites = Mage::app()->getWebsites(); 

// ordenamos los ids de los websites en un array
$websiteIds = array(); 
foreach ($websites as $website) { 
    array_push($websiteIds, $website->getId()); 
    
    // mostrando algo de información sobre cada website..
    $stores = $website->getStores(); 
    $nstores = count($stores); 
    
    echo 'Website ID '.$website->getId().': '.$website->getName().', ' .$nstores.' stores ('; 
    
    $cont = 0; 
    foreach ($stores as $store) { 
        ++$cont; 
        echo $store->getName(); 
        if ($cont != $nstores) { 
            echo ','; 
        } 
    } 
    echo ')'.$nline; 
}

var_dump(sort($websiteIds));

Asignando un producto a varios websites

Ya tenemos del anterior script todos los códigos de website, ahora falta ver cómo asignarlos a un producto:

$product->setWebsiteIds($websiteIds);
$product->save();

Siguiendo el ejemplo anterior, si lo que queremos es recorrer todos los productos y asignarlos masivamente a todos los websites o a unos ciertos websites nos puede servir como base el código del post anterior recorriendo los productos pero adaptado para asignar los $websiteIds masivamente:

$productModel = Mage::getModel('catalog/product'); 
$productsCollection = $productModel->getCollection();
foreach ($productsCollection as $product) { 
    $product->setWebsiteIds($websiteIds); 
    $product->save(); 
    echo 'Producto ID '.$product->getId().' asignado!'.$nline;
}

He simplificado mucho el código, ya cada uno que se lo adapte para lo que necesite 😉 Lo ideal sería recorrer todos los productos, comprobar si dichos productos necesitan ser reasignados. Si ya están asignados o si el script se ha quedado a medias, podemos ejecutarlo de nuevo con lo que nos ahorraremos el volver a asignar los productos que ya estén asignados. Así sucesivamente podemos mejorarlo para que el script vaya más rápido si es que tenemos muchos productos que asignar o lo vamos a ejecutar poco a poco.

Espero que sirva.

Un saludo.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *