Cập nhật hàng loạt sản phẩm để bao gồm các trang web mới


16

Một khách hàng có hơn 20000 sản phẩm với 7 trang web. Họ từng có 4 trang web và hầu hết các sản phẩm được liên kết với 4 trang web. Cách tốt nhất và nhanh nhất để lặp qua các sản phẩm và cập nhật các sản phẩm để bao gồm các trang web mới là gì.

Tôi có đoạn mã sau tuy nhiên nó quá chậm:

$ productCollection = Mage :: getModel ('danh mục / sản phẩm') -> getCollection ()
    -> addFieldToFilter ('sku', mảng ('like' => '02% '));
foreach ($ productCollection as $ sản phẩm) {
    echo $ sản phẩm-> getSku ();
    $ sản phẩm-> setWebsiteIds (mảng (1,2,3,4,5,6,7));
    thử {
        $ sản phẩm-> lưu ();
        tiếng vang "- đã lưu.";
    } bắt (Ngoại lệ $ e) {
        echo '-'. $ e-> getMessage ();
    }
    tiếng vang "\ n";
}

Tôi đã nghĩ đến việc sử dụng phương pháp đi bộ lặp nhưng tôi hiểu rằng cửa hàng / trang web không chính xác là một thuộc tính nên không thể dễ dàng cập nhật.

Câu trả lời:


36

Bước 1
Xây dựng một mảng với id trang web mới của bạn.

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

Bước 2
Bây giờ nhận được tất cả các id sản phẩm.

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

Bước 3
Gán tất cả các sản phẩm cho các trang web mới:

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

Bước 4
Cảm thấy tốt về bản thân.


1
Cảm ơn bạn Marius. Câu trả lời hoàn hảo. (Tôi sẽ bỏ phiếu nhưng tôi chưa thể)
Raj

3
bước 5 tạo ý chính: gist.github.com/mauricioprado00/2b730532689d28dcdb2b . bạn có thể thực hiện "php -f shell / sản phẩm-website.php - - sản xuất tất cả - tất cả các trang web" hoặc chỉ định id trang web / sản phẩm.
vô dụng

wow ... đó là một giải pháp hiệu quả hoàn hảo đáng kinh ngạc. Ngay cả tôi cũng sẽ đi vòng quanh tất cả những sản phẩm đó để cập nhật chúng. Tôi muốn biết làm thế nào để tìm hiểu các khái niệm như vậy về Magento.
Deepanshu Goyalty

Trong thời trang Marius điển hình, làm việc như một nét duyên dáng!
sparecycl 14/03/2016

1
Các sản phẩm dường như không xuất hiện trong danh mục phẳng và không thể nhìn thấy trên frontend. Khi sử dụng phương thức - save (), các sản phẩm sẽ xuất hiện. Có ai biết tại sao phương pháp của Marius đưa ra vấn đề này không? M1.9, 4 trang web, sản phẩm 15k, danh mục phẳng
Tom

3

Nếu bạn chỉ muốn thêm các sản phẩm được gán cho cả 4 trang web hiện có trước đây, hãy sử dụng:

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

Xem thêm: Lọc sản phẩm theo trang web bằng AND

Đây có thể là tập lệnh thiết lập Magento hoặc tập lệnh PHP vứt đi (trong trường hợp này thêm include 'app/Mage.php';ở đầu và xóa nó khỏi máy chủ sau khi sử dụng)


1

Bước 1: Nhận tất cả Id trang web / tạo mảng Id trang web

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

Bước 2: Nhận tất cả Id sản phẩm

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

Bước 3: Thêm id trang web vào tất cả sản phẩm

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

Lưu ý: Nếu bạn muốn xóa trang web khỏi sản phẩm. sử dụng loại bỏ thay vì thêm từ

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

0

Một giải pháp khác nếu sự lười biếng của bạn đến mức không muốn tạo bất kỳ tệp PHP nào:

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

Đã làm cho tôi.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.