Productos de actualización masiva para incluir nuevos sitios web


16

Un cliente tiene más de 20000 productos con 7 sitios web. Solían tener 4 sitios web y la mayoría de los productos están asociados a 4 sitios web. ¿Cuál es la mejor y más rápida forma de recorrer los productos y actualizar los productos para incluir los nuevos sitios web?

Tengo el siguiente código, sin embargo, es demasiado lento:

$ productCollection = Mage :: getModel ('catálogo / producto') -> getCollection ()
    -> addFieldToFilter ('sku', array ('like' => '02% '));
foreach ($ productCollection como $ product) {
    echo $ producto-> getSku ();
    $ product-> setWebsiteIds (array (1,2,3,4,5,6,7));
    tratar {
        $ producto-> save ();
        echo "- guardado";
    } catch (Excepción $ e) {
        echo '-'. $ e-> getMessage ();
    }
    echo "\ n";
}

Estaba pensando en usar el método de iterador, pero entiendo que la tienda / sitio web no es exactamente un atributo, por lo que no se puede actualizar fácilmente por sí solo.

Respuestas:


36

Paso 1
Cree una matriz con los nuevos identificadores de su sitio web.

$websiteIds = array(5,6,7);

Paso 2
Ahora obtén todos los identificadores de producto.

$productIds= Mage::getResourceModel('catalog/product_collection')->getAllIds();

Paso 3
Asigne todos los productos a los nuevos sitios web:

Mage::getModel('catalog/product_website')->addProducts($websiteIds, $productIds);

Paso 4
Siéntete bien contigo mismo.


1
Gracias marius Respuesta perfecta. (Votaría pero todavía no puedo)
Raj

3
paso 5 crea una esencia: gist.github.com/mauricioprado00/2b730532689d28dcdb2b . puede hacer "php -f shell / product-website.php - --products all --websites all" o especificar sitios web / identificadores de productos.
inútil

wow ... esa es una solución eficiente increíblemente perfecta. Incluso iba a recorrer todos esos productos para actualizarlos. Quiero saber cómo aprender tales conceptos sobre Magento.
Deepanshu Goyal

¡Al estilo típico de Marius, funcionó a las mil maravillas!
reciclar

1
Los productos no parecen aparecer en el catálogo plano y no son visibles en la interfaz. Cuando se utiliza el método - save (), los productos aparecen. ¿Alguien sabe por qué el método de Marius da este problema? M1.9, 4 sitios web, productos de 15k, catálogo plano
Tom

3

Si solo desea agregar los productos asignados a los 4 sitios web existentes anteriormente, use esto:

$oldWebsiteIds = [2, 3, 4, 5];
$newWebsiteIds = [6, 7, 8]

/** @var Mage_Catalog_Model_Resource_Product_Collection $productCollection */
$productCollection = Mage::getResourceModel('catalog/product_collection');
$productCollection->addWebsiteFilter($oldWebsiteIds );
// only filter products present in ALL of the websites
$productCollection->getSelect()
    ->having('COUNT(website_id) = ?', count($oldWebsiteIds))
    ->distinct(false)
    ->group('e.entity_id');
$productIds = $productCollection->getAllIds();

Mage::getModel('catalog/product_website')->addProducts($newWebsiteIds, $productIds);

Consulte también: Filtrar productos por sitio web con AND

Puede ser un script de configuración de Magento o un script PHP desechable (en este caso, agréguelo include 'app/Mage.php';en la parte superior y elimínelo del servidor después del uso)


1

Paso 1: Obtenga todos los ID del sitio web / cree una matriz de ID del sitio

$websiteIds = Mage::getResourceModel('core/website_collection')->getAllIds();

Paso 2: Obtenga todos los ID de producto

$productIds= Mage::getResourceModel('catalog/product_collection')->getAllIds();

Paso 3: agregue identificadores de sitio web a todos los productos

$actionModel = Mage::getSingleton('catalog/product_action');
$actionModel->updateWebsites($productIds, $websiteIds, 'add');

Nota: si desea eliminar el sitio web del producto. use eliminar en lugar de agregar palabra

$actionModel->updateWebsites($productIds, $websiteIds, 'remove');

0

Otra solución si su pereza va al punto de no querer crear ningún archivo PHP:

INSERT IGNORE INTO catalog_product_website
SELECT entity_id, {website_id} FROM catalog_product_entity

Trabajó para mi.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.