製品を一括更新して新しいWebサイトを含める


16

クライアントには、7つのWebサイトを持つ20000以上の製品があります。以前は4つのWebサイトがあり、ほとんどの製品は4つのWebサイトに関連付けられていました。製品を反復処理し、製品を更新して新しいWebサイトを含めるための最良かつ最速の方法は何ですか。

私は次のコードを持っていますが、非常に遅いです:

$ productCollection = Mage :: getModel( 'catalog / product')-> getCollection()
    -> addFieldToFilter( 'sku'、array( 'like' => '02% '));
foreach($ productとしての$ productCollection){
    echo $ product-> getSku();
    $ product-> setWebsiteIds(array(1,2,3,4,5,6,7));
    {
        $ product-> save();
        echo "-saved。";
    } catch(例外$ e){
        echo '-'。$ e-> getMessage();
    }
    echo "\ n";
}

イテレータウォークメソッドを使用することを考えていましたが、ストア/ウェブサイトは属性ではないため、簡単に更新することはできません。

回答:


36

ステップ1
新しいWebサイトIDでアレイを構築します。

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

ステップ2
すべての製品IDを取得します。

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

ステップ3
すべての製品を新しいWebサイトに割り当てます。

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

ステップ4
自分自身について気分を良くする。


1
ありがとうマリウス。完璧な答え。(私は投票するが、私はまだできません)
ラジ

3
ステップ5は、その要旨を作成しますgist.github.com/mauricioprado00/2b730532689d28dcdb2bを。「php -f shell / product-website.php---products all --websites all」を実行するか、Webサイト/製品IDを指定します。
役に立たない

うわー、それは驚くほど完璧な効率的なソリューションです。私も、それらの多くの製品すべてをループして更新していました。Magentoについてのこのような概念を学ぶ方法を知りたいです。
ディーパンシュゴイアル

典型的なマリウスのファッションでは、魅力のように働いた!
スペアサイクル

1
製品はフラットカタログには表示されないようで、フロントエンドには表示されません。-save()メソッドを使用すると、製品が表示されます。マリウスの方法がこの問題を引き起こす理由を誰もが知っていますか?M1.9、4つのウェブサイト、15K製品、フラットカタログ
トム・

3

4つの既存のWebサイトすべてに割り当てられている製品のみを追加する場合は、これを使用します。

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

関連項目: ANDを使用してWebサイトで製品をフィルタリングする

これは、Magentoセットアップスクリプトまたは使い捨てのPHPスクリプトです(この場合include 'app/Mage.php';、先頭に追加し、使用後にサーバーから削除します)。


1

ステップ1:すべてのWebサイトIDを取得する/ WebサイトIDの配列を作成する

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

ステップ2:すべての製品IDを取得する

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

ステップ3:ウェブサイトIDをすべての製品に追加する

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

注:製品からWebサイトを削除する場合。代わりremoveを使用して単語を追加します

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

0

あなたの怠lazがPHPファイルを作成したくないというポイントに行く場合の別の解決策:

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

私のために働いた。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.