새로운 웹 사이트를 포함하는 대량 업데이트 제품


16

고객은 7 개의 웹 사이트를 가진 20000 개 이상의 제품을 보유하고 있습니다. 그들은 4 개의 웹 사이트를 가지고 있었으며 대부분의 제품은 4 개의 웹 사이트와 연관되어 있습니다. 제품을 반복하고 새 웹 사이트를 포함하도록 제품을 업데이트하는 가장 좋은 방법은 무엇입니까?

다음 코드가 있지만 너무 느립니다.

$ productCollection = 마법사 :: getModel ( '카탈로그 / 제품')-> getCollection ()
    -> addFieldToFilter ( 'sku', 배열 ( 'like'=> '02 % '));
foreach ($ productCollection as $ product) {
    echo $ product-> getSku ();
    $ product-> setWebsiteIds (배열 (1,2,3,4,5,6,7));
    {
        $ product-> save ();
        에코 "-저장되었습니다.";
    } catch (예외 $ e) {
        echo '-'. $ e-> getMessage ();
    }
    에코 "\ n";
}

반복자 도보 방법을 사용하려고 생각했지만 상점 / 웹 사이트가 정확히 속성이 아니기 때문에 자체적으로 쉽게 업데이트 할 수 없음을 이해합니다.

답변:


36

1 단계
새 웹 사이트 ID로 배열을 만듭니다.

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

2 단계
이제 모든 제품 ID를 얻습니다.

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

3 단계
모든 제품을 새 웹 사이트에 할당하십시오.

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

4 단계
자신에 대해 기분이 좋습니다.


1
마리우스 감사합니다. 완벽한 답변. (나는 투표하지만 아직 할 수 없다)
Raj

3
5 단계 gist.github.com/mauricioprado00/2b730532689d28dcdb2b를 생성합니다 . "php -f shell / product-website.php---products all --websites all"을 수행하거나 웹 사이트 / 제품 ID를 지정할 수 있습니다.
쓸모없는

와우 ... 그것은 놀랍도록 완벽한 효율적인 솔루션입니다. 심지어 많은 제품을 업데이트하여 업데이트하려고했습니다. Magento에 대한 이러한 개념을 배우는 방법을 알고 싶습니다.
Deepanshu Goyal

전형적인 마리우스 패션에서 매력처럼 일했습니다!
스페어 사이클

1
제품이 플랫 카탈로그에 나타나지 않는 것처럼 보이며 프런트 엔드에는 보이지 않습니다. -save () 메소드를 사용하면 제품이 나타납니다. Marius의 방법이 왜이 문제를 일으키는 지 아는 사람이 있습니까? M1.9, 4 웹 사이트, 15k 제품, 플랫 카탈로그
Tom

3

기존의 4 개 웹 사이트 모두에 지정된 제품 만 추가 하려면 다음을 사용하십시오.

$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를 사용하여 웹 사이트에서

Magento 설정 스크립트 또는 버리기 PHP 스크립트 일 수 있습니다 (이 경우 include 'app/Mage.php';맨 위에 추가 하고 사용 후 서버에서 제거)


1

1 단계 : 모든 웹 사이트 ID 가져 오기 / 웹 사이트 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');

참고 : 제품에서 웹 사이트를 제거하려는 경우. 사용 삭제 하는 대신 추가 단어를

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

0

게으름이 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.