Reindex sản phẩm duy nhất


10

Tôi muốn reindex một sản phẩm sau khi cập nhật.

Bây giờ tôi sử dụng:

$product = Mage::getModel('catalog/product')->loadByAttribute('sku', 'foobar');
// edit something
$product->save();

$stockItem = Mage::getModel('cataloginventory/stock_item')->loadByProduct($product->getId());
$stockItem->setForceReindexRequired(true);

Mage::getSingleton('index/indexer')->processEntityAction(
    $stockItem,
    Mage_CatalogInventory_Model_Stock_Item::ENTITY,
    Mage_Index_Model_Event::TYPE_SAVE
);

$product
    ->setForceReindexRequired(true)
    ->setIsChangedCategories(true);

Mage::getSingleton('index/indexer')->processEntityAction(
    $product,
    Mage_Catalog_Model_Product::ENTITY,
    Mage_Index_Model_Event::TYPE_SAVE
);

Nhưng điều này không làm việc, bất kỳ ý tưởng?

PS: $product->getId()hiện có và chính xác.

Câu trả lời:


10

Điều này hoạt động tốt trong Magento CE 1.6 và mới hơn:

$event = Mage::getSingleton('index/indexer')->logEvent(
    $product,
    $product->getResource()->getType(),
    Mage_Index_Model_Event::TYPE_SAVE,
    false
);
Mage::getSingleton('index/indexer')
    ->getProcessByCode('catalog_url') // Adjust the indexer process code as needed
    ->setMode(Mage_Index_Model_Process::MODE_REAL_TIME)
    ->processEvent($event);

Các mã chỉ mục có sẵn có thể được xem bằng truy vấn:

SELECT indexer_code FROM index_process;

Trong một Magento 1.7 bản địa có:

+---------------------------+
| indexer_code              |
+---------------------------+
| cataloginventory_stock    |
| catalogsearch_fulltext    |
| catalog_category_flat     |
| catalog_category_product  |
| catalog_product_attribute |
| catalog_product_flat      |
| catalog_product_price     |
| catalog_url               |
| groupscatalog2_category   |
| groupscatalog2_product    |
| tag_summary               |
+---------------------------+

Trong Magento EE 1.13 thì khác, ở đó bộ chỉ mục sẽ tự động chọn các thực thể đã thay đổi trên mỗi lần chạy cron (mỗi phút).

CẬP NHẬT

Câu trả lời trên là chính xác 100% dù sao tôi nghĩ rằng thông tin dưới đây có thể thêm một cái gì đó nhiều hơn.

  • Nếu bạn cần thay đổi chỉ một vài giá trị thuộc tính trong sản phẩm và tự động cập nhật bảng chỉ mục tương đối, bạn có thể sử dụng chức năng này: Mage::getSingleton('catalog/product_action')->updateAttributes();

  • thay vào đó, nếu bạn muốn quản lý reindex, hãy sử dụng mô hình thay thế: Mage::getResourceSingleton('catalog/product_action')->updateAttributes();

Ví dụ: tôi sử dụng chức năng sau để cập nhật nhanh chỉ các thuộc tính nhất định trong sản phẩm.

 public function updateProductAttribute($product_id, $arrayChanges, $reindex = true)
{
    if (!is_array($product_id)) {
        $product_id = array($product_id);
    }

    // ths should trigger all required reindex
    $update = Mage::getSingleton('catalog/product_action');
    // Update value
    if (!$reindex) {
        $update = Mage::getResourceSingleton('catalog/product_action');
    }

    $update->updateAttributes($product_id, $arrayChanges, 0);
}

Ghi chú:

Nếu bạn cần thay đổi cặp thuộc tính / giá trị tương tự trong một nhóm sản phẩm, bạn có thể vượt qua toàn bộ mảngproduct_ids


