Produits de mise à jour en masse pour inclure de nouveaux sites Web

16

Un client possède plus de 20000 produits avec 7 sites Web. Ils avaient auparavant 4 sites Web et la plupart des produits sont associés à 4 sites Web. Quelle est la manière la meilleure et la plus rapide de parcourir les produits et de mettre à jour les produits pour inclure les nouveaux sites Web.

J'ai le code suivant mais il est beaucoup trop lent:

$ productCollection = Mage :: getModel ('catalogue / produit') -> getCollection ()
    -> addFieldToFilter ('sku', array ('like' => '02% '));
foreach ($ productCollection as $ product) {
    echo $ product-> getSku ();
    $ product-> setWebsiteIds (array (1,2,3,4,5,6,7));
    essayez {
        $ product-> save ();
        echo "- enregistré.";
    } catch (Exception $ e) {
        echo '-'. $ e-> getMessage ();
    }
    echo "\ n";
}

Je pensais utiliser la méthode de marche itérative, mais je comprends que le magasin / site Web n'est pas exactement un attribut, il ne peut donc pas être facilement mis à jour seul.

Raj
la source

Réponses:

36

Étape 1
Créez un tableau avec vos nouveaux identifiants de site Web.

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

Étape 2
Obtenez maintenant tous les ID de produit.

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

Étape 3
Attribuez tous les produits aux nouveaux sites Web:

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

Étape 4
Sentez-vous bien dans votre peau.

Marius
la source
1
Merci Marius. Réponse parfaite. (Je voterais mais je ne peux pas encore)
Raj
3
étape 5, créez un résumé : gist.github.com/mauricioprado00/2b730532689d28dcdb2b . vous pouvez faire "php -f shell / product-website.php - --products all --websites all" ou spécifier des identifiants de sites Web / produits.
inutile
wow ... c'est une solution efficace incroyablement parfaite. Même j'allais faire le tour de tous ces nombreux produits pour les mettre à jour. Je veux savoir comment apprendre de tels concepts sur Magento.
Deepanshu Goyal
À la mode typique de Marius, travaillé comme un charme!
sparecycle
1
Les produits ne semblent pas apparaître dans le catalogue plat et ne sont pas visibles sur le frontend. Lorsque vous utilisez la méthode - save (), les produits apparaissent. Est-ce que quelqu'un sait pourquoi la méthode de Marius pose ce problème? M1.9, 4 sites Web, produits 15k, catalogue plat
Tom
3

Si vous souhaitez uniquement ajouter les produits affectés à tous les 4 sites existants précédemment, utilisez ceci:

$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);

Voir aussi: Filtrer les produits par site Web à l'aide de AND

Cela peut être un script de configuration Magento ou un script PHP jetable (dans ce cas, ajoutez include 'app/Mage.php';en haut et supprimez-le du serveur après utilisation)

Fabian Schmengler
la source
1

Étape 1: obtenir tous les ID de site Web / créer un tableau d'ID de site Web

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

Étape 2: obtenir tous les ID de produit

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

Étape 3: ajouter des identifiants de site Web à tous les produits

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

Remarque: Si vous souhaitez supprimer le site Web du produit. utiliser supprimer à la place ajouter un mot

$actionModel->updateWebsites($productIds, $websiteIds, 'remove');
Kailas
la source
0

Une autre solution si votre paresse va au point de ne plus vouloir créer de fichiers PHP:

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

A travaillé pour moi.

Shadowbob
la source