Tôi sẽ sao chép bình luận của user5973 ở đây, vì nó sẽ bị xóa. @Vinai bạn đang nói rằng EE 1.13+ không có vấn đề về hiệu suất này khi giới thiệu lại dữ liệu liên quan đến sản phẩm? Chúng ta có thể xác nhận rằng trình lập chỉ mục EE tự động chọn các thực thể đã thay đổi và chỉ xử lý các thực thể đó?
Fabian Blechschmidt

Trong EE 1.13, người lập chỉ mục sử dụng trình kích hoạt MySQL để nhận bất kỳ thay đổi nào ở cấp độ DB và ghi lại ID thực thể được cập nhật trong bảng thay đổi. Những thay đổi này sau đó được xử lý thông qua cronjobs.
Vinai

2

Tôi đoán bạn có nghĩa là bạn muốn reindex một sản phẩm sau khi bạn chỉnh sửa nó trong quản trị ui. Phương pháp đơn giản nhất là chỉ đặt chế độ lập chỉ mục thành "cập nhật khi lưu". Bạn sẽ phải làm điều này cho tất cả các bộ chỉ mục liên quan đến các sản phẩm bạn đang sử dụng, có thể bao gồm: Thuộc tính sản phẩm, Giá sản phẩm, Dữ liệu phẳng sản phẩm, Sản phẩm danh mục, Trạng thái chứng khoán.

Điều này có thể sẽ làm chậm tiết kiệm sản phẩm mặc dù.

Hoặc có lẽ liên kết này sẽ giúp. Xin vui lòng xem các ý kiến ​​cũng như họ mô tả làm thế nào để cập nhật chứng khoán là tốt. http: //www.magentoc Commerce.com/answers/discussion/239/reindex-one-product-at-a-time/p1


2

Hãy chắc chắn rằng bạn không làm điều này trên frontend cũng như nâng cấp tập lệnh và cửa hàng hiện đang tải là "admin". Nếu không, $ sản phẩm-> save () hoàn toàn không hoạt động. Kiểm tra đầu tiên, rằng tiết kiệm một sản phẩm có hiệu lực.


2

Bên cạnh câu trả lời của @ feversocial cũng đảm bảo rằng bạn có mọi thứ cần thiết để được tải trên sản phẩm trước khi gọi $ sản phẩm-> save (). Nếu không, việc tiết kiệm thực sự có thể loại bỏ những thứ khỏi sản phẩm mà tôi đã trải qua một cách khó khăn.

Giống như lưu sản phẩm mà không cần SKU, sau đó phá vỡ tất cả các url viết lại và làm cho toàn bộ trang web chuyển hướng đến trang sản phẩm này: S: P


Điểm hay, đó là lý do tại sao tôi nghĩ nên sử dụng catolog/product_actionphương pháp tốt hơn để bạn không gặp phải vấn đề trên
Fra

1

Tôi những thông tin này có thể hữu ích để hiểu toàn bộ kịch bản tốt hơn một chút.

  • Nếu bạn chỉ cần thay đổi một giá trị thuộc tính và tự động cập nhật bảng chỉ mục tương đối, bạn có thể sử dụng chức năng này: Mage::getSingleton('catalog/product_action')->updateAttributes();

  • thay vào đó, nếu bạn muốn quản lý reindex, hãy sử dụng mô hình thay thế: Mage::getResourceSingleton('catalog/product_action')->updateAttributes();

Ví dụ: tôi sử dụng chức năng sau để cập nhật nhanh chỉ các thuộc tính nhất định trong sản phẩm.

public function updateProductAttribute($product_id, $arrayChanges, $reindex = true)
{
    if (!is_array($product_id)) {
        $product_id = array($product_id);
    }

    // ths should trigger all required reindex
    $update = Mage::getSingleton('catalog/product_action');
    // Update value
    if (!$reindex) {
        $update = Mage::getResourceSingleton('catalog/product_action');
    }

    $update->updateAttributes($product_id, $arrayChanges, 0);
}
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